权限获取弹窗 #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()) {
onRequestPermissionFinish()
}
private val settingActivityResultAwait =
registerForActivityResult(ActivityResultContracts.StartActivityForResult())
private val requestPermissionResult =
registerForActivityResult(ActivityResultContracts.RequestPermission())
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?) {
super.onCreate(savedInstanceState)
val rationale = intent.getStringExtra(KEY_RATIONALE)
val requestCode = intent.getIntExtra(KEY_INPUT_PERMISSIONS_CODE, 1000)
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) {
lifecycleScope.launch {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
&& requestPermissionResult.launch(Permissions.POST_NOTIFICATIONS)
) {
onRequestPermissionFinish()
} 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()
}
}
showSettingDialog(permissions, rationale) {
try {
requestPermissionsResult.launch(permissions)
} 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()
if (rationale.isNullOrEmpty()) {
finish()
onOk.invoke()
return
}
rationaleDialog = MaterialAlertDialogBuilder(this)
.setTitle(R.string.dialog_title)
.setMessage(rationale)
.setPositiveButton(R.string.dialog_setting) { _, _ ->
onOk.invoke()
}
.setPositiveButton(R.string.dialog_setting) { _, _ -> onOk() }
.setNegativeButton(R.string.dialog_cancel) { _, _ ->
RequestPlugins.sRequestCallback?.onRequestPermissionsResult(
permissions,
IntArray(0)
permissions, IntArray(0)
)
finish()
}.setOnCancelListener {
}
.setOnCancelListener {
RequestPlugins.sRequestCallback?.onRequestPermissionsResult(
permissions,
IntArray(0)
permissions, IntArray(0)
)
finish()
}
@@ -75,9 +75,7 @@ internal class Request : OnRequestPermissionsResultCallback {
} else if (deniedPermissions.contains(Permissions.POST_NOTIFICATIONS)) {
toNotificationSetting(deniedPermissions)
} 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()) {
appCtx.startActivity<PermissionActivity> {
putExtra(PermissionActivity.KEY_RATIONALE, rationale)
@@ -113,10 +111,8 @@ internal class Request : OnRequestPermissionsResultCallback {
}
Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!powerManager.isIgnoringBatteryOptimizations(appCtx.packageName)) {
deniedPermissionList.add(permission)
}
if (!powerManager.isIgnoringBatteryOptimizations(appCtx.packageName)) {
deniedPermissionList.add(permission)
}
}
@@ -140,7 +136,7 @@ internal class Request : OnRequestPermissionsResultCallback {
private fun onPermissionsGranted() {
try {
grantedCallback?.onPermissionsGranted()
} catch (ignore: Exception) {
} catch (_: Exception) {
}
RequestPlugins.sResultCallback?.onPermissionsGranted()
@@ -149,7 +145,7 @@ internal class Request : OnRequestPermissionsResultCallback {
private fun onPermissionsDenied(deniedPermissions: Array<String>) {
try {
deniedCallback?.onPermissionsDenied(deniedPermissions)
} catch (ignore: Exception) {
} catch (_: Exception) {
}
RequestPlugins.sResultCallback?.onPermissionsDenied(deniedPermissions)
@@ -225,4 +221,5 @@ internal class Request : OnRequestPermissionsResultCallback {
const val TYPE_REQUEST_NOTIFICATIONS = 4
const val TYPE_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = 5
}
}
@@ -90,6 +90,11 @@ class OtherConfigFragment : PreferenceFragment(),
preferenceManager.sharedPreferences?.unregisterOnSharedPreferenceChangeListener(this)
}
override fun onResume() {
super.onResume()
updatePermissionSummary()
}
override fun onPreferenceTreeClick(preference: Preference): Boolean {
when (preference.key) {
PreferKey.userAgent -> showUserAgentDialog()
@@ -288,17 +293,22 @@ class OtherConfigFragment : PreferenceFragment(),
}
private fun checkPermission(int: Int) {
if (int == 1) {
PermissionsCompat.Builder()
.addPermissions(Permissions.POST_NOTIFICATIONS)
.rationale(R.string.notification_permission_rationale)
.request()
}
if (int == 2 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
PermissionsCompat.Builder()
.addPermissions(Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
.rationale(R.string.ignore_battery_permission_rationale)
.request()
when (int) {
1 -> {
PermissionsCompat.Builder()
.addPermissions(Permissions.POST_NOTIFICATIONS)
.rationale(R.string.notification_permission_rationale)
.onGranted { updatePermissionSummary() }
.request()
}
2 -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
PermissionsCompat.Builder()
.addPermissions(Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
.rationale(R.string.ignore_battery_permission_rationale)
.request()
}
}
}
}