在Android 8.1& Pixel 2上,如何在顶部绘图并检查此权限?

时间:2018-01-27 18:03:58

标签: android permissions

背景

我注意到自从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商店外部安装应用,用户可以随时手动关闭此权限。

编辑:我不知道这是否是一个可能的“解决方案”,因为当我尝试应用程序时,即使获得了许可,我也无法真正吸引人。

问题

  1. 如何确定当前应用是否获得此权限?

  2. 从哪个Android版本出现此问题?或许这只是Pixel 2的一个问题?

  3. 即使在获得许可后,该应用仍无法在顶部绘制,是否有可能的解决方案?

  4. 编辑:与其他人交谈,我认为这是Pixel 2与Android 8.1的一个非常具体的问题。原因是这个问题似乎没有出现在Android 8.1的其他设备上。我希望它得到修复。

1 个答案:

答案 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;
}
祝你好运。