3

我正在嘗試編寫一個Cordova插件,讓Facebook聊天頭像浮動圖標,用於需要SYSTEM_ALERT_WINDOW權限的離子混合應用程序。在Android Cordova插件的請求權限不會提示用戶

由於Android M向前版本要求用戶在應用程序第一次啓動時授予權限,因此我試圖使用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"); 
    } 
} 

在第一次啓動時,應用程序不會提示權限請求活動,而是日誌打印「權限被拒絕」。

我是Ionic和Cordova的新手,在花費數小時後仍然無法工作。任何幫助將不勝感激。

在此先感謝。

+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));