权限获取弹窗 #270
This commit is contained in:
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user