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)

Android 动态申请权限问题【转】的更多相关文章

  1. android:动态申请权限(一)

    环境: android版本6.0 对应SDK版本23 动态申请权限说明:所有动态申请的权限,必须在AndroidManifest.xml中进行声明 步骤 1.新建一个android工程 默认创建即可 ...

  2. Android 动态申请权限

    AndroidManifest.xml(清单文件)添加需要的权限 <uses-permission android:name="android.permission.ACCESS_CO ...

  3. Android之动态申请权限(API23以上需求)

    API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全. 这里以单个存储权限为例: · 在 Manifest 中添加访问权限:(只需设置可写,因为可写 ...

  4. Android无需申请权限拨打电话

    Android打电话有两种实现方法: 第一种方法,拨打电话跳转到拨号界面.源代码如下: Intent intent = new Intent(Intent.ACTION_DIAL); Uri data ...

  5. 说说Android6.0动态申请权限的那些坑

    白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒. 首先要知道哪些坑,就得先了解一些定义和基本使用方式. 那么先介绍一下动态申请的权限分组情况. 下面的权限组是由谷歌官方定义的,目 ...

  6. Android6.0动态申请权限那些坑--以及避免用户选择不再提示后无法获取权限的问题

    Android 6.0 为了保护用户隐私,将一些权限的申请放在了应用运行的时候去申请, 比如以往的开发中,开发人员只需要将需要的权限在清单文件中配置即可,安装后用户可以在设置中的应用信息中看到:XX应 ...

  7. Android动态获取权限

    android权限的变化 在Android6.0以前的版本的时候,Android的权限都是在安装的时候全部的配置完成的.然而这往往会造成一些安全的问题. Google的解决办法: 将Android中的 ...

  8. flutter 动态申请权限

    https://pub.flutter-io.cn/packages/permission_handler https://www.jianshu.com/p/fa68876fbdfd 例 Futur ...

  9. Android6.0动态申请权限

    先直接看代码: public void onClick(View v){ onCallPermission(); } public void onCallPermission(){ if (Build ...

随机推荐

  1. [python]MergeTxt按列合并同一个文件下多个txt文件

    开发需求:应项目需要,要将记录成txt的实验数据进行按列合并(也即为不同文件上下合并),从而进行机器学习训练. 实验数据类似如此 模拟验证数据 1.txt *****1***** abcdefghij ...

  2. 解决windows update失败,正在还原的问题

    其实这个不算问题,等上几个小时,还原完毕就好了,不过也有快速解决的办法. 所需工具:U盘.光盘等可以进入PE系统的工具,dism++软件 1.下载dism++工具,根据你的系统,选择使用32位还是64 ...

  3. MySQL启用SSL连接

    1.手动创建自认证证书 1.1 创建CA证书 openssl genrsa 2048 > ca-key.pem openssl req -new -x509 -nodes -days 3600 ...

  4. .net core的配置介绍(二):自定义配置(Zookeeper,数据库,Redis)

    上一篇介绍了.net core的配置原理已经系统提供的一些常用的配置,但有时我们的配置是存放在Zookeeper,DB,Redis中的,这就需要我们自己去实现集成了. 这里再介绍几个我们用的多的配置集 ...

  5. C# 服务器发送邮件失败

    邮件发送相关端口 首先说下邮件发送的端口:25/465/587 25端口 25端口是为SMTP协议服务开放的,是这三个端口中最老的一个.25端口也称为消息中继端口,因为这个端口经常被恶意利用,所以现在 ...

  6. 基于GO语言实现的支持高并发订单号生成函数

    1.固定24位长度订单号,毫秒+进程id+序号. 2.同一毫秒内只要不超过一万次并发,则订单号不会重复. github地址:https://github.com/w3liu/go-common/blo ...

  7. python 根据传进来的参数,动态拼接sql

    根据传进来的参数,动态拼接sql,可用于实现一个方法,有些字段不确定,又用到的情况,如查询,三个查询条件,有的时候只用到一个查询条件,其他用不到则不需要拼接 def show_runjob_detai ...

  8. python 字典 分别根据值或键进行排序的方法

    最近经常遇到根据字母出现的频率进行排序的题目 我的思路一般是借用字典统计字母出现的频率 然后对字典按照值进行排序 但是每次按照值进行排序时 都会忘记排序方法 在此记录一下,以加深印象 字典原始值如下: ...

  9. Flask_generate_password_hash的加盐哈希加密算法与check_password_hash的校验

    密码加密简介 密码存储的主要形式: 明文存储:肉眼就可以识别,没有任何安全性. 加密存储:通过一定的变换形式,使得密码原文不易被识别. 密码加密的几类方式: 明文转码加密算法:BASE64, 7BIT ...

  10. Gitlab如何进行备份恢复与迁移?

    https://blog.csdn.net/ouyang_peng/article/details/77070977 1.Gitlab 创建备份 1.1 创建备份文件 首先我们得把老服务器上的Gitl ...