如何在Android Q中检测拨出电话号码

时间:2019-07-05 10:07:43

标签: java android kotlin

我无法在 Android Q 中获得拨出电话号码。

我已经使用此意图过滤器android.intent.action.NEW_OUTGOING_CALL在清单中注册了接收者,并且在代码中我正在检测像这样的传出电话号码

@Override
public void onReceive(Context context, Intent intent) {
    if(intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL"))
        String nr = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
}

但是我永远无法在 Android Q 中获得去电电话号码,是否有变通方法来获得该电话号码,或者因为 Android Q 完全不可能检测到去电电话号码?

编辑:它适用于以前的android版本

2 个答案:

答案 0 :(得分:0)

来自 android.intent.action.NEW_OUTGOING_CALL 的文档:

  

在API级别29中不推荐使用此常数。重定向的应用   拨出电话应使用CallRedirectionService API。的应用   执行呼叫筛选应使用CallScreeningService API。

https://developer.android.com/reference/android/content/Intent

因此,我将首先实现此API,并检查其是否按预期工作。

答案 1 :(得分:0)

您需要添加PROCESS_OUTGOING_CALLS权限

创建OutgoingCallReceiver

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;

public class OutgoingCallReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

            TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
            if (tm.getCallState() == TelephonyManager.CALL_STATE_OFFHOOK) {

                String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

            }

    }

}

添加必需的权限以读取AndroidManifest文件中的即将结束的呼叫

  <uses-permission android:name="android.permission.NEW_OUTGOING_CALL" />
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

在运行时请求权限

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.PROCESS_OUTGOING_CALLS, Manifest.permission.READ_PHONE_STATE},
                    1);
        }

在AndroidManifest文件中添加OutgoingCallReceiver

  <receiver
        android:name=".application.services.OutgoingCallReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
    </receiver>

此代码对您来说很好用,但是当您需要将应用程序上传到Google Play上时,可以使用NEW_OUTGOING_CALL和READ_PHONE_STATE权限,但是, 您将从playStore收到以下政策通知:

您的应用清单请求“呼叫记录”权限组(例如PROCESS_OUTGOING_CALLS) 它必须在设备上主动注册为默认的Phone或Assistant处理程序。

在这种情况下,只有当您想读取OutCommingCall号码时,才有两种解决方案:

将声明表单发送到Google declaration form

或将您的应用程序拨号器应用设为

选中Developer Policy Center