Не запрашивая разрешения в Android, программа напрямую сталкивается с блокировкой отказа

#java #android #android-external-storage

Вопрос:

Привет, Совсем недавно я начал кодировать в Android studio и включил декстера для получения разрешений на доступ к пользовательскому хранилищу, но главная проблема в том, что код напрямую отображает сообщение об отказе в блокировке, даже не запрашивая разрешения.Пожалуйста, помогите

 Dexter.withContext(this)
                    .withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
    
                    .withListener(new PermissionListener() {
                        @Override
                        public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {
                            Toast.makeText(MainActivity.this, "Thanks !", Toast.LENGTH_SHORT).show();
                        }
    
                        @Override
                        public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) {
                            Toast.makeText(MainActivity.this, "not granted", Toast.LENGTH_SHORT).show();
                        }
    
                        @Override
                        public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {
                            permissionToken.continuePermissionRequest();
                        }
                    })
                    .check();
 

Ответ №1:

может быть, дело ваше приложение не имеет разрешения, но.
Начиная с Android 6, разрешения считаются опасными разрешения и даже если вы добавили необходимые разрешения для Android манифест, следует предполагать, что приложение имеет что-то, и вы всегда должны запрашивать разрешения во время выполнения, Прежде чем приступить к действиям, которые требуют от них.

  • если вы не добавили READ_EXTERNAL_STORAGE его в манифест Android, он должен выглядеть следующим образом :
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="your.package.name"

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

    <application>
      ...
    </application>
</manifest>
 
  • если вы добавили его, но все равно доступ к внешнему хранилищу запрещен, то вот как запросить его во время выполнения :
  1. Сначала инициализируйте ActivityResultLauncher и зарегистрируйте его как результат действия, который должен быть перед {инициализацией, onAttach() , или onCreate() } методами создания фрагмента, поэтому единственным способом было инициализировать его как глобальную переменную фрагмента
  2. Затем, когда вам нужно начать использовать внешнее хранилище, вы сначала используете ActivityResultLauncher инициализированное ранее, чтобы запустить запрос на необходимые разрешения.
  3. Если разрешения были предоставлены, обратный вызов должен естественным образом продолжить ваш рабочий процесс, в противном случае (временно) вы должны отобразить диалоговое сообщение с тостом/предупреждением, сообщающее пользователю, почему он не может продолжить свое действие.
 public class myFragment extends Fragment {
    ...
    ActivityResultLauncher<String> requestPermissionLauncher =
                registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
                    if (isGranted){ 
                        //continue your work flow
                        goDoSomething();}
                    else{
                       // Explain to the user that the feature is unavailable because
                       // the features requires a permission that the user has denied.
                       // At the same time, respect the user's decision. Don't link to
                       // system settings in an effort to convince the user to change
                       // their decision.
                        Toast.makeText(getContext(), "Can't continue without the required permissions", Toast.LENGTH_LONG).show();
                     }
                });
    public void getNecessaryPermissionsAndDoSomething() {
            if (ActivityCompat.checkSelfPermission(getContext(),
                    Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
                //check first if you have the permission or not 
                //if you don't then launch permission request dialog
                requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE);
            }else goDoSomething(); //continue your work naturally 
        }
}
 

для получения дополнительной информации об этом вам следует ознакомиться с документацией разработчиков Android о запросе разрешений во время выполнения.


Обновить

 if (ActivityCompat.checkSelfPermission(getContext(),
                    Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
         Log.e("permission","not granted"); 
else Log.e("permission","granted"); 
 

Комментарии:

1. Сэр, мой манифест Android выглядит так: READ_EXTERNAL_STORAGE» />

2. это не будет проблемой, пока вы бегаете на устройствах с API >23, Если вы хотите удалить sdk-23 части не вызовет проблем, так или иначе, вы могли бы попробовать, по крайней мере, использовать, если/другое заявление, чтобы проверить, если у вас есть разрешение или нет во время выполнения, как я только что обновил мой ответ, увидеть, какие журналы приходит, если он говорит предоставляется, то ваша проблема не в том, что разрешение не предоставлено

3. api с ограниченным разрешением следует использовать только в том случае, если какое-либо разрешение устарело для более высокого api и было заменено более новым, которое не работает на более низких api, кроме этого, я не думаю, что вам следует ограничивать свое разрешение более низкими api и READ_EXTERNAL_STORAGE , естественно, работает на любом api.