记得在android6.0以前,应用需要权限只要在androidManifest.xml配置就可以了。为了安全的考虑,android 6.0开始使用动态申请权限,除了在androidManifest.xml配置以外,还需要在代码里面控制权限申请,虽然权限的申请变复杂了,但是对于用户来说更安全了。但也并不是所有的权限都要动态申请。需要申请的权限如下所示:
Permission Group | Permissions |
---|---|
CALENDAR | |
CAMERA | |
CONTACTS | |
LOCATION | |
MICROPHONE | |
PHONE | |
SENSORS | |
SMS | |
STORAGE |
权限申请的代码参考如下:
public class MainActivity extends AppCompatActivity {
TextView showMsgTv;
Button onClickBtn;
private final int CAMERA_REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showMsgTv = (TextView) findViewById(R.id.show_msg_tv);
onClickBtn = (Button) findViewById(R.id.onClick_btn);
}
public void onBtnClick(View v) {
requestPermission();
}
@TargetApi(Build.VERSION_CODES.M)
private void requestPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
//第一次请求权限时,如果用户拒绝,下一次请求该方法返回true。里面向用户解释为什么需要这个权限
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
new AlertDialog.Builder(this).setMessage("申请相机权限").setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
}
}).show();
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
}
} else {
showMsgTv.setTextColor(Color.GREEN);
showMsgTv.setText("相机权限已申请");
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == CAMERA_REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
showMsgTv.setTextColor(Color.GREEN);
showMsgTv.setText("相机权限已开通");
Toast.makeText(this, "相机权限已被开通", Toast.LENGTH_SHORT).show();
} else {
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
Toast.makeText(this, "相机权限已被禁止", Toast.LENGTH_SHORT).show();
}
}
}
}
}