web-dev-qa-db-ja.com

Android 9で発信者IDを取得する

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_権限も追加しました。

何か案は?同じ問題を経験している人はいますか?

よろしくお願いします。

12
haris

私の質問に対する答えを見つけました:

最初に、Android 9、両方のREAD_PHONE_STATE そしてその READ_CALL_LOG実行時の許可。以前のAndroidバージョンでは、READ_PHONE_STATE許可。どちらも実行時に確認する必要があります。

次に、上記の両方のアクセス許可が与えられている場合、onReceiveメソッドが2回呼び出されます(!!)。初めてインテントが「空」になったとき(EXTRA_INCOMING_NUMBER 無効である)。 2回目は、通常、意図どおりにインテントが設定されます。これは TelephonyManager Documentation に文書化されています。

16
haris

追加 READ_CALL_LOG以下のマニフェストの許可:

<uses-permission Android:name="Android.permission.READ_CALL_LOG" />

それから

アプリ->あなたのアプリ->許可->通話ログ許可を許可

receiverが2回呼び出された後、今すぐ電話番号を取得する必要があります

1