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