Мой виджет делает вызовы для защищенных разрешений за пределами области Activity
. Можно ли запросить разрешения для Android M за пределами Activity
?Android M запрашивает разрешение без активности
ответ
Нет, это невозможно. Что вы можете сделать, так это отправить уведомление, в котором пользователь может нажать, а затем использовать действие для запроса/управления разрешением (возможно, с диалоговой темой).
Вы можете запросить разрешение только из Activity или из фрагмента.
Выясните точку в вашей деятельности или фрагменте, где вы чувствуете, что приложение потребует разрешения, а затем вызывает метод запросаPermission. отправка уведомления не будет работать, потому что вы хотите, чтобы ваш код обрабатывал un-till, пока вы не получили запрашиваемые разрешения, а затем возобновите свою функциональность с помощью метода onRequestPermissionResult().
Я думаю, что это возможно, чтобы запросить разрешение за пределами той или иной деятельности, до тех пор, пока вы используете метод
ActivityCompat.requestPermissions (Activity activity, String[] permissions, int requestCode)
из библиотеки поддержки и передать активность в качестве параметра метода.
Например:
ActivityCompat.requestPermissions(targetActivity, new String[] {Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE);
где targetActivity является деятельность, которая должна реализовать метод:
onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)
Это метод, который будет обрабатывать запрос де результат разрешения.
Внешняя сторона действия означает Службу или BroadcastReceiver, где у вас вообще нет активности. Этот ответ не помогает вообще. –
Обычно вы можете передать объект контекста классу non activity и использовать его, когда необходим контекст, и у вас нет активности. Однако просить разрешения - это совсем другая история. – Pedram
@Gabe с одной стороны вы правы, но с другой стороны, вопрос не указывает, откуда собеседник хочет вызвать запрос. Поэтому я считаю, что это правильный ответ. – Opiatefuchs
Если вы хотите запросить разрешение за пределами действия, вы можете создать другой класс и расширить класс из Activity. Используйте конструктор, чтобы получить и установить Context для класса.
public class Permissions extends Activity {
private static final int MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE = 1;
private Context context;
public Permissions(Context context) {
this.context = context;
}
public void checkWriteExternalStoragePermission() {
final int MY_PERMISSIONS_REQUEST_PHONE_CALL = 1;
ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((Activity) context,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(context, "Permission Granted", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Permission Denied", Toast.LENGTH_SHORT).show();
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
}
Теперь создайте объект create и передайте контекст конструктору везде, где вам нужно запросить разрешения.
Permissions permissions = new Permissions(SplashScreen.this);
permissions.checkWriteExternalStoragePermission();
Однако есть недостатки этого подхода, что объект может сохранять ссылку на контекст Activity даже после уничтожения активности, что может привести к утечке памяти. –
Это обман. Ваш код фактически не использует тот факт, что Permissions - это Activity, так как вы не передаете его requestPermissions(). Если бы вы это сделали, это потерпит неудачу. Вместо этого вы передаете данный Контекст requestPermissions(), считая, что это Activity. Но вопрос в том, что делать, если вообще нет активности? – Lev
Просто предупреждение для тех, кто не знает лучше, не используйте этот код! –
Можно вызвать requestPermissions() из-за пределов вашей деятельности, но в вашем классе вы должны иметь контекст этого действия.
ActivityCompat.requestPermissions((Activity)context, new String[]{permission.READ_PHONE_STATE}, REQUEST_CODE);
Для того, чтобы работать, вы должны реализовать ниже метод в вашей деятельности
onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)
Так что этот метод переопределения получить казнить, если пользователь кран разрешить или кнопку отказать во всплывающем
Вы можете использовать библиотеку Easy Permissions.
Андроид требует, чтобы эти запросы поступали из Activity
. С помощью Easy Permissions это уже не проблема, вы можете запросить разрешение в любом месте, пока вы предоставляете Context
. Кроме того, если вы запрашиваете разрешение, которое уже было предоставлено, пользователю не будет предложено.
Полное раскрытие, наша компания управляет и развивает это свободно использовать библиотеку. При этом мы уверены, что это полезный инструмент, и мы не будем делиться им иначе.
Это не имеет для меня никакого смысла. Если у Android действительно было требование использовать активность для запроса разрешений, ваша библиотека должна была быть чистой магией, потому что это могло сделать невозможное. По правде говоря, вы используете контекст. Это то же самое, что и стандартный checkSelfPermission(). Я не вижу реального преимущества в использовании сторонней библиотеки для этой проверки разрешения. Может быть, я что-то пропустил ... –
@ TheincredibleJan Спасибо за то, что вышли. Android требует «Активность». «Контекст» необходим для библиотеки, как это делают многие библиотеки - это волшебство, но все же оно основано в реальном мире :). Самое большое преимущество заключается в том, что вы можете запросить разрешение на разрешение из любого места, даже класса, который не является «Activity». Кроме того, последняя версия позволит вам автоматически включить все разрешения, которые находятся в файле 'Manifest'. На странице GitHub есть пример приложения; если у вас есть несколько минут, вы обязательно должны это проверить. Пожалуйста, сообщите нам, если у вас есть еще вопросы. –
- 1. Модель Android M: запрашивает разрешение, используемое внешним банком
- 2. Разрешение на использование Android M
- 3. Запросите разрешение SYSTEM на Android M?
- 4. UILocalNotification запрашивает разрешение пользователей
- 5. Android: Узнайте, какая сторонняя библиотека запрашивает разрешение?
- 6. Facebook API Android запрашивает дополнительное разрешение
- 7. Android <использование-разрешение> не запрашивает разрешение
- 8. CLLocation снова запрашивает разрешение
- 9. Как запросить разрешение в новом Android M?
- 10. Android M разрешение испытанной READ_PHONE_STATE (опасные разрешений)
- 11. Запросить разрешение на микрофон на Android M
- 12. Разница в тексте ответа, разрешение Android M
- 13. Android M - Разрешение камеры отклонено. PERMISSION_GRANTED
- 14. Android-разрешение для андроида M не работает
- 15. Почему Android-разрешение активности намерения возвращает null?
- 16. CoreLocation запрашивает разрешение каждый раз
- 17. UIWebView запрашивает разрешение на размещение
- 18. Facebook не запрашивает разрешение user_birthday
- 19. Почему приложение запрашивает разрешение без записи его в очевидных
- 20. Android Контекст без активности? И другое программирование без активности?
- 21. Разрешение изображения для фона активности
- 22. Проблема с разрешениями для Android M 6.0
- 23. Обновление приложения Android M и разрешение для адаптера синхронизации
- 24. Нет услуг без активности? (Android)
- 25. Android Wearable app без активности
- 26. Android M email complete
- 27. Android: запуск экрана без создания новой активности
- 28. Приложение для защиты Android запрашивает разрешение при записи звука
- 29. Xamarin Forms запрашивает интернет-разрешение Android 6 от PCL
- 30. Сделать разрешение для Android подразумевает другое разрешение
Деятельность по настройке также является хорошим местом для решения этой проблемы. Хотя пользователь может перейти на экран разрешений и аннулировать все ранее предоставленные разрешения, так что все-таки понадобится нотификационный подход. Я также подумал о том, чтобы включить виджет в состояние пользовательского интерфейса с отменой разрешения в качестве альтернативного подхода. –