我有一个Android应用程序,是一款VoIP应用。当有人打电话时,我们会显示一个来电屏幕。这个功能正常工作,但在一些红米设备(Note 7 Pro)上,如果设备被锁定,来电屏幕就不会出现,只能听到声音。
通过调试,我发现需要启用“在锁定屏幕上显示”权限才能正常工作。一旦我启用它,它就按预期开始工作。 我的问题是,我想通过在运行时以编程方式检查此权限来改善用户界面体验,但不幸的是,我找不到任何可以让我检查此权限的内容。 在红米设备上是否可能实现?
通过调试,我发现需要启用“在锁定屏幕上显示”权限才能正常工作。一旦我启用它,它就按预期开始工作。 我的问题是,我想通过在运行时以编程方式检查此权限来改善用户界面体验,但不幸的是,我找不到任何可以让我检查此权限的内容。 在红米设备上是否可能实现?
作为一个在Glance(壁纸轮播)上工作的人,这是小米设备锁屏上的一个产品,此权限仅由小米授予。默认情况下,仅授予一组预装应用程序和将其添加到小米的priv-permission 允许列表中并获得白名单才能获得此权限。
你可以尝试下面的代码,它可能会帮助你解决问题。
if (Build.MANUFACTURER.equals("Xiaomi",true)) {
val intent = Intent("miui.intent.action.APP_PERM_EDITOR")
intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity")
intent.putExtra("extra_pkgname", packageName)
startActivity(intent)
}
我也一样,我只能展示如何检查这个权限:
private fun isShowOnLockScreenPermissionEnable(): Boolean? {
return try {
val manager = context.getSystemService(APP_OPS_SERVICE) as AppOpsManager
val method: Method = AppOpsManager::class.java.getDeclaredMethod(
"checkOpNoThrow",
Int::class.javaPrimitiveType,
Int::class.javaPrimitiveType,
String::class.java
)
val result = method.invoke(manager, 10020, Binder.getCallingUid(), context.packageName) as Int
AppOpsManager.MODE_ALLOWED == result
} catch (e: Exception) {
null
}
}
使用以下代码检查是否已授予锁屏权限:
private fun isShowOnLockScreenPermissionEnable(): Boolean {
return try {
val manager = context.getSystemService(APP_OPS_SERVICE) as AppOpsManager
val method: Method = AppOpsManager::class.java.getDeclaredMethod(
"checkOpNoThrow",
Int::class.javaPrimitiveType,
Int::class.javaPrimitiveType,
String::class.java
)
val result =
method.invoke(manager, 10020, Binder.getCallingUid(), context.packageName) as Int
AppOpsManager.MODE_ALLOWED == result
} catch (e: Exception) {
false
}
}
现在使用以下代码将用户导航到权限屏幕
if(isShowOnLockScreenPermissionEnable()){
Toast.makeText(this, "Permission is already granted!!", Toast.LENGTH_SHORT).show()
}else{
if (Build.MANUFACTURER.equals("Xiaomi", true)) {
val intent = Intent("miui.intent.action.APP_PERM_EDITOR")
intent.setClassName(
"com.miui.securitycenter",
"com.miui.permcenter.permissions.PermissionsEditorActivity"
)
intent.putExtra("extra_pkgname", packageName)
startActivity(intent)
}
}