Android进阶之路 - 设置中关闭权限,返回app应用崩溃

以前没太注意这样的场景,没想到竟然遇到了,篇内的解决方式感觉太暴力,效果也不好,先做记录吧

在应用内跳转应用设置,动态变更权限后出现了不一样的场景

  • 开启权限返回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 权限适配

Android6.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);
        }
    }

调试结果:savedInstanceStatenull是正常启动的情况,savedInstanceState有数据,是修改过权限,返回当前页面的情况,所以根据有没有数据,可以决定是否重新打开启动页。
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远方那座山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值