#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>
- если вы добавили его, но все равно доступ к внешнему хранилищу запрещен, то вот как запросить его во время выполнения :
- Сначала инициализируйте
ActivityResultLauncher
и зарегистрируйте его как результат действия, который должен быть перед {инициализацией,onAttach()
, илиonCreate()
} методами создания фрагмента, поэтому единственным способом было инициализировать его как глобальную переменную фрагмента - Затем, когда вам нужно начать использовать внешнее хранилище, вы сначала используете
ActivityResultLauncher
инициализированное ранее, чтобы запустить запрос на необходимые разрешения. - Если разрешения были предоставлены, обратный вызов должен естественным образом продолжить ваш рабочий процесс, в противном случае (временно) вы должны отобразить диалоговое сообщение с тостом/предупреждением, сообщающее пользователю, почему он не может продолжить свое действие.
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.