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)
Android 动态申请权限问题【转】的更多相关文章
- android:动态申请权限(一)
环境: android版本6.0 对应SDK版本23 动态申请权限说明:所有动态申请的权限,必须在AndroidManifest.xml中进行声明 步骤 1.新建一个android工程 默认创建即可 ...
- Android 动态申请权限
AndroidManifest.xml(清单文件)添加需要的权限 <uses-permission android:name="android.permission.ACCESS_CO ...
- Android之动态申请权限(API23以上需求)
API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全. 这里以单个存储权限为例: · 在 Manifest 中添加访问权限:(只需设置可写,因为可写 ...
- Android无需申请权限拨打电话
Android打电话有两种实现方法: 第一种方法,拨打电话跳转到拨号界面.源代码如下: Intent intent = new Intent(Intent.ACTION_DIAL); Uri data ...
- 说说Android6.0动态申请权限的那些坑
白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒. 首先要知道哪些坑,就得先了解一些定义和基本使用方式. 那么先介绍一下动态申请的权限分组情况. 下面的权限组是由谷歌官方定义的,目 ...
- Android6.0动态申请权限那些坑--以及避免用户选择不再提示后无法获取权限的问题
Android 6.0 为了保护用户隐私,将一些权限的申请放在了应用运行的时候去申请, 比如以往的开发中,开发人员只需要将需要的权限在清单文件中配置即可,安装后用户可以在设置中的应用信息中看到:XX应 ...
- Android动态获取权限
android权限的变化 在Android6.0以前的版本的时候,Android的权限都是在安装的时候全部的配置完成的.然而这往往会造成一些安全的问题. Google的解决办法: 将Android中的 ...
- flutter 动态申请权限
https://pub.flutter-io.cn/packages/permission_handler https://www.jianshu.com/p/fa68876fbdfd 例 Futur ...
- Android6.0动态申请权限
先直接看代码: public void onClick(View v){ onCallPermission(); } public void onCallPermission(){ if (Build ...
随机推荐
- Linux搜索查找类
find find将从指定目录下递归地遍历各个子目录,将满足条件的文件或目录显示在终端,如果没有则不显示 基本语法 find 搜索范围 [选项] 选项说明 选项 功能 -name 按照文件名查找 -u ...
- CentOS 7 如何清空文件内容
https://www.cnblogs.com/zqifa/p/linux-vim-4.html 方法1.在非编辑状态下使用快捷键gg跳至首行头部,再使用dG即可清空,或 输入"%d&quo ...
- MySQL 截取小数位数
项目中遇到一些有关小数位数截取的问题,留下痕迹,以便后续使用时注意:个人推荐使用方法2),直接四舍五入 1)select FORMAT(1478568.2457,2): 查询出来的结果为: ,每隔3位 ...
- [ flask ] flask-restful 实现嵌套的有关系的输出字段
问题描述: 1. 先说明数据关系:有用户,和菜谱.一个用户可以拥有多个菜谱:一对多的关系 2. resources/users.py 的输出字段: user_fields = { 'id':fiel ...
- Python多环境管理神器(pipenv)
pipenv 参考官网:https://pipenv.pypa.io/ pipenv 是一款比较新的包管理工具,其借鉴了 javascript 的 npm 和 PHP 的 composer 等理念,通 ...
- Typora中本地图片无法上传CSDN解决方案
解决方法 本地图片无法上传,我们可以选择使用在线免费图床 把想要使用的图先上传到图床后复制对应的MarkDown语句到typora即可 在这里,给大家推荐一个图床 [图床链接](Image Uploa ...
- 读《疯狂Java讲义》笔记总结一
最近在读<疯狂Java讲义>,现把其中遇到的一些自己以前没掌握的点儿记录下来. 1.字符串相关 字符串不是基本类型,字符串是一个类,也就是一个引用类型. 字符串转int类型String a ...
- 《剑指offer》面试题56 - I. 数组中数字出现的次数
问题描述 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 1: 输入:nums = [4,1 ...
- linux中链接错误的时候,快速找到缺失的符号在哪个库中
编译一个opencv程序,链接的时候出现大量的如下错误: /home/admin/opencv/opencv-master/modules/imgproc/src/color_lab.cpp:23: ...
- 【记录一个问题】android下的ucontext协程,因为使用栈上的对象,导致cv::Mat被莫名析构
工作的流程是这样:某个协程在栈上创建task对象,在task对象内有需要返回的cv::Mat. 然后把task放到另一个线程上去执行,然后切换到别的协程,等到工作线程执行完task后,再唤醒协程. 这 ...