OnRequestPermissionsResult не вызывается в фрагменте, если он определен как в фрагменте, так и в действии
У меня есть фрагмент, в котором у меня есть recyclerview и настройка данных в этом recyclerview с использованием адаптера recycliewiew.
Теперь у меня есть кнопка в элементе списка адаптеров, на который мне нужно проверить разрешение READ_EXTERNAL_STORAGE в android для новой модели разрешения в android.
Я создал новую функцию в этом фрагменте адаптера, чтобы проверить, предоставлено ли разрешение или нет, и запросить разрешение, если оно уже не предоставлено.
Я прошел MyFragment.this как параметр в адаптере и вызывая метод фрагмента нажатием кнопки в адаптере.
Я использовал приведенный ниже код для вызова requestPermission в фрагменте.
if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED)){
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
ConstantVariables.READ_EXTERNAL_STORAGE);
}
Я переопределил метод onRequestPermissionsResult
в фрагменте, используя приведенный ниже код:
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case ConstantVariables.READ_EXTERNAL_STORAGE:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, proceed to the normal flow.
startImageUploading();
} else {}
Но он не получает вызов, а не этот метод onRequestPermissionsResult вызывает вызов.
Я также определяю один и тот же метод onRequestPermissionsResult в родительской активности фрагмента и вызывается.
Я не могу удалить действие onRequestPermissionsResult, но хочу вызвать метод фрагмента onRequestPermissionsResult, когда я запрашиваю разрешение от фрагмента.
Как я могу это сделать? Я делаю что-то неправильно здесь, пожалуйста, помогите мне, если у кого есть идея здесь.
Ответы
Ответ 1
Отредактированный ответ для охвата более широких проблем
Я думаю, вы запутываете метод для фрагмента и активности. Имел аналогичный вопрос мой проект в прошлом месяце. Проверьте, есть ли у вас, наконец, следующее:
- В AppCompatActivity используйте метод ActivityCompat.requestpermissions
- В фрагменте поддержки v4 вы должны использовать requestpermissions
- Поймать, если вы вызываете AppcompatActivity.requestpermissions в свой фрагмент, тогда обратный вызов будет активирован, а не фрагмент
- Обязательно вызывайте
super.onRequestPermissionsResult
из действия onRequestPermissionsResult
.
Посмотрите, помогает ли это.
Ответ 2
Я запросил разрешение на местоположение у фрагмента, и во фрагменте мне нужно было изменить это:
ActivityCompat.requestPermissions(getActivity(), new String[]{
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);
на это:
requestPermissions(new String[]{
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);
затем во фрагменте был вызван onRequestPermissionsResult.
Ответ 3
Метод requestPermissions
для фрагментов требует уровня API 23 или выше.
Если ваше приложение предназначено для более низкой версии, вы можете использовать
FragmentCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
ConstantVariables.READ_EXTERNAL_STORAGE);
Сначала нужно добавить зависимость support-v13:
implementation "com.android.support:support-v13:$supportLibVersion"
Ответ 4
private void showContacts() {
if (getActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
PERMISSIONS_REQUEST_READ_STORAGE);
} else {
doShowContacts();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
if (requestCode == PERMISSIONS_REQUEST_READ_STORAGE
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
doShowContacts();
}
}
изменить разрешение
Ответ 5
Этот принятый ответ не работает для меня, поэтому я нашел свое собственное решение, объясненное ниже:
1. Сначала я создал метод во фрагменте:
public static void MyOnRequestPermissionResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
if (requestCode == 1 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "Permission: true");
} else {
Log.d(TAG, "permission: false");
}
}
2. И затем вызвали его из своей основной деятельности:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if(requestCode ==1){
SignupFragment.MyOnRequestPermissionResult(requestCode, permissions, grantResults);
}
}
И это работает...
Ответ 6
Убедитесь, что оба PERMISSION_REQUEST_CODE
в onRequestPermissionsResult
и внутри вашего Fragment
содержат одно и то же значение.
Ответ 7
Для tragetSDK 28, проверка SDK (> 23) и запрос разрешения от фрагмента будут работать. ActivityCompat.requestPermissions терпит неудачу (если вы установите код запроса ниже 65536, появится диалоговое окно разрешения, и если пользователь разрешит разрешение, разрешения будут предоставлены, но обратный вызов не произойдет. Но если вы установите значение выше 65536, ActivityCompat.requestPermissions будет немедленно провалиться. Я не знаю причины этой логики. Может быть ошибка или преднамеренное).
Рабочий код:
if (Build.VERSION.SDK_INT >= 23) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_ACCESS_REQUEST);
}
Ответ 8
Эта проблема была фактически вызвана NestedFragments. В основном большинство фрагментов мы расширили HostedFragment, который, в свою очередь, расширяет CompatFragment. Наличие этих вложенных фрагментов вызвало проблемы, которые в конечном итоге были решены другим разработчиком проекта.
Он занимался некоторыми низкоуровневыми вещами, такими как переключение бит, чтобы получить эту работу, поэтому я не слишком уверен в конечном решении