我正在尝试编写一个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的新手,在花了好几个小时之后仍然无法解决这个问题。任何帮助将受到高度赞赏。
提前致谢。
答案 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));