在flutter中访问来电的电话号码

San*_*ngh 6 java android dart flutter

我们如何才能像 Truecaller 那样在 flutter 中访问来电的电话号码。

我在网上引用了这个查询,发现 flutter 目前不支持该功能。这是真的还是有某种方法可以访问来电的电话号码?

Ant*_*REL 11

您必须通过平台渠道来实现它:

\n

安卓

\n

添加到文件android/app/src/main/AndroidManifest.xml

\n
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>\n<receiver android:name=".ServiceReceiver" >\n<intent-filter>\n    <action android:name="android.intent.action.PHONE_STATE" />\n</intent-filter>\n
Run Code Online (Sandbox Code Playgroud)\n

创建文件android/app/src/main/java/{your_package}/ServiceReceiver.java

\n
public class ServiceReceiver extends BroadcastReceiver {\n\n@Override\npublic void onReceive(final Context context, Intent intent) {\n    TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);\n    telephony.listen(new PhoneStateListener(){\n        @Override\n        public void onCallStateChanged(int state, String incomingNumber) {\n            super.onCallStateChanged(state, incomingNumber);\n            System.out.println("incomingNumber : "+incomingNumber);\n        }\n    },PhoneStateListener.LISTEN_CALL_STATE);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

IPhone

\n
\n

要提供有关来电呼叫者的识别信息,请在 beginRequest(with:) 的实现中使用 addIdentificationEntry(withNextSequentialPhoneNumber:label:) 方法。

\n
\n
class CustomCallDirectoryProvider: CXCallDirectoryProvider {\n    override func beginRequest(with context: CXCallDirectoryExtensionContext) {\n        let labelsKeyedByPhoneNumber: [CXCallDirectoryPhoneNumber: String] = [ \xe2\x80\xa6 ]\n        for (phoneNumber, label) in labelsKeyedByPhoneNumber.sorted(by: <) {\n            context.addIdentificationEntry(withNextSequentialPhoneNumber: phoneNumber, label: label)        \n        }\n\n        context.completeRequest()\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

现在是坏消息:对于 Iphone,据我所知(2021 年),如果传入的电话号码不是用户的联系人或社交网络的一部分,那么开发者应用程序将无法访问该号码,这可以说是值得的。改变。

\n

也许您可以执行类似后台进程之类的操作,在接到电话时进行屏幕截图,然后处理图像以提取电话号码。但我对 IOS 的经验很少,所以我什至不知道苹果是否允许这样做。无论如何,祝你好运,如果你成功了,请毫不犹豫地发布一个包,这绝对是一个很棒的包!

\n

最后,您必须通过Pigeon实现类型安全平台通道:

\n
import \'generated_pigeon.dart\'\n\nvoid onClick() async {\n  SearchRequest request = SearchRequest()..query = \'test\';\n  Api api = Api();\n  SearchReply reply = await api.search(request);\n  print(\'reply: ${reply.result}\');\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

使用 Pigeon 无需在主机和客户端之间匹配消息名称和数据类型的字符串。它支持:嵌套类、将消息分组到 API、生成异步包装器代码以及在任一方向发送消息。生成的代码是可读的,并且保证不同版本的多个客户端之间不会发生冲突。支持的语言包括 Objective-C、Java、Kotlin 和 Swift(通过 Objective-C 互操作)。

\n
\n