就像AlexTa所说的那样。但我想实际编写代码来为某人节省时间:
private fun hasPermission(): Boolean {
val appOps = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
} else {
return false
}
return appOps.checkOpNoThrow(AppOpsManager.OPSTR_PICTURE_IN_PICTURE, android.os.Process.myUid(), packageName) == AppOpsManager.MODE_ALLOWED
}
AppOpsManager.checkOp(String op,int uid,String packageName)
方法,其中op
是 OPSTR_PICTURE_IN_PICTURE 操作。 如果支持画中画操作,则该方法应返回 MODE_ALLOWED 常量。
要了解更多信息,请查看此链接。可能我来晚了,但这就是答案。
private fun hasPermission(): Boolean {
val appOps = getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager?
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
appOps?.unsafeCheckOpNoThrow(AppOpsManager.OPSTR_PICTURE_IN_PICTURE, android.os.Process.myUid(), packageName) == AppOpsManager.MODE_ALLOWED
} else {
appOps?.checkOpNoThrow(AppOpsManager.OPSTR_PICTURE_IN_PICTURE, android.os.Process.myUid(), packageName) == AppOpsManager.MODE_ALLOWED
}
} else {
false
}
}
在Android 26+(奥利奥)及以上版本中可以获得权限。
在Android 24+中,默认情况下允许所有应用程序使用该权限。
在Android 23及更低版本中不可用,正如其他答案中所提到的。
因此,正确的逻辑应该是:
private fun hasPipPermission(context: Context): Boolean {
val appOps = context.getSystemService(Context.APP_OPS_SERVICE) as? AppOpsManager?
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val mode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
appOps?.unsafeCheckOpNoThrow(
AppOpsManager.OPSTR_PICTURE_IN_PICTURE,
android.os.Process.myUid(),
context.packageName
)
} else {
@Suppress("DEPRECATION")
appOps?.checkOpNoThrow(
AppOpsManager.OPSTR_PICTURE_IN_PICTURE,
android.os.Process.myUid(),
context.packageName
)
}
mode == AppOpsManager.MODE_ALLOWED
} else {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
}
}
OPSTR_PICTURE_IN_PICTURE
是从 OREO 开始提供的... 所以它甚至不适用于 Nougat,而在这里有 KitKat... - user924OPSTR_PICTURE_IN_PICTURE
从OREO开始就可用了...所以它甚至不适用于Nougat,更别说KitKat了... - undefined