BroadcastReceiver
で次のコードを使用して、着信コールの発信者IDを取得しています。
_@Override
public void onReceive(Context aContext, Intent aIntent) {
String action = aIntent.getAction();
if (action==null) return;
if (!action.equals("Android.intent.action.PHONE_STATE")) return;
String curState = aIntent.getStringExtra(TelephonyManager.EXTRA_STATE);
if ((TelephonyManager.EXTRA_STATE_RINGING.equals(curState))
&&(TelephonyManager.EXTRA_STATE_IDLE.equals(oldState)))){
String incNumber = aIntent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
// do something here
}
oldState=curState;
}
_
残念ながら、これはAndroid 9.0 (API 28)
で機能しなくなりました。具体的には、aIntent.getStringExtra(EXTRA_INCOMING_NUMBER)
は常にnullを返します。 In Android _versions<=API 27
_すべてが正しく機能する
マニフェストファイルに_READ_PHONE_STATE
_および_READ_CALL_LOG
_権限も追加しました。
何か案は?同じ問題を経験している人はいますか?
よろしくお願いします。
私の質問に対する答えを見つけました:
最初に、Android 9
、両方のREAD_PHONE_STATE
そしてその READ_CALL_LOG
実行時の許可。以前のAndroidバージョンでは、READ_PHONE_STATE
許可。どちらも実行時に確認する必要があります。
次に、上記の両方のアクセス許可が与えられている場合、onReceive
メソッドが2回呼び出されます(!!)。初めてインテントが「空」になったとき(EXTRA_INCOMING_NUMBER
無効である)。 2回目は、通常、意図どおりにインテントが設定されます。これは TelephonyManager Documentation に文書化されています。
追加 READ_CALL_LOG
以下のマニフェストの許可:
<uses-permission Android:name="Android.permission.READ_CALL_LOG" />
それから
アプリ->あなたのアプリ->許可->通話ログ許可を許可
receiver
が2回呼び出された後、今すぐ電話番号を取得する必要があります