我注意到自从Android O出现以来,Settings.canDrawOverlays
的功能有问题告诉我们应用程序是否被授予了纵向绘制权限(AKA“显示在其他应用程序上”),所以我已经报道了这个:
不确定为什么它们被标记为已修复,但是现在我已经在我的Pixel 2上使用Android 8.1进行了测试,我注意到这个函数仍然总是返回false(所以我已经报告了这个here )。
事情是,我已经尝试找到替代方案,并在StackOverflow上看到其他人也有这个问题:
我不知道这是Android 8.1的问题,还是只是我的Pixel 2,但我使用的是最新的rom版本(OPM171019.013)。
我已经尝试了上述链接中建议的所有解决方案。
所有这些都归还给我的结果是永远不会授予许可。
我发现的唯一解决办法就是this one,它只是告诉我权限已被切换。
“解决”这个问题的一种方法是假设在通过Play商店安装应用程序时授予了权限,因为从那里安装时默认授予该权限。
但这不是一个好的解决方案。可以从Play商店外部安装应用,用户可以随时手动关闭此权限。
编辑:我不知道这是否是一个可能的“解决方案”,因为当我尝试应用程序时,即使获得了许可,我也无法真正吸引人。
如何确定当前应用是否获得此权限?
从哪个Android版本出现此问题?或许这只是Pixel 2的一个问题?
即使在获得许可后,该应用仍无法在顶部绘制,是否有可能的解决方案?
答案 0 :(得分:1)
我遇到了同样的问题,函数Settings.canDrawOverlays
存在问题,因为当您授予权限时需要重启才能返回true,请尝试这些。
我有一个调用Config Activity的按钮来启用Overlay
public void setOverlayPermissions(){
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:"+getPackageName()));
startActivityForResult(intent,app.REQUEST_ID_OVERLAY_PERMISSIONS);
}
之后,在onActivityResult函数中
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == app.REQUEST_ID_OVERLAY_PERMISSIONS){
new WaitingFor().execute();
}
}
然后
private class WaitingFor extends AsyncTask{
private ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setCancelable(false);
progressDialog.setMessage("Espera un momento...");
progressDialog.show();
}
@Override
protected Object doInBackground(Object[] objects) {
try{
Thread.sleep(2000);
}catch (Exception ex){
Log.e(TAG,ex.getMessage()+"");
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
progressDialog.dismiss();
if(verifyWindowOverlay()){
FL.w(TAG,"Acepto Overlay");
setPaso2();
}else{
FL.w(TAG,"NO acepto Overlay [Permission error]");
Toast.makeText(MainActivity.this,"Falta configuracion, reintenta!", Toast.LENGTH_SHORT).show();
}
}
}
我的verifyWindowsOverlay函数
public boolean verifyWindowOverlay(){
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
return true;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Build.VERSION.SDK_INT < Build.VERSION_CODES.N)
return Settings.canDrawOverlays(this);
if(appOpsMgr.checkOpNoThrow(AppOpsManager.OPSTR_SYSTEM_ALERT_WINDOW, android.os.Process.myUid(), getPackageName()) == 0 || Settings.canDrawOverlays(this))
return true;
return false;
}
祝你好运。