Android Cordova插件中的请求权限不会提示用户

时间:2016-01-18 13:10:32

标签: android cordova ionic-framework cordova-plugins cordova-5.0.0

我正在尝试编写一个Cordova插件,让Facebook聊天头像离线混合应用程序的浮动图标,需要SYSTEM_ALERT_WINDOW权限。

由于Android M向前要求用户在应用首次启动时授予权限,因此我尝试使用Cordova插件的cordova.requestPermission(CordovaPlugin plugin, int requestCode, String permission)方法来提示用户授予权限(如{{3}中所示) })。

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

首次启动时,应用程序不会提示权限请求活动,而是打印“Permission Denied”。

我是Ionic和Cordova的新手,在花了好几个小时之后仍然无法解决这个问题。任何帮助将受到高度赞赏。

提前致谢。

1 个答案:

答案 0 :(得分:3)

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