我的应用程序需要获得绘制其他应用程序才能正常工作的权限,因此在应用程序启动时我会检查权限,如果需要,请让用户授予它,然后通过以下代码启动请求:
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + activity.getPackageName()));
activity.startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION);
这要求用户在启用权限后按下后退按钮,但我注意到某些应用程序能够在用户启用后自动返回或转到其他活动。这是如何完成的?是否有在后台监听的服务定期检查用户是否启用了某些内容?
答案 0 :(得分:3)
似乎无法观察此设置,因此实际上没有优雅的解决方案。
您可以做的只是在将用户发送到“设置”屏幕后,使用处理程序每秒检查一次设置。
你无法真正"回去"从“设置”屏幕以编程方式进行,因此唯一的选择是重新启动活动并清除之前的活动(否则它将在之后的背面按回到“设置”屏幕)。
通过以下示例,在启用设置的一秒钟内,它将重新启动MainActivity。
首先定义Runnable:
Handler handler = new Handler();
Runnable checkOverlaySetting = new Runnable() {
@Override
@TargetApi(23)
public void run() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return;
}
if (Settings.canDrawOverlays(MainActivity.this)) {
//You have the permission, re-launch MainActivity
Intent i = new Intent(MainActivity.this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
return;
}
handler.postDelayed(this, 1000);
}
};
然后在将用户发送到“设置”屏幕时启动Runnable:
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
//Add this here:
handler.postDelayed(checkOverlaySetting, 1000);
请注意,您应设置超时或最大尝试次数,以便在用户未启用叠加设置时它不会永远继续。
答案 1 :(得分:0)
回溯的另一种方法是跟踪请求代码,然后跟踪finishActivity
int REQ_CODE = 0;
public void requestPermission(){
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getContext().getPackageName()));
startActivityForResult(intent, REQ_CODE);
}
public void onPermissionChanged(){
runOnUiThread(new Runnable() {
@Override
public void run() {
finishActivity(REQ_CODE);
}
});
}