Return 请求 SYSTEM_ALERT_WINDOW 权限后应用
Return to app after requesting SYSTEM_ALERT_WINDOW permission
我的应用程序需要权限才能覆盖其他应用程序才能正常工作,因此在应用程序启动时我会检查权限,如果需要,请要求用户授予它,然后通过以下代码启动请求:
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + activity.getPackageName()));
activity.startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION);
这需要用户在启用权限后按下后退按钮,但我注意到某些应用程序能够在用户启用后自动return或转到另一个activity。这是如何实现的?是否有在后台侦听的服务定期检查用户是否启用了某些功能?
看来这个设置没法观察,所以真的没有优雅的解决办法。
您可以做的是在将用户发送到“设置”屏幕后使用处理程序每秒检查一次设置。
您无法真正从“设置”屏幕以编程方式 "go back",因此唯一的选择是重新启动 Activity 并清除之前的设置(否则它将返回到“设置”后按后退屏幕)。
在下面的示例中,启用设置后的一秒内,它将重新启动 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);
请注意,您应该设置超时或最大尝试次数,这样如果用户未启用覆盖设置,它就不会永远持续下去。
另一种返回方法是跟踪请求代码,然后 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);
}
});
}
我的应用程序需要权限才能覆盖其他应用程序才能正常工作,因此在应用程序启动时我会检查权限,如果需要,请要求用户授予它,然后通过以下代码启动请求:
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + activity.getPackageName()));
activity.startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION);
这需要用户在启用权限后按下后退按钮,但我注意到某些应用程序能够在用户启用后自动return或转到另一个activity。这是如何实现的?是否有在后台侦听的服务定期检查用户是否启用了某些功能?
看来这个设置没法观察,所以真的没有优雅的解决办法。
您可以做的是在将用户发送到“设置”屏幕后使用处理程序每秒检查一次设置。
您无法真正从“设置”屏幕以编程方式 "go back",因此唯一的选择是重新启动 Activity 并清除之前的设置(否则它将返回到“设置”后按后退屏幕)。
在下面的示例中,启用设置后的一秒内,它将重新启动 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);
请注意,您应该设置超时或最大尝试次数,这样如果用户未启用覆盖设置,它就不会永远持续下去。
另一种返回方法是跟踪请求代码,然后 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);
}
});
}