Подтвердить что ты не робот

Как бороться с удалением разрешения для широковещательного приемника в Android M?

У меня есть код устаревшего кода, который я разрешаю для Marshmallow.

Существует широковещательная передача с использованием разрешения PHONE_STATE следующим образом:

<receiver android:name="redacted.TheBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PHONE_STATE"></action>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

Если предоставляется разрешение PHONE_STATE, но затем пользователь отрицает, когда есть телефонный звонок, возникает связанный с разрешением сбой. Но авария происходит до того, как вызывается Broadcast Receiver onReceive() (авария в android.app.ActivityThread.handleReceiver). Это означает, что широковещательный приемник не может даже проверить, предоставлено ли разрешение или нет, и справиться с этой ситуацией.

Итак, мой вопрос: если есть широковещательный приемник, такой как это, как код может касаться ситуации, когда пользователь отключил разрешение, потому что AFAIK не имеет API для контроля за изменениями разрешений по мере их возникновения, поэтому код не может знать "на лету", что разрешение было отменено, и поэтому он не может отменить регистрацию своего широковещательного приемника.

4b9b3361

Ответ 1

Что касается разрешения в Android Marsmallow, вы можете проверить разрешение до того, как ваш приемник будет вызываться следующим образом:

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.PHONE_STATE)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.PHONE_STATE)) {

        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.PHONE_STATE},
                MY_PERMISSIONS_REQUEST_PHONE_STATE);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

Это поздний ответ, но я надеюсь, что это поможет кому-то!!!

Ответ 2

Окончательная версия Android M еще не завершена (окончательный api отсутствует, но не код платформы), поэтому, надеюсь, платформа будет обрабатывать проверку разрешений перед вызовом вашего ресивера.

Ответ 3

Пытался воспроизвести проблему 6.0.1 без успеха. Я прикрепляю ссылку для тестового проекта, который я использовал.
Сценарий прост:

  • Запустите с разрешением ON. Все работает так, как ожидалось. Вызывается onReceive.
  • Отключите разрешение. Ожидаемый результат сбой приложения при изменении состояния телефона не происходит.

Если у кого-то другой результат, я думаю, что эта проблема "решена" в некотором роде.