onRequestPermissionsResult не называют фрагмент, если она определена в оба фрагмента и активности
у меня есть фрагмент, в котором у меня есть recyclerview и установка данных в этом recyclerview с помощью адаптера recyclerview.
Теперь у меня есть кнопка в элементе списка адаптера, нажав на которую мне нужно проверить разрешение READ_EXTERNAL_STORAGE в android для новой модели разрешений в android.
Я создал новую функцию во фрагменте этого адаптера, чтобы проверить, предоставлено ли разрешение или нет, и запросить разрешение, если оно еще не предоставлено.
I прошли MyFragment.это как параметр в адаптере и вызов метода фрагмента при нажатии кнопки в адаптере.
я использовал приведенный ниже код для вызова 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 фрагмента, когда я запрашиваю разрешение от фрагмента. Как я могу это сделать? Я делаю что-то неправильно здесь, Пожалуйста, помогите мне если у кого есть идеи здесь.
7 ответов:
отредактированный ответ, чтобы охватить более широкие вопросы
Я думаю, что вы путаете метод для фрагмент и активности. Был аналогичный вопрос мой проект в прошлом месяце. Пожалуйста, проверьте, если у вас есть следующее:
- в AppCompatActivity используйте метод ActivityCompat.requestpermissions
- в V4 фрагмент поддержки вы должны использовать requestpermissions
- Catch, если вы вызываете AppcompatActivity.requestpermissions в вашем фрагменте тогда обратный вызов придет к активности, а не к фрагменту
- обязательно позвоните
super.onRequestPermissionsResult
от действийonRequestPermissionsResult
.смотрите, если это поможет .
метод
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"
Я запросил разрешение на размещение фрагмента и в фрагменте мне нужно было изменить это:
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 был вызван во фрагменте.
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(); }
}
изменить разрешения
убедитесь, что оба
PERMISSION_REQUEST_CODE
наonRequestPermissionsResult
и внутриFragment
содержит то же значение.
для tragetSDK 28, проверка SDK (>23) и requestpermissions от фрагмента будет работать. The 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); }
эта проблема на самом деле была вызвана NestedFragments. В основном большинство фрагментов мы расширяем HostedFragment, который в свою очередь расширяет CompatFragment. Наличие этих вложенных фрагментов вызвало проблемы, которые в конечном итоге были решены другим разработчиком в проекте.
Он делал некоторые вещи низкого уровня, такие как переключение бит, чтобы заставить это работать, поэтому я не слишком уверен в фактическом окончательном решении