Я обновляю наше приложение, чтобы использовать новую систему разрешений M времени выполнения. Это все работает, кроме onRequestPermissionsResult (). Мне нужно проверить разрешение на нажатие кнопки и, если оно прошло успешно, отправить текстовое сообщение. Когда я даю разрешение на это, диалоговое окно закрывается, но оно не вызывает отправку текста, пока я снова не нажму кнопку.
Я отладил и установил точки останова в методе onRequestPermissionsResult (), но он никогда не входит в это.
Этот метод вызывается первым:
private void askForPermission() {
String[] permissions = new String[]{Manifest.permission.SEND_SMS};
ActivityCompat.requestPermissions(getActivity(), permissions, PERMISSIONS_CODE);
}
И тогда мой обратный вызов выглядит так:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSIONS_CODE) {
for (int i = 0; i < permissions.length; i++) {
String permission = permissions[i];
int grantResult = grantResults[i];
if (permission.equals(Manifest.permission.SEND_SMS)) {
if (grantResult == PackageManager.PERMISSION_GRANTED) {
onPPSButtonPress();
} else {
requestPermissions(new String[]{Manifest.permission.SEND_SMS}, PERMISSIONS_CODE);
}
}
}
}
}
Кто-нибудь сталкивался с подобной проблемой? Ценю любую помощь с этим. Спасибо
источник
Fragment.requestPermissions()
родительская активность фактически получаетonRequestPermissionsResult()
. (Это с библиотекой поддержки 23.3.0)Вы можете попробовать это:
Если вы вызываете этот код из фрагмента, у него есть собственный метод requestPermissions. Я считаю, что проблема в том, что вы вызываете статический метод.
Pro Совет, если вы хотите
onRequestPermissionsResult()
во фрагменте:FragmentCompat.requestPermissions(Fragment fragment, String[] permissions, int requestCode)
источник
Я надеюсь, что это работает нормально
Для деятельности:
Для фрагмента:
источник
Я тоже столкнулся с этой проблемой. Если вы хотите, чтобы действие, которое обрабатывает разрешения, отсутствовало в истории / событиях, то у вас возникнет соблазн изменить свою
AndroidManifest.xml
запись.Если вы установите активность, которую вы вызываете
requestPermissions
илиAppCompatActivity.requestPermissions
спо твоему
AndroidManifest.xml
тогдаonRequestPermissionsResult()
не назовешь. Это верно, если ваша активность получена изActivity
илиAppCompatActivity
.Это можно исправить, удалив оба флага из AndroidManifest.xml и завершив
finishAndRemoveTask()
вместо этого свою деятельность .источник
Если у вас есть
onRequestPermissionsResult
активность и фрагмент, обязательно позвонитеsuper.onRequestPermissionsResult
в активность. Фрагмент не требуется, но есть в действии.источник
FragmentActivity.onRequestPermissionsResult(..)
где вызов фрагментаonRequestPermissionsResult(..)
перенаправляется .Ответ не рекомендуется, пожалуйста, обратитесь к: https://developer.android.com/training/permissions/requesting
Внутри фрагмента нужно позвонить:
Не:
источник
Если вы используете requestPermissions во фрагменте, он принимает 2 параметра вместо 3.
Вы должны использовать
requestPermissions(permissions, PERMISSIONS_CODE);
источник
Если по какой-то причине вы расширили пользовательское действие, расположенное в какой-либо внешней библиотеке, которая не вызывает super, вам нужно вручную вызвать Fragment super.onRequestPermissionsResult в своей активности onRequestPermissionsResult.
источник
У вас есть функция checkPermissions для устройств до Зефира во FragmentCompat . Я использую так:
источник
Я выяснил, что важно, когда вы звоните
android.support.v4.app.Fragment.requestPermissions
.Если вы делаете это в
onCreate()
,onRequestPermissionsResult()
никогда не вызывается.Решение: позвоните
onActivityCreated()
;источник
onActivityCreated()
в своем коде. SDK 23.onPause()
?Эта проблема на самом деле была вызвана NestedFragments. В основном большинство фрагментов мы расширяем HostedFragment, который, в свою очередь, расширяет CompatFragment. Наличие этих вложенных фрагментов вызывало проблемы, которые в конечном итоге были решены другим разработчиком проекта.
Он делал некоторые вещи низкого уровня, такие как переключение битов, чтобы заставить это работать, поэтому я не слишком уверен в фактическом окончательном решении
источник
источник
Это будет работать ..
источник
Если вы вызываете этот код из фрагмента, у него есть собственный метод requestPermissions.
Итак, основная концепция такова: если вы находитесь в Деятельности, то позвоните
и если во фрагменте, просто позвоните
источник
FragmentCompat.requestPermissions()
.У меня была похожая проблема, за исключением того, что я нажимал кнопку, чтобы позвонить, что вызывает callIntent. Сначала я проверил разрешение, если не предоставлено, я запрашиваю разрешение, и onRequestPermissionResult я вызываю разрешение на проверку и снова звоню.
источник
Исходя из ответа goodgamerguy, решение таково:
источник
Прежде чем проверять все согласно приведенным выше ответам, убедитесь, что ваш код запроса не равен 0 !!!
проверьте код onRequestPermissionsResult () в FragmentActivity.java:
источник
источник
У меня есть удивительное решение для достижения этой цели сделать BaseActivity, как это.
}
Теперь вы можете вызвать код, чтобы запросить разрешение, как это
Теперь каждый раз, когда это происходит где-либо, будь то в вашем фрагменте или в любом действии, будет вызываться базовое действие.
Спасибо
источник
Вы можете использовать
requestPermissions(PERMISSIONS, MULTIPLE_PERMISSIONS_CODE);
. Не используйте FragmentCompat, если вы используете v4.источник
подробности
Алгоритм
модуль - камера, локация, ....
Характеристики
Решение
Использование в Activity (фрагмент тот же)
источник
Здесь я хочу показать свой код, как мне это удалось.
Здесь, в этом классе, я хочу проверить, разрешено или нет. Не тогда я буду называть разрешение от моей MainActivity, как
Теперь в методе onCreate вам нужно вызвать функцию requestForPermission ().
Вот и все. Также вы можете запросить несколько разрешений одновременно.
источник
ОБНОВЛЕНИЕ: видел чей-то ответ о вызове
super.onRequestPermissionResult()
в Деятельности, и это устраняет проблему кода запроса, которую я упомянул, и вызывает фрагмент onRequestPermissionResult.игнорировать этот материал:
Для меня это был вызов
onRequestPermissionResult
Activity, несмотря на мой вызовfragment.requestPermission(...)
, НО он вернул результат с неправильным кодом запроса (111 превратился в 65647, почему ??? Я никогда не узнаю).К счастью, это единственное разрешение, которое мы запрашиваем на этом экране, поэтому я просто игнорирую код запроса (у меня нет времени, чтобы выяснить, почему это не правильно сейчас)
источник
Я также столкнулся с проблемой, что даже если вы вызываете правильный requestPermissions, вы все равно можете иметь эту проблему. Проблема в том, что родительская активность может переопределить этот метод без вызова super. Добавьте супер, и это будет исправлено.
источник