以前没太注意这样的场景,没想到竟然遇到了,篇内的解决方式感觉太暴力,效果也不好,先做记录吧
在应用内跳转应用设置,动态变更权限后出现了不一样的场景
开启权限返回app时,可正常使用;
关闭权限返回app时,app会崩溃,同步会出现白屏
需求场景
在项目中有这样一个权限需求,样式如下
权限判断
首先判断是否有对应权限
,有则显示已开启
,反之为未开启
/**
* 判断是否有相机权限
* */
fun getPermissions():Boolean{
val pm = packageManager
return PackageManager.PERMISSION_GRANTED ==
pm.checkPermission(Manifest.permission.CAMERA, getPackageName(this))
//"com.jsmedia.jsmanager"
}
/**
* 判断是否有定位权限
* */
fun getLocPermissions():Boolean{
val pm = packageManager
return PackageManager.PERMISSION_GRANTED ==
pm.checkPermission(Manifest.permission.ACCESS_FINE_LOCATION, getPackageName(this))
}
/**
* [获取应用程序版本名称信息]
* @param context
* @return 当前应用的版本名称
*/
@Synchronized
fun getPackageName(context: Context): String? {
try {
val packageManager = context.packageManager
val packageInfo = packageManager.getPackageInfo(
context.packageName, 0
)
Log.e("tag",packageInfo.packageName)
return packageInfo.packageName
} catch (e: Exception) {
e.printStackTrace()
}
return null
}
跳转 - 权限设置
/**
* 跳转应用权限设置页面(系统)
* */
private fun toSelfSetting(context: Context) {
val mIntent = Intent()
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
if (Build.VERSION.SDK_INT >= 9) {
mIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS")
mIntent.setData(Uri.fromParts("package", context.packageName, null))
} else if (Build.VERSION.SDK_INT <= 8) {
mIntent.setAction(Intent.ACTION_VIEW)
mIntent.setClassName("com.android.settings", "com.android.setting.InstalledAppDetails")
mIntent.putExtra("com.android.settings.ApplicationPkgName", context.packageName)
}
context.startActivity(mIntent)
}
权限变更
注意:主要发生在应用权限关闭的场景下
6.0 权限适配
常规处理:当对应权限关闭时,可以发起权限请求,用户授权即可正常操作,反之永久拒绝授权后,只能去应用设置中开启权限
权限设置 开、关
开
从应用跳转应用设置开启权限后,返回应用内,并不会影响app的正常使用
关(核心点)
从应用跳转应用设置关闭权限后,返回app应用崩溃!!!
网上千篇一律的都是以下的处理方式,都是很多年前的了,奈何任务有点紧,先凑合用,等有时间找到更好的,我再记录一下
解决办法:在一个Activity基类
的onCreate
方法中,判断savedInstanceState
是否为null
,如果为null
,说明是正常启动,如果有数据,就是设置被修改,异常关闭情况下,程序会保存一些数据,所以在有数据的情况下,重新打开启动页。
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.e("onCreate","savedInstanceState:"+savedInstanceState);
if(savedInstanceState!=null){
Intent intent=new Intent(UI.this, SplashActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
}
调试结果:savedInstanceState
:null
是正常启动的情况,savedInstanceState
有数据,是修改过权限,返回当前页面的情况,所以根据有没有数据,可以决定是否重新打开启动页。