READ_EXTERNAL_STORAGE не назначается до перезапуска приложения

Я создаю приложение, которое требует чтения XML-файла из хранилища устройства при первом запуске сразу после установки. Я столкнулся с проблемой, когда после запроса разрешения «Manifest.permission.READ_EXTERNAL_STORAGE» во время выполнения (и его предоставления) «новый файл (Environment.getExternalStorageDirectory()).canRead()» всегда возвращает false, пока я не перезапущу приложение. После перезапуска все работает нормально, но это не то, что мне нужно. Странно то, что после получения предоставленного разрешения, если я проверю, имеет ли приложение набор разрешений, все выглядит нормально.

ContextCompat.checkSelfPermission(getContext(), Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;  -> always returns true after granting the permission

это мой код:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    if (requestCode == AddServerFragment.EXTERNAL_STORAGE_READ_PREMISSION) {
        if (permissions.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Logger.log(LOG_TAG, android.Manifest.permission.READ_EXTERNAL_STORAGE + " has been granted", Log.VERBOSE);
            ((AddServerFragment) getSupportFragmentManager().findFragmentByTag(getAttachedFragmentTag())).parseServerConfigFile();
        } else {
            Logger.log(LOG_TAG, android.Manifest.permission.READ_EXTERNAL_STORAGE + " has been denied", Log.INFO);
        }
        return;
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

ParseServerConfigFile()

void parseServerConfigFile() {
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ||
            Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
        File serverSetupFile = new File(Environment.getExternalStorageDirectory(), getString(R.string.server_ini_file_name));
        ConfigureServerAsyncTask configureServerAsyncTask = new ConfigureServerAsyncTask(this);
        configureServerAsyncTask.execute(serverSetupFile);
    } else {
        Logger.log(LOG_TAG, "Storage not available at the moment", Log.INFO);
        Toast.makeText(getContext(), "Storage not available", Toast.LENGTH_SHORT).show();
    }
}

Logcat: 07-21 10:34:55.320 25272-25272/com.mdmobile.cyclops V/LoginActivity: android.permission.READ_EXTERNAL_STORAGE предоставлено 07-21 10:36:01.277 25272-25335/com.mdmobile.cyclops V/ FA: Использование сервиса измерений Подключение к удаленному сервису 07-21 10:36:01.290 25272-25335/com.mdmobile.cyclops V/FA: Активность возобновлена, время: 22213849 07-21 10:36:01.291 25272-25272/com. mdmobile.cyclops I/ConfigureServerAsyncTask: файл ServerSetup.xml не найден

Кто-нибудь видел это раньше?


person AntonioBust    schedule 21.07.2018    source источник
comment
Да, спасибо, что указали на это. Кажется, что это необходимо, поскольку это разрешение является разрешением Linux.   -  person AntonioBust    schedule 21.07.2018


Ответы (1)


Как и в статье, указанной Дэвидом Майклом Возможное решение, хотя и очень уродливое (и похожее на ошибку), чтобы увидеть перезагрузку приложения после принятия разрешения:

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        if (requestCode == AddServerFragment.EXTERNAL_STORAGE_READ_PREMISSION) {
            if (permissions.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Logger.log(LOG_TAG, android.Manifest.permission.READ_EXTERNAL_STORAGE + " has been granted \n app restart required",
                        Log.INFO);
                //READ STORAGE PERMISSION requires application restart as it is a linux permission
                Intent i = getBaseContext().getPackageManager()
                        .getLaunchIntentForPackage(getBaseContext().getPackageName());
                if (i != null) {
                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(i);
                    System.exit(0);
                }
            } else {
                Logger.log(LOG_TAG, android.Manifest.permission.READ_EXTERNAL_STORAGE + " has been denied", Log.INFO);
            }
            return;
        }
person AntonioBust    schedule 21.07.2018