权限获取弹窗 #270

This commit is contained in:
HapeLee
2025-11-11 19:10:51 +08:00
parent 9e3b934dbe
commit bbf4dd60e0
3 changed files with 48 additions and 128 deletions
@@ -29,113 +29,28 @@ class PermissionActivity : AppCompatActivity() {
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
onRequestPermissionFinish() onRequestPermissionFinish()
} }
private val settingActivityResultAwait =
registerForActivityResult(ActivityResultContracts.StartActivityForResult())
private val requestPermissionResult =
registerForActivityResult(ActivityResultContracts.RequestPermission())
private val requestPermissionsResult = private val requestPermissionsResult =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { result ->
if (result.values.all { it }) {
onRequestPermissionFinish()
} else {
openSettingsActivity()
}
}
@SuppressLint("BatteryLife")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
val rationale = intent.getStringExtra(KEY_RATIONALE) val rationale = intent.getStringExtra(KEY_RATIONALE)
val requestCode = intent.getIntExtra(KEY_INPUT_PERMISSIONS_CODE, 1000)
val permissions = intent.getStringArrayExtra(KEY_INPUT_PERMISSIONS)!! val permissions = intent.getStringArrayExtra(KEY_INPUT_PERMISSIONS)!!
when (intent.getIntExtra(KEY_INPUT_REQUEST_TYPE, Request.TYPE_REQUEST_PERMISSION)) {
//权限请求
Request.TYPE_REQUEST_PERMISSION -> showSettingDialog(permissions, rationale) {
lifecycleScope.launch {
try {
val result = requestPermissionsResult.launch(permissions)
if (result.values.all { it }) {
onRequestPermissionFinish()
} else {
openSettingsActivity()
}
} catch (e: Exception) {
AppLog.put("请求权限出错\n$e", e, true)
RequestPlugins.sRequestCallback?.onError(e)
finish()
}
}
}
//跳转到设置界面
Request.TYPE_REQUEST_SETTING -> showSettingDialog(permissions, rationale) {
openSettingsActivity()
}
//所有文件的管理权限
Request.TYPE_MANAGE_ALL_FILES_ACCESS -> showSettingDialog(permissions, rationale) {
try {
if (Permissions.isManageExternalStorage()) {
val settingIntent =
Intent(
Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,
"package:$packageName".toUri()
)
settingActivityResult.launch(settingIntent)
} else {
throw NoStackTraceException("no MANAGE_ALL_FILES_ACCESS_PERMISSION")
}
} catch (e: Exception) {
AppLog.put("请求所有文件的管理权限出错\n$e", e, true)
RequestPlugins.sRequestCallback?.onError(e)
finish()
}
}
Request.TYPE_REQUEST_NOTIFICATIONS -> showSettingDialog(permissions, rationale) { showSettingDialog(permissions, rationale) {
lifecycleScope.launch { try {
try { requestPermissionsResult.launch(permissions)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU } catch (e: Exception) {
&& requestPermissionResult.launch(Permissions.POST_NOTIFICATIONS) AppLog.put("请求权限出错\n$e", e, true)
) { RequestPlugins.sRequestCallback?.onError(e)
onRequestPermissionFinish() finish()
} else
intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS
intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
intent.putExtra(Settings.EXTRA_CHANNEL_ID, applicationInfo.uid)
settingActivityResult.launch(intent)
} catch (e: Exception) {
AppLog.put("请求通知权限出错\n$e", e, true)
RequestPlugins.sRequestCallback?.onError(e)
finish()
}
}
} }
Request.TYPE_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS -> showSettingDialog(
permissions, rationale
) {
lifecycleScope.launch {
try {
val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
intent.setData("package:$packageName".toUri())
val className =
"com.android.settings.fuelgauge.RequestIgnoreBatteryOptimizations"
val activities = packageManager.queryIntentActivities(
intent,
PackageManager.MATCH_DEFAULT_ONLY
)
if (activities.any { it.activityInfo.name == className }) {
val component = intent.resolveActivity(packageManager)
if (component.className != className) {
intent.setClassName("com.android.settings", className)
settingActivityResultAwait.launch(intent)
}
}
intent.component = null
settingActivityResult.launch(intent)
} catch (e: Exception) {
AppLog.put("请求后台权限出错\n$e", e, true)
RequestPlugins.sRequestCallback?.onError(e)
finish()
}
}
}
}
onBackPressedDispatcher.addCallback(this) {
} }
} }
@@ -189,25 +104,23 @@ class PermissionActivity : AppCompatActivity() {
) { ) {
rationaleDialog?.dismiss() rationaleDialog?.dismiss()
if (rationale.isNullOrEmpty()) { if (rationale.isNullOrEmpty()) {
finish() onOk.invoke()
return return
} }
rationaleDialog = MaterialAlertDialogBuilder(this) rationaleDialog = MaterialAlertDialogBuilder(this)
.setTitle(R.string.dialog_title) .setTitle(R.string.dialog_title)
.setMessage(rationale) .setMessage(rationale)
.setPositiveButton(R.string.dialog_setting) { _, _ -> .setPositiveButton(R.string.dialog_setting) { _, _ -> onOk() }
onOk.invoke()
}
.setNegativeButton(R.string.dialog_cancel) { _, _ -> .setNegativeButton(R.string.dialog_cancel) { _, _ ->
RequestPlugins.sRequestCallback?.onRequestPermissionsResult( RequestPlugins.sRequestCallback?.onRequestPermissionsResult(
permissions, permissions, IntArray(0)
IntArray(0)
) )
finish() finish()
}.setOnCancelListener { }
.setOnCancelListener {
RequestPlugins.sRequestCallback?.onRequestPermissionsResult( RequestPlugins.sRequestCallback?.onRequestPermissionsResult(
permissions, permissions, IntArray(0)
IntArray(0)
) )
finish() finish()
} }
@@ -75,9 +75,7 @@ internal class Request : OnRequestPermissionsResultCallback {
} else if (deniedPermissions.contains(Permissions.POST_NOTIFICATIONS)) { } else if (deniedPermissions.contains(Permissions.POST_NOTIFICATIONS)) {
toNotificationSetting(deniedPermissions) toNotificationSetting(deniedPermissions)
} else if (deniedPermissions.contains(Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)) { } else if (deniedPermissions.contains(Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { toIgnoreBatterySetting(deniedPermissions)
toIgnoreBatterySetting(deniedPermissions)
}
} else if (deniedPermissions.isNotEmpty()) { } else if (deniedPermissions.isNotEmpty()) {
appCtx.startActivity<PermissionActivity> { appCtx.startActivity<PermissionActivity> {
putExtra(PermissionActivity.KEY_RATIONALE, rationale) putExtra(PermissionActivity.KEY_RATIONALE, rationale)
@@ -113,10 +111,8 @@ internal class Request : OnRequestPermissionsResultCallback {
} }
Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS -> { Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!powerManager.isIgnoringBatteryOptimizations(appCtx.packageName)) {
if (!powerManager.isIgnoringBatteryOptimizations(appCtx.packageName)) { deniedPermissionList.add(permission)
deniedPermissionList.add(permission)
}
} }
} }
@@ -140,7 +136,7 @@ internal class Request : OnRequestPermissionsResultCallback {
private fun onPermissionsGranted() { private fun onPermissionsGranted() {
try { try {
grantedCallback?.onPermissionsGranted() grantedCallback?.onPermissionsGranted()
} catch (ignore: Exception) { } catch (_: Exception) {
} }
RequestPlugins.sResultCallback?.onPermissionsGranted() RequestPlugins.sResultCallback?.onPermissionsGranted()
@@ -149,7 +145,7 @@ internal class Request : OnRequestPermissionsResultCallback {
private fun onPermissionsDenied(deniedPermissions: Array<String>) { private fun onPermissionsDenied(deniedPermissions: Array<String>) {
try { try {
deniedCallback?.onPermissionsDenied(deniedPermissions) deniedCallback?.onPermissionsDenied(deniedPermissions)
} catch (ignore: Exception) { } catch (_: Exception) {
} }
RequestPlugins.sResultCallback?.onPermissionsDenied(deniedPermissions) RequestPlugins.sResultCallback?.onPermissionsDenied(deniedPermissions)
@@ -225,4 +221,5 @@ internal class Request : OnRequestPermissionsResultCallback {
const val TYPE_REQUEST_NOTIFICATIONS = 4 const val TYPE_REQUEST_NOTIFICATIONS = 4
const val TYPE_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = 5 const val TYPE_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = 5
} }
} }
@@ -90,6 +90,11 @@ class OtherConfigFragment : PreferenceFragment(),
preferenceManager.sharedPreferences?.unregisterOnSharedPreferenceChangeListener(this) preferenceManager.sharedPreferences?.unregisterOnSharedPreferenceChangeListener(this)
} }
override fun onResume() {
super.onResume()
updatePermissionSummary()
}
override fun onPreferenceTreeClick(preference: Preference): Boolean { override fun onPreferenceTreeClick(preference: Preference): Boolean {
when (preference.key) { when (preference.key) {
PreferKey.userAgent -> showUserAgentDialog() PreferKey.userAgent -> showUserAgentDialog()
@@ -288,17 +293,22 @@ class OtherConfigFragment : PreferenceFragment(),
} }
private fun checkPermission(int: Int) { private fun checkPermission(int: Int) {
if (int == 1) { when (int) {
PermissionsCompat.Builder() 1 -> {
.addPermissions(Permissions.POST_NOTIFICATIONS) PermissionsCompat.Builder()
.rationale(R.string.notification_permission_rationale) .addPermissions(Permissions.POST_NOTIFICATIONS)
.request() .rationale(R.string.notification_permission_rationale)
} .onGranted { updatePermissionSummary() }
if (int == 2 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { .request()
PermissionsCompat.Builder() }
.addPermissions(Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) 2 -> {
.rationale(R.string.ignore_battery_permission_rationale) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
.request() PermissionsCompat.Builder()
.addPermissions(Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
.rationale(R.string.ignore_battery_permission_rationale)
.request()
}
}
} }
} }