Android 6.0(API 23)及其以上需要动态申请权限
首先,需要在AndroidManifest.xml静态申请权限,否则无法动态申请权限
注意:如果应用程序请求在AndroidManifest中列出的危险权限,
并且应用程序已经在同一权限组中具有另一个危险权限,
系统会立即授予权限,而不会与用户进行任何交互。
例如,如果一个应用程序先前已经请求并被授予READ_CONTACTS权限,
然后它请求WRITE_CONTACTS(同属于联系人一组),
系统会立即授予该权限,不会再弹出权限授予询问的对话框。
需要用户手动赋予的权限( Dangerous Permissions)
| 所属权限组 | 权限 | 
|---|---|
| 日历 | READ_CALENDAR | 
| 日历 | WRITE_CALENDAR | 
| 相机 | CAMERA | 
| 联系人 | READ_CONTACTS | 
| 联系人 | WRITE_CONTACTS | 
| 联系人 | GET_ACCOUNTS | 
| 位置 | ACCESS_FINE_LOCATION | 
| 位置 | ACCESS_COARSE_LOCATION | 
| 麦克风 | RECORD_AUDIO | 
| 电话 | READ_PHONE_STATE | 
| 电话 | CALL_PHONE | 
| 电话 | READ_CALL_LOG | 
| 电话 | WRITE_CALL_LOG | 
| 电话 | ADD_VOICEMAIL | 
| 电话 | USE_SIP | 
| 电话 | PROCESS_OUTGOING_CALLS | 
| 传感器 | BODY_SENSORS | 
| 短信 | SEND_SMS | 
| 短信 | RECEIVE_SMS | 
| 短信 | READ_SMS | 
| 短信 | RECEIVE_WAP_PUSH | 
| 短信 | RECEIVE_MMS | 
| 存储 | READ_EXTERNAL_STORAGE | 
| 存储 | WRITE_EXTERNAL_STORAGE | 
<uses-permission android:name="android.permission.上表的权限字符" |> 放在 <application>标签之上
代码封装
权限检测1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28/**
 * 检查权限的工具类
 * <p/>
 * Created by wangchenlong on 16/1/26.
 */
public class PermissionsChecker {
	private final Context mContext;
	public PermissionsChecker(Context context) {
		mContext = context.getApplicationContext();
	}
	// 判断权限集合
	public boolean lacksPermissions(String... permissions) {
		for (String permission : permissions) {
			if (lacksPermission(permission)) {
				return true;
			}
		}
		return false;
	}
	// 判断是否缺少权限
	private boolean lacksPermission(String permission) {
		return ContextCompat.checkSelfPermission(mContext, permission) ==
				PackageManager.PERMISSION_DENIED;
	}
}
权限获取页面
activity_permissions.xml1
2
3
4
5
6
7
8
9
10<?xml version="1.0" encoding="utf-8"?>
<View
    android:id="@+id/image"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:adjustViewBounds="true"
    android:background="#88888888"
    android:contentDescription="@null"/>
| 1 | /** | 
在需要申请权限的页面使用
定义权限参数:1
2
3
4
5
6
7
8private static final int REQUEST_CODE = 0; // 请求码
private boolean hasPermissions = true;//权限申请标志,可以在onResume()用此标志来判断是否需要申请权限逻辑
   private PermissionsChecker mPermissionsChecker; // 权限检测器
   // 所需的全部权限
   static final String[] PERMISSIONS = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
           Manifest.permission.READ_EXTERNAL_STORAGE,
           Manifest.permission.CAMERA
           };
在Oncreate()等地方初始化:1
2
3
4
5	mPermissionsChecker = new PermissionsChecker(mActivity);
// 缺少权限时, 进入权限配置页面
        if (Build.VERSION.SDK_INT >= 23 && mPermissionsChecker.lacksPermissions(PERMISSIONS)) {
            PermissionsActivity.startActivityForResult(this, REQUEST_CODE, PERMISSIONS);
        }
处理权限申请结果:1
2
3
4
5
6
7
8
9
10
11
12@Override
  public void onActivityResult(int requestCode, int resultCode, Intent data)
  {
      super.onActivityResult(requestCode, resultCode, data);
      if (requestCode == REQUEST_CODE && resultCode == PermissionsActivity.PERMISSIONS_DENIED) {
          hasPermissions = false;
	//没有申请权限,这里做一些逻辑处理,比如退出应用
      }else if(requestCode == REQUEST_CODE && resultCode == PermissionsActivity.PERMISSIONS_GRANTED)
{
	hasPermissions = true;
}
  }
