写给初学者29_android_安卓权限机制
来源:互联网 发布:java设计实训学校 编辑:程序博客网 时间:2024/06/01 11:45
安卓29_安卓权限机制
很多人普片都知道访问一些系统资源的时候,或者一些系统设置的时候,比如网络设置,我们需要去申请权限,但是普片都不知道为什么安卓要设置这样的东西,又为什么会提出运行时权限。
安卓权限机制
一些操作是风险操作,也就是会涉及的用户安全问题上的操作,那么来进行这些操作的时候,安卓会以权限的形势来做,在6.0以前,我们安装一个程序可以在安装界面就发现很多的权限申请,而且如果我们拒绝某一项的话,APP就安装不了,十分的蛋疼。所以在6.0以后提出了运行时权限,当用户的操作需要权限的时候,我们再申请,这样的方式更加合理,用户体验也更加的好。
权限分类
- 普通权限
- 危险权限
- 特殊权限
特殊权限可以不作考虑,所有的权限都可以在安卓的开发者网站上查看到,这里给一个中文的连接https://developer.android.google.cn/guide/topics/security/permissions.html
分类的目的是提升体验,不是所有东西都会涉及到安全问题的,用户也不想翻来覆去不挺的授权,系统会对普通权限自动授权,而危险权限就需要注意了,这是应该询问用户的操作。
那么我们需要注意的是,危险权限在6.0之前在manifest中声明就好,而在6.0以后,注入了运行权限机制以后,我们就需要全新的写法,不然就会发现程序要6.0以前完美运行,6.0以后直接爆炸、
运行权限写法
这里以危险权限种的CALL_PHONE作为例子
6.0以前的写法
1.申请权限
<uses-permission android:name="android.permission.CALL_PHONE"/>
2.启动系统拨号界面
private void callPhone(String phoneNumber) throws SecurityException{ Intent intent = new Intent(Intent.ACTION_CALL); Intent intent1 = intent.setData(Uri.parse("tel:" + phoneNumber)); startActivity(intent);}
6.0以前的手机都能很好的运行这段代码,但是6.0以后就不可以了,会直接出错。因为6.0以后我们需要使用运行时权限的写法了。也很容易理解,这里打电话都还好,如果发短信这样的权限,在安装时就允许,而且一些粗心的用户根本也不看,那么后面出现安全问题,问题就很严重了,也可以看出安卓这么做实在是用心良苦。
6.0以后的写法
public class NextActivity extends AppCompatActivity { final int REQUEST_CAllPHONE_CODE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_next); findViewById(R.id.callBtn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (ContextCompat.checkSelfPermission(NextActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(NextActivity.this, new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CAllPHONE_CODE); } else callPhone("10000"); } }); } private void callPhone(String phoneNumber) throws SecurityException { Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + phoneNumber)); startActivity(intent); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case REQUEST_CAllPHONE_CODE: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) callPhone("10000"); else Toast.makeText(this, "没有允许该权限", Toast.LENGTH_SHORT).show(); break; } }}
流程解析
多数人会觉得参数好多,很麻烦,前面不太懂为什么的话,理解参数的意义就会好很多了。
- 写给初学者29_android_安卓权限机制
- 写给初学者01_android_什么是安卓
- 写给初学者04_android_安卓的视图
- 写给初学者32_android_安卓UI体验的升级-1
- 写给初学者33_android_安卓UI体验的升级-2
- 写给初学者30_android_安卓异步处理
- 写给初学者02_android_常用工具
- 写给初学者03_android_第一个安卓程序
- 写给初学者03_android_第一个安卓程序
- 写给初学者14_android_界面代码优化
- 写给初学者16_android_常用控件_ListView
- 写给初学者17_Android_四大组件-Activity
- 写给初学者18_android_四大组件_Service
- 写给初学者20_android_四大组件_BroadCastReciver
- 写给初学者22_android_百分比布局
- 写给初学者08_android_一些常用的控件
- 写给初学者09_android_效果标签_shape_形状标签
- 写给初学者12_android_界面总结_初步
- 简谈反射
- 四月英语——你是人间四月天
- Linux 常用命令
- mysql---存储引擎
- HDOJ 2000 ASCII码排序
- 写给初学者29_android_安卓权限机制
- Android期末复习(3)-service
- Java的join()方法
- Python input和raw_input
- Qt-QML-Connections,接受组件信号
- Shell脚本 一 批量修改文件名
- Global.asax 文件是什么
- Wormholes
- 实例探索Java模式之路——工厂方法模式