返回首页
当前位置: 主页 > 网络编程 > Android教程 >

Android6.0运行时权限概述

时间:2016-12-28 20:35来源:betway必威官网www.etsupport.net 编辑:麦田守望者

问题1:什么是运行时权限?


答:在 Android 系统的第一个版本,权限机制就已经存在了。但是很多软件滥用权限,不管用不用的到都先把权限添加进去,容易造成用户的隐私泄露。SO, Android6.0 系统中引入了运行时权限,更好的保护了用户的安全和隐私。那么本章就是对运行时权限做一些详细解释,并会做一些示例让大家更好的去理解。

问题2:APP不兼容Android6.0,运行权限报错怎么办?


答:APP想要在6.0系统的手机上完美运行,是有解决方案的。如:修改build.gradle文件的targetSdkVersion修改成23以下,这样就可以暂时规避,但是不提倡使用,还是不要偷懒学习之后赶紧给项目升级吧。
targetSdkVersion 22

 

接下来我们就开始我们的主题,首先我们回顾一下过去权限机制是什么样子。只要我们需要的权限,添加到manifest里面就可以了。如:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="app.anchong.net.mybrodcast">

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<application
...
</application>
</manifest>

 

现在我会新建一个项目,带着大家一起操作。不要偷懒,快打开你的编辑器吧。这里呢,我们用打电话功能给大家做示例,因为打电话会涉及用户手机的资费问题,因而被列为了危险权限,首先我们先修改我们的activity_main.xml布局文件,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="app.anchong.net.call.MainActivity">
<Button
android:id="@+id/make_call"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Call Me" />
</RelativeLayout>


我们再布局文件中只是定义了一个按钮,当点击按钮时就会触发拨打电话的逻辑。接着修改MainActivity中的布局,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button make_call= (Button) findViewById(R.id.make_call);
make_call.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);
}else {
Call();
}
}
});
}
//打电话的动作
private void Call(){
try {
Intent intent=new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+10010));
startActivity(intent);
}catch (SecurityException e){
e.printStackTrace();
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 1:
if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
Call();
}else {
Toast.makeText(this, "您拒绝了权限申请", Toast.LENGTH_SHORT).show();
}
break;
}
}

 

代码是不是很多,不要害怕,接下来我会对代码进行详细解释的,我写完是为了让你可以拿走做demo,但你也不能偷懒。一定要再敲一遍。 首先,第一步我们是先判断用户是不是已经给过我们授权了,借助的是
ContextCompat.checkSelfPermission()

 

方法,ContextCompat.checkSelfPermission()接收两个参数,第一个参数不用说是Context,第二个是具体的权名(Manifest.permission.CALLPHONE),然后我们使用方法的返回值和 PackageManager.PERMISSIONGRANTED做比较,相等就说明已经授权了,可以直接调用Call()方法去做打电话的动作(这里我就不做详解了,因为打电话的代码都特别简单,这里为了避免报错我加了try)。如果不相等,那么我们会调用ActivityCompat.requestPermissions()方法进行申请授权,requestPermissions里面有3个参数,第一个是Activity的实例,第二个是String数组,第三个是请求码,只要是唯一值就可以,这里我们传1.
调用完了requestPermissions()方法之后,系统会弹出一个权限申请的对话框,不管用户点击同意与否,系统都会调取onRequestPermissionsResult()方法,而授权的结果都在grantResults参数当中,在这里我们判断一下授权结果,如果用户同意我们就调用Call()方法拨打电话,如果用户不同意,就会在用户再点击拨打电话的时候弹出权限申请窗口。

顶一下
(1)
100%
踩一下
(0)
0%
标签(Tag):Android 运行时权限
------分隔线----------------------------
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片