2015-07-19 4 views

ответ

4

Нет, это невозможно. Что вы можете сделать, так это отправить уведомление, в котором пользователь может нажать, а затем использовать действие для запроса/управления разрешением (возможно, с диалоговой темой).

+1

Деятельность по настройке также является хорошим местом для решения этой проблемы. Хотя пользователь может перейти на экран разрешений и аннулировать все ранее предоставленные разрешения, так что все-таки понадобится нотификационный подход. Я также подумал о том, чтобы включить виджет в состояние пользовательского интерфейса с отменой разрешения в качестве альтернативного подхода. –

1

Вы можете запросить разрешение только из Activity или из фрагмента.

Выясните точку в вашей деятельности или фрагменте, где вы чувствуете, что приложение потребует разрешения, а затем вызывает метод запросаPermission. отправка уведомления не будет работать, потому что вы хотите, чтобы ваш код обрабатывал un-till, пока вы не получили запрашиваемые разрешения, а затем возобновите свою функциональность с помощью метода onRequestPermissionResult().

4

Я думаю, что это возможно, чтобы запросить разрешение за пределами той или иной деятельности, до тех пор, пока вы используете метод

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)

Это метод, который будет обрабатывать запрос де результат разрешения.

+16

Внешняя сторона действия означает Службу или BroadcastReceiver, где у вас вообще нет активности. Этот ответ не помогает вообще. –

+0

Обычно вы можете передать объект контекста классу non activity и использовать его, когда необходим контекст, и у вас нет активности. Однако просить разрешения - это совсем другая история. – Pedram

+0

@Gabe с одной стороны вы правы, но с другой стороны, вопрос не указывает, откуда собеседник хочет вызвать запрос. Поэтому я считаю, что это правильный ответ. – Opiatefuchs

8

Если вы хотите запросить разрешение за пределами действия, вы можете создать другой класс и расширить класс из 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(); 
+3

Однако есть недостатки этого подхода, что объект может сохранять ссылку на контекст Activity даже после уничтожения активности, что может привести к утечке памяти. –

+6

Это обман. Ваш код фактически не использует тот факт, что Permissions - это Activity, так как вы не передаете его requestPermissions(). Если бы вы это сделали, это потерпит неудачу. Вместо этого вы передаете данный Контекст requestPermissions(), считая, что это Activity. Но вопрос в том, что делать, если вообще нет активности? – Lev

+7

Просто предупреждение для тех, кто не знает лучше, не используйте этот код! –

-1

Можно вызвать requestPermissions() из-за пределов вашей деятельности, но в вашем классе вы должны иметь контекст этого действия.

ActivityCompat.requestPermissions((Activity)context, new String[]{permission.READ_PHONE_STATE}, REQUEST_CODE); 

Для того, чтобы работать, вы должны реализовать ниже метод в вашей деятельности

onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults) 

Так что этот метод переопределения получить казнить, если пользователь кран разрешить или кнопку отказать во всплывающем

0

Вы можете использовать библиотеку Easy Permissions.

Андроид требует, чтобы эти запросы поступали из Activity. С помощью Easy Permissions это уже не проблема, вы можете запросить разрешение в любом месте, пока вы предоставляете Context. Кроме того, если вы запрашиваете разрешение, которое уже было предоставлено, пользователю не будет предложено.

enter image description here

Полное раскрытие, наша компания управляет и развивает это свободно использовать библиотеку. При этом мы уверены, что это полезный инструмент, и мы не будем делиться им иначе.

+0

Это не имеет для меня никакого смысла. Если у Android действительно было требование использовать активность для запроса разрешений, ваша библиотека должна была быть чистой магией, потому что это могло сделать невозможное. По правде говоря, вы используете контекст. Это то же самое, что и стандартный checkSelfPermission(). Я не вижу реального преимущества в использовании сторонней библиотеки для этой проверки разрешения. Может быть, я что-то пропустил ... –

+0

@ TheincredibleJan Спасибо за то, что вышли. Android требует «Активность». «Контекст» необходим для библиотеки, как это делают многие библиотеки - это волшебство, но все же оно основано в реальном мире :). Самое большое преимущество заключается в том, что вы можете запросить разрешение на разрешение из любого места, даже класса, который не является «Activity». Кроме того, последняя версия позволит вам автоматически включить все разрешения, которые находятся в файле 'Manifest'. На странице GitHub есть пример приложения; если у вас есть несколько минут, вы обязательно должны это проверить. Пожалуйста, сообщите нам, если у вас есть еще вопросы. –

Смежные вопросы