Android中的权限
Android 6.0及以上版本采用了新的权限机制,将权限分为两类。
Normal Permissions
这类权限一般不涉及用户隐私,不需要用户进行动态授权,只需要在
AndroidManifest.xml中声明即可使用,比如使用蓝牙和访问网络等(安装时权限)Dangerous Permissions
一般涉及用户隐私,除了需要在
AndroidManifest.xml中声明,还需要在运行时,进行动态权限申请,由用户进行授权,比如打电话和发短信等(运行时权限)需要动态申请的权限如下:

权限处理流程

声明应用权限
安装时的权限,在清单文件中进行配置,参见 声明应用权限
申请运行时权限
对于运行时权限,需要在代码中请求,参见 请求应用权限
if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
PackageManager.PERMISSION_GRANTED) {
// 已获得授权,可以调用API
} else if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// 向用户说明为什么您的应用需要此权限才能使特定功能正常运行。
// 在此用户界面中,添加“取消”或“不,谢谢”按钮,
// 该按钮允许用户在不授予许可的情况下继续使用您的应用
// showInContextUI(...);
} else {
// 请求权限
requestPermissions(mContext, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
REQUEST_CODE);
}
在Activity中实现回调
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE:
// 如果取消请求,则结果数组为空。
if (grantResults.length > 0 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 已授予权限,进行下步
} else {
// 向用户说明该功能不可用,因为该功能需要用户拒绝的权限。
}
return;
}
// 其他case用以检查可能请求的其他权限
}
EasyPermissions
EasyPermissions 是一个方便开发者的简单高效处理运行时权限的库。EasyPermissions GitHub地址
public class TestActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 检查是否具有指定的权限
if (!EasyPermissions.hasPermissions(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)){
// 请求权限
EasyPermissions.requestPermissions(this, "权限弹窗上的提示语",1001,Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
}
/**
* 重写 onRequestPermissionsResult,用于接受请求结果
*
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//将请求结果传递给EasyPermission库处理
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
/**
* 请求权限成功
*
* @param requestCode
* @param perms
*/
@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
// 用户授权成功
Log.d("TestActivity","onPermissionsGranted");
}
/**
* 请求权限失败
*
* @param requestCode
* @param perms
*/
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
Log.d("TestActivity","onPermissionsDenied");
/**
* 若是在权限弹窗中,用户勾选了'NEVER ASK AGAIN.'或者'不在提示',且拒绝权限。
* 这时候,需要跳转到设置界面去,让用户手动开启。
*/
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
new AppSettingsDialog.Builder(this).build().show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
//当从软件设置界面返回时
case AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE:
Log.d("TestActivity","onActivityResult");
Log.d("TestActivity","hasPermissions="+EasyPermissions.hasPermissions(this, Manifest.permission.WRITE_EXTERNAL_STORAGE));
break;
}
}
}
附录:
运行时权限
group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS
group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR
group:android.permission-group.CAMERA
permission:android.permission.CAMERA
group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS
group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION
group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE
group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO
group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS
关于Android中的所有权限列表,查阅权限文档
Android中的权限机制说明,可查阅官方文档 权限概览
公众号“编程之路从0到1”