TelephonyManager.EXTRA_INCOMING_NUMBER имеет значение null в Android 9

Я не могу получить номер телефона вызывающего абонента с помощью TelephonyManager.EXTRA_INCOMING_NUMBER на устройствах Android 9. Это всегда ноль. Я добавил необходимые разрешения в свой файл манифеста.

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

////

<receiver android:name="packagename" android:enabled="true" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />

        </intent-filter>
</receiver>

////

 public void onReceive(final Context context, Intent intent) {

    Log.d(" onReceive: ", "flag1");

    String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

    if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)
            || state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {

        Log.d("Ringing", "Phone is ringing");

        Intent i = new Intent(context, MainActivity.class);
        i.putExtras(intent);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
Intent.FLAG_ACTIVITY_CLEAR_TOP);

        context.startActivity(i);
    }
}

В приведенном выше методе onReceive() я получил доступ к состоянию телефона, которое работает хорошо.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    try {

        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SYSTEM_ALERT_WINDOW) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.READ_PHONE_STATE, Manifest.permission.SYSTEM_ALERT_WINDOW},
                    1);
        }
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        l1=(LinearLayout)findViewById(R.id.l1);
        l1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finishAndRemoveTask();
                android.os.Process.killProcess(android.os.Process.myPid());
            }
        });
         number = getIntent().getStringExtra(
                TelephonyManager.EXTRA_INCOMING_NUMBER);


         if (number.substring(0,1).equalsIgnoreCase("+")){
            number=number.substring(3);
            Log.e("bbbb",number);
         }
        String state = getIntent().getStringExtra(
                TelephonyManager.EXTRA_STATE);
        progressBarf = (ProgressBar)findViewById(R.id.progressBar1);
        mobile_number = (TextView) findViewById(R.id.mobile_number);
        vechile = (TextView) findViewById(R.id.vechile);
        name=(TextView)findViewById(R.id.name);
        name.setText("Searching");
        mobile_number.setText(number);
        close=(ImageView)findViewById(R.id.close);
         db = new DatabaseHandler(this);
        if (ConnectionDetector.isConnectingToInternet(MainActivity.this)) {
            makeJsonArrayRequest();

        }else{
            Pojo pp= db.getContact(number);
            progressBarf.setVisibility(View.GONE);
            Toast.makeText(getApplicationContext(),"Get From Offline",Toast.LENGTH_SHORT).show();
            if (pp.getS_vechile().equals("0")){
                name.setText(pp.getS_name());
            }else {
                name.setText(pp.getS_name());
                vechile.setText("("+pp.getS_vechile()+")");
            }
            Log.e("dayalen","aa"+String.valueOf(db.getContactsCount()));
        }
        startService(new Intent(this, UpdateService.class));
        Calendar cal = Calendar.getInstance();
        Intent intent = new Intent(this, UpdateService.class);
        PendingIntent pintent = PendingIntent
                .getService(this, 0, intent, 0);

        AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        // Start service every hour
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                3600*1000, pintent);
        close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finishAndRemoveTask();
                android.os.Process.killProcess(android.os.Process.myPid());
            }
        });
    }
    catch (Exception e) {
        Log.d("Exception", e.toString());
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

Здесь TelephonyManager.EXTRA_INCOMING_NUMBER дает null при совершении вызова. Но на самом деле он должен вернуть номер телефона вызывающего абонента.


person Divakar Thirunavukarasu    schedule 22.03.2019    source источник
comment
Пожалуйста, поделитесь своим кодом (где вы пытаетесь получить эти данные и где вы спрашиваете о разрешении)   -  person Boken    schedule 22.03.2019
comment
спасибо за ответ, я добавил исходный код.   -  person Divakar Thirunavukarasu    schedule 22.03.2019
comment
@рай. Но это мне не помогает.   -  person Divakar Thirunavukarasu    schedule 22.03.2019


Ответы (1)


Вы почти там. Чего вам не хватает, так это разрешения READ_CALL_LOG во время выполнения. Вам нужно запросить разрешение на выполнение так же, как вы делали это для READ_PHONE_STATE.

person Passionate Androiden    schedule 23.03.2019
comment
Не получается... Пожалуйста, дайте любые другие решения - person Srinivas Keerthiprakasam; 13.08.2019
comment
Как обрабатывать разрешения во время выполнения для этого случая, когда это не действие, а класс, расширяющий BroadcastReceive? - person Felix A Marrero Pentón; 22.11.2019
comment
Если я использую разрешения во время выполнения, означает ли это, что каждый раз, когда я ввожу вызов, мне нужно будет принимать разрешение на получение входящего номера? Потому что это было бы не очень практично - person Felix A Marrero Pentón; 22.11.2019
comment
int readContactsPermissionLog = ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CALL_LOG); if(readContactsPermissionLog != PackageManager.PERMISSION_GRANTED){ listPermissionsNeeded.add(Manifest.permission.READ_CALL_LOG); } - person Fractal; 06.02.2020