Разрешение во время выполнения и полупрозрачное наложение - PullRequest
0 голосов
/ 03 мая 2018

Я столкнулся с проблемой наложения экрана на Android 8.0. Ниже приведены разрешения, которые указаны в моем файле manifest.xml -

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

При нажатии кнопки (кнопка находится внутри фрагмента), я проверяю, разрешено ли WRITE_EXTERNAL_STORAGE разрешение или нет. Если не предоставлено, я делаю вещи ниже -

requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 5);

& in onRequestPermissionsResult callback, если PackageManager.PERMISSION_GRANTED & requestCode == 5 Я звоню своей логической части.

Однако, если я нажму одну из кнопок Разрешить или Запретить всплывающего окна разрешения, Я получу полупрозрачное наложение на весь экран устройства &, если только я Я не убиваю приложение из фона, оно не удаляется. Кроме того, кнопка возврата устройства не работает в этом сценарии.

Это происходит каждый раз, когда я вызываю диалог разрешения WRITE_EXTERNAL_STORAGE и выполняю одно из действий.

Если разрешение уже предоставлено, приложение работает без проблем с наложением.

Мой minSdkVersion = 19 & targetSdkVersion = 27.

Также, в моем коде нет тостовых сообщений .

Я протестировал приложение в Android 7.0, и оно отлично работает на нем. Эта проблема возникает на устройствах Android 8.0, таких как Nexus 6P / Google Pixel.

Любая помощь будет оценена.

Заранее спасибо.

1 Ответ

0 голосов
/ 03 мая 2018

Попробуйте, я делаю два отдельных метода для проверки прав доступа.

/**
 * this method request to permission asked.
 */
private void requestPermissions() {
    boolean shouldProvideRationale =
            ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (shouldProvideRationale) {
    } else {
        Log.i("Error", "Requesting permission");
        // previously and checked "Never ask again".
        ActivityCompat.requestPermissions(MainActivity.this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_PERMISSIONS_REQUEST_CODE);
    }
}

/**
 * this method check permission and return current state of permission need.
 */
private boolean checkPermissions() {
    int permissionState = ActivityCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE);
    return permissionState == PackageManager.PERMISSION_GRANTED;
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
        if (grantResults.length <= 0) {
            // If user interaction was interrupted, the permission request is cancelled and you
            // receive empty arrays.
            Log.i("Error", "User interaction was cancelled.");
        } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission was granted. Kick off the process of building and connecting
            // GoogleApiClient.
            getCallDetails();
        } else {
        }
    }

}

затем после проверки в основной деятельности, как это.

if (!checkPermissions()) {
    requestPermissions();
} else {
    getWrite();
}
...