从Android 6.0开始,如果是危险权限,都需要经过用户授权才能使用,我们在写项目的时候往往需要弹出窗口询问用户是否授权,称为运行时权限。本文章对运行时权限进行简单总结

一、危险权限列表
Android手机有很多权限,分为普通权限和危险权限。普通权限是不涉及用户隐私的(比如说网络权限),开发者只需要在AndroidManifest声明就能随意使用,危险权限是比较重要的权限(比如说读取联系人、短信、位置等),除了要在AndroidManifest中声明,还需要经过用户授权才能使用,大概分为9组24个权限

注意:用户一旦授权了其中一个权限(名),该权限所在的权限组中的其他权限也会同时被授权

%title插图%num

二、申请权限
1、AndroidManifest声明
首先要把需要的权限在AndroidManifest声明,比如说我们申请 通话、读写、位置权限

<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>
<uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION”/>
<uses-permission android:name=”android.permission.READ_PHONE_STATE”/>

2、layout布局
就放两个button,分别用于申请单个和多个权限

activity_main.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:tools=”http://schemas.android.com/tools”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:orientation=”vertical”
android:gravity=”center”
tools:context=”.MainActivity”>

<Button
android:id=”@+id/btn_single”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”单个权限”/>
<Button
android:id=”@+id/btn_multiple”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”多个权限”/>

</LinearLayout>

3、java代码
MaiActivity.java

public class MainActivity extends AppCompatActivity implements View .OnClickListener{
private Button btn_single,btn_multiple;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btn_single = findViewById(R.id.btn_single);
btn_single.setOnClickListener(this);
btn_multiple = findViewById(R.id.btn_multiple);
btn_multiple.setOnClickListener(this);
}

@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_single:
requestPermission_single();//申请单个权限
break;
case R.id.btn_multiple:
requestPermission_multiple();//申请多个权限
break;
default:
break;
}
}
private void requestPermission_single(){
……
}
private void requestPermission_multiple(){
……
}

//不管用户是否授权,都会回调这个函数
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
……
}
}

4、申请单个权限
private void requestPermission_single(){
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}else {
Log.e(“11111111”, “requestPermission_single: 已经获得写入权限了”);//处理自己的代码
}
}

 

5、申请多个权限
private void requestPermission_multiple(){
List<String> permissionList = new ArrayList<>();
if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!permissionList.isEmpty()){
String[] permissions = permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(MainActivity.this,permissions,2);
}else {
Log.e(“222222222”, “requestPermission_multiple: 已经获得所有权限”);//处理自己的代码
}
}

6、处理申请结果
//不管用户是否授权,都会回调这个函数
@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){
Log.e(“1111111”, “onRequestPermissionsResult: 申请单个权限授权成功” );//处理自己的代码
}else{
Log.e(“1111111”, “onRequestPermissionsResult: 申请单个权限授权失败” );
}
break;
case 2:
if (grantResults.length>0){
for (int result : grantResults){
if (result != PackageManager.PERMISSION_GRANTED){
Log.e(“2222222222”, “onRequestPermissionsResult: 用户拒*了一个或多个权限”);
return;
}
}
//处理自己的代码
Log.e(“2222222222”, “onRequestPermissionsResult: 用户授权了所有权限”);//处理自己的代码
}else {
Log.e(“2222222222”, “onRequestPermissionsResult: 程序运行错误” );
}
break;
default:
break;
}
}

————————————————