Android 动态申请权限问题【转】

Android 动态申请权限问题

感谢大佬:https://www.jianshu.com/p/2324a2bdb3d4
感谢大佬:https://blog.csdn.net/weixin_42910064/article/details/89219002

Android6.0以上的系统中,引入了运行时权限检查,运行时权限分为正常权限和危险权限,当我们的App调用了需要危险权限的api时,需要向系统申请权限,系统会弹出一个对话框让用户感知,只有当用户授权以后,App才能正常调用api。
关于危险权限的说明,请参阅官方文档:https://developer.android.google.cn/guide/topics/security/permissions#normal-dangerous


第一位大佬博文:

Android 9.0 关于ACTION_CALL无权限导致闪退的问题

18年年底毕业,开始从事android研发,对application层有兴趣,于是自学使用Android studio对app的简单开发。其实上学的时候学了一点用eclipse实现的UI设计,不过现在用着studio,就是 真香。
人生第一篇CSDN的博文,废话不多说,切入主题。

学习到用Intent启用程序的method,跟着书上写了一个拨打电话的示例。Intent的action采用ACTION_CALL, 同时Data采用自己的电话号码。

在XML中添加button,写好布局后,在MainActivity中添加具体函数

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void callmyself(View v){				//添加button onclick响应函数
        Intent it = new Intent();
        it.setAction(Intent.ACTION_CALL);		//ACTION_CALL实现拨号
        it.setData(Uri.parse("tel:+86***********"));//实现具体拨什么号
        startActivity(it);
    }

书中也提示到要添加拨号权限。在AndroidManifest中添加权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.pao.penghao6.test">

<uses-permission android:name="android.permission.CALL_PHONE" /> //添加权限

<application
...................................
</application>
</manifest>

直接运行一下试试。结果再点击button的时候就crash down了。
出现如下结果
在这里插入图片描述
log如下:

.at com.pao.penghao6.test.twoActivity.callmyself(MainActivity.java:33)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.am.ActivityStackSupervisor.checkStartAnyActivityPermission(ActivityStackSupervisor.java:1788)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:717)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:544)
at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1099)
at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:486)

显然这么简单的程序,如果不是SDK对Intent有很大的更新的话,因该不是这些内置函数的问题,看log还是不懂发生了什么。

后来想如果ACTION_CALL导致activity起不来的话,那我可以换一个可以起来的action,来验证问题就是ACTION_CALL。
于是修改了setAction

it.setAction(Intent.ACTION_VIEW);

再次运行,于是得到一下结果

在这里插入图片描述

能够正确打开拨号界面,并填入data的数据,ACTION_CALL实现。这样确定了问题就是出在ACTION_CALL这里

于是又百度了好久。很多博文都说需要确认权限是否添加。但之前已经在AndroidManifest中添加。所以一直没想通。直到看到一个回复说Android6以上需要动态开启权限。这才回归正道。于是查阅动态开启权限的方法。修改代码如下

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two);
    }
    public void goback(View v){
        finish();
    }
    public void callmyself(View v){
        Intent it = new Intent();
        //调用checkSelfPermission检查是否有权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)== PackageManager.PERMISSION_GRANTED) {
            it.setAction(Intent.ACTION_CALL);//有权限则直接ACTION_CALL
            it.setData(Uri.parse("tel:+86***********"));
            startActivity(it);
        }else{
            ActivityCompat.requestPermissions(this,new String []{Manifest.permission.CALL_PHONE},1);//无权限则询问开启权限
            it.setAction(Intent.ACTION_CALL);
            it.setData(Uri.parse("tel:+86***********"));
            startActivity(it);
        }
    }

最终终于看到询问权限开启的提示框
在这里插入图片描述
用实机run,收到来电。
在这里插入图片描述

总结

1.需要在AndroidManifest中添加权限
2.对较新版本的Android,需要采用动态权限调用

3.动态申请函数:

public static void requestPermissions(Activity activity,String[] permissions,int requestCode)

4.检测权限函数:

 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)== PackageManager.PERMISSION_GRANTED) 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值