Sid*_* MA 18 java android android-service android-permissions
我正在尝试从扩展服务的类中打开一个活动。当应用程序不在前台/未使用时,我正在执行此任务。我可以在日志中看到我的服务类触发了带有 Intent.FLAG_ACTIVITY_NEW_TASK 标志的启动活动。但是活动打不开。但是当应用程序处于前台/正在使用时服务触发相同的活动时,活动会打开。
经过几次搜索,我发现我需要在应用程序设置的其他权限部分中手动授予“在后台运行时显示弹出窗口”权限。
显示在其他应用程序权限 SYSTEM_ALERT_WINDOW 上只能访问“显示弹出窗口”。
在上图中,SYSTEM_ALERT_WINDOW 只会授予您对“显示弹出窗口”的访问权限,如果应用程序处于前台/正在使用,则此方法可以正常工作,但如果授予标记为红色的权限,您将可以直接从类中打开任何活动延伸服务。
如何检查或要求用户授予“在后台运行时显示弹出窗口”权限?或者此权限是否受到限制?
我看到像 Whatsapp 这样的应用程序默认选中了这个。
这是开发人员在小米设备中的常见问题,
我们目前的解决方案是将用户重定向到other permissions屏幕并让用户手动授予权限:
if ("xiaomi" == Build.MANUFACTURER.toLowerCase(Locale.ROOT)) {
val intent = Intent("miui.intent.action.APP_PERM_EDITOR")
intent.setClassName("com.miui.securitycenter",
"com.miui.permcenter.permissions.PermissionsEditorActivity")
intent.putExtra("extra_pkgname", getPackageName())
startActivity(intent)
}
Run Code Online (Sandbox Code Playgroud)
Settings.canDrawOverlays(this)仅当用户提供了显示弹出窗口时,您才可以用于测试,这意味着应用程序可以在系统 ui 上绘制。
无法验证其他两个权限是否用户已授予它们:
services和broadcast小智 6
由于没有官方方法来检查“在后台运行时显示弹出窗口”权限,因此我使用了一个小技巧来检查权限。
检查应用程序是否可以绘制如下所示的叠加层,然后如果设备是小米,则将用户导航到如下所示的特定设置屏幕。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
if ("xiaomi".equals(Build.MANUFACTURER.toLowerCase(Locale.ROOT))) {
final Intent intent =new Intent("miui.intent.action.APP_PERM_EDITOR");
intent.setClassName("com.miui.securitycenter",
"com.miui.permcenter.permissions.PermissionsEditorActivity");
intent.putExtra("extra_pkgname", getPackageName());
new AlertDialog.Builder(this)
.setTitle("Please Enable the additional permissions")
.setMessage("You will not receive notifications while the app is in background if you disable these permissions")
.setPositiveButton("Go to Settings", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
startActivity(intent);
}
})
.setIcon(android.R.drawable.ic_dialog_info)
.setCancelable(false)
.show();
}else {
Intent overlaySettings = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
startActivityForResult(overlaySettings, OVERLAY_REQUEST_CODE);
}
}
}
Run Code Online (Sandbox Code Playgroud)
尝试以下代码。
Intent rIntent = context.getPackageManager()
.getLaunchIntentForPackage(context.getPackageName() );
PendingIntent intent = PendingIntent.getActivity(
context, 0,
rIntent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
manager.set(AlarmManager.RTC, System.currentTimeMillis(), intent);
System.exit(2);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10034 次 |
| 最近记录: |