3

Я пытаюсь написать плагин Cordova, чтобы иметь чат-чат Facebook, как плавающий значок для ионных гибридных приложений, для которого требуется SYSTEM_ALERT_WINDOW Permission.Запрос разрешения в Android-плагине Cordova не запрашивает пользователя

Поскольку Android M onward требует, чтобы пользователь предоставил разрешение при первом запуске приложения, я пытаюсь использовать метод плагина Cordova cordova.requestPermission(CordovaPlugin plugin, int requestCode, String permission), чтобы предложить пользователю предоставить разрешение (как в documentation).

public class Floatie extends CordovaPlugin { 

    public static final String ACTION_START_FLOATIE = "startFloatie"; 
    public static final int REQUEST_CODE = 0; 
    public static final String DRAW_OVER_OTHER_APPS = Manifest.permission.SYSTEM_ALERT_WINDOW; 
    private CallbackContext callbackContext; 

    @Override 
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { 

     if (action.equals(ACTION_START_FLOATIE)) { 
      String message = args.getString(0); 
      this.callbackContext = callbackContext; 

      if(cordova.hasPermission(DRAW_OVER_OTHER_APPS)) { 
       Log.i("Floatie", "Has Permission"); 
      } 
      else 
      { 
       getPermission(REQUEST_CODE); 
      } 

      return true; 
     } 
     return false; 
    } 

    protected void getPermission(int requestCode) 
    { 
     cordova.requestPermission(this, requestCode, DRAW_OVER_OTHER_APPS); 
    } 

    public void onRequestPermissionResult(int requestCode, String[] permissions, int[] grantResults) throws JSONException 
    { 
     for(int r:grantResults) 
     { 
      if(r == PackageManager.PERMISSION_DENIED) 
      { 
       Log.i("Floatie", "Permission Denied"); 
       return; 
      } 
     } 
     Log.i("Floatie", "Permission Granted"); 
    } 
} 

При первом запуске приложение не запрашивает активность запроса на запрос, и вместо этого журнал печатает «Разрешение отклонено».

Я новичок в Ионном и Кордове и до сих пор не мог справиться с этим, потратив часы на это. Любая помощь будет высоко оценена.

Заранее спасибо.

+0

Я знаю, что это не имеет отношения к вашему вопросу, но вы планируете при создании вашего проекта с открытым исходным кодом? –

ответ

2

Кажется, что SYSTEM_ALERT_WINDOW представляет собой особый случай, который имеет свой собственный механизм запроса разрешения начиная с API 23. Там есть упоминание об этом в System Permissions documentation:

Есть несколько разрешений, которые не ведут себя как нормальные и опасные разрешения. SYSTEM_ALERT_WINDOW и WRITE_SETTINGS особенно чувствительны, поэтому большинство приложений не должны их использовать. Если для приложения требуется одно из этих разрешений, оно должно объявить разрешение в манифесте и отправить намерение, запрашивающее авторизацию пользователя. Система реагирует на намерение, показывая пользователю подробный экран управления. Подробнее о том, как запрашивать эти разрешения, см. В справочных данных SYSTEM_ALERT_WINDOW и WRITE_SETTINGS.

И соответствующее reference entry for SYSTEM_ALERT_WINDOW говорит:

Примечание: Если приложение цели уровень API 23 или выше, пользователь приложения должен явным образом предоставить это разрешение приложения через экран управления разрешения. Приложение запрашивает одобрение пользователя, отправляя намерение с действием ACTION_MANAGE_OVERLAY_PERMISSION. Приложение может проверить, имеет ли он это разрешение, вызывая Settings.canDrawOverlays().

Итак, в двух словах, вы не можете использовать cordova.requestPermission() просить SYSTEM_ALERT_WINDOW, ты должен отправить, что пользовательские намерения:

cordova.getActivity().startActivity(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION));