权限获取弹窗 #270
This commit is contained in:
@@ -29,30 +29,23 @@ 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 ->
|
||||||
|
|
||||||
@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 }) {
|
if (result.values.all { it }) {
|
||||||
onRequestPermissionFinish()
|
onRequestPermissionFinish()
|
||||||
} else {
|
} else {
|
||||||
openSettingsActivity()
|
openSettingsActivity()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
val rationale = intent.getStringExtra(KEY_RATIONALE)
|
||||||
|
val permissions = intent.getStringArrayExtra(KEY_INPUT_PERMISSIONS)!!
|
||||||
|
|
||||||
|
showSettingDialog(permissions, rationale) {
|
||||||
|
try {
|
||||||
|
requestPermissionsResult.launch(permissions)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
AppLog.put("请求权限出错\n$e", e, true)
|
AppLog.put("请求权限出错\n$e", e, true)
|
||||||
RequestPlugins.sRequestCallback?.onError(e)
|
RequestPlugins.sRequestCallback?.onError(e)
|
||||||
@@ -60,84 +53,6 @@ class PermissionActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//跳转到设置界面
|
|
||||||
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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun onRequestPermissionFinish() {
|
private fun onRequestPermissionFinish() {
|
||||||
RequestPlugins.sRequestCallback?.onSettingActivityResult()
|
RequestPlugins.sRequestCallback?.onSettingActivityResult()
|
||||||
@@ -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,12 +111,10 @@ 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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
if (
|
if (
|
||||||
@@ -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,19 +293,24 @@ class OtherConfigFragment : PreferenceFragment(),
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun checkPermission(int: Int) {
|
private fun checkPermission(int: Int) {
|
||||||
if (int == 1) {
|
when (int) {
|
||||||
|
1 -> {
|
||||||
PermissionsCompat.Builder()
|
PermissionsCompat.Builder()
|
||||||
.addPermissions(Permissions.POST_NOTIFICATIONS)
|
.addPermissions(Permissions.POST_NOTIFICATIONS)
|
||||||
.rationale(R.string.notification_permission_rationale)
|
.rationale(R.string.notification_permission_rationale)
|
||||||
|
.onGranted { updatePermissionSummary() }
|
||||||
.request()
|
.request()
|
||||||
}
|
}
|
||||||
if (int == 2 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
2 -> {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
PermissionsCompat.Builder()
|
PermissionsCompat.Builder()
|
||||||
.addPermissions(Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
|
.addPermissions(Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
|
||||||
.rationale(R.string.ignore_battery_permission_rationale)
|
.rationale(R.string.ignore_battery_permission_rationale)
|
||||||
.request()
|
.request()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressLint("InflateParams")
|
@SuppressLint("InflateParams")
|
||||||
private fun showUserAgentDialog() {
|
private fun showUserAgentDialog() {
|
||||||
|
|||||||
Reference in New Issue
Block a user