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

时间:2021-02-09 02:54:24

标签: java android flutter dart

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

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

1 个答案:

答案 0 :(得分:3)

您必须通过 platform channel 实现它:

Android

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

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<receiver android:name=".ServiceReceiver" >
<intent-filter>
    <action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>

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

public class ServiceReceiver extends BroadcastReceiver {

@Override
public void onReceive(final Context context, Intent intent) {
    TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
    telephony.listen(new PhoneStateListener(){
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            System.out.println("incomingNumber : "+incomingNumber);
        }
    },PhoneStateListener.LISTEN_CALL_STATE);
}

Iphone

<块引用>

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

class CustomCallDirectoryProvider: CXCallDirectoryProvider {
    override func beginRequest(with context: CXCallDirectoryExtensionContext) {
        let labelsKeyedByPhoneNumber: [CXCallDirectoryPhoneNumber: String] = [ … ]
        for (phoneNumber, label) in labelsKeyedByPhoneNumber.sorted(by: <) {
            context.addIdentificationEntry(withNextSequentialPhoneNumber: phoneNumber, label: label)        
        }

        context.completeRequest()
    }
}

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

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

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

import 'generated_pigeon.dart'

void onClick() async {
  SearchRequest request = SearchRequest()..query = 'test';
  Api api = Api();
  SearchReply reply = await api.search(request);
  print('reply: ${reply.result}');
}
<块引用>

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