安卓系统的权限管理机制从API 23 (也就是Android 6.0 又叫做 Android M,)之后发生了比较大的改变,在一些比较危险的权限上要求必须申请动态权限,即使你在AndroidMainfest.xml文件中申请也没有任何用,或者你可以将编译的目标版本设定这API 22,这样就可以了。但这并不是长久之计,不是吗?所以因此在这里学习一下。
if (Build.VERSION.SDK_INT>=23) { //此处做动态权限申请 } else { //低于23 不需要特殊处理 } }
/** * Determine whether <em>you</em> have been granted a particular permission.* * @param permission The name of the permission being checked. * * @return {@linkandroid.content.pm.PackageManager#PERMISSION_GRANTED} if you have the * permission, or {@link android.content.pm.PackageManager#PERMISSION_DENIED} if not. * * @see android.content.pm.PackageManager#checkPermission(String, String) */public static int checkSelfPermission(@NonNull Context context, @NonNull String permission) { if (permission == null) { throw new IllegalArgumentException("permission is null"); } return context.checkPermission(permission, android.os.Process.myPid(), Process.myUid());}
ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE);
if (Build.VERSION.SDK_INT>=23) { int request=ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA); if (request!= PackageManager.PERMISSION_GRANTED)//缺少权限,进行权限申请 { ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},825638); return;// }else { //权限同意 } } else { //低于23 不需要特殊处理,去掉用拍照的方法 }
//参数 requestCode是我们在申请权限的时候使用的唯一的申请码//String[] permission则是权限列表,一般用不到//int[] grantResults 是用户的操作响应,包含这权限是够请求成功//由于在权限申请的时候,我们就申请了一个权限,所以此处的数组的长度都是1@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode==123) { //当然权限多了,建议使用Switch,不必纠结于此 if (grantResults[0]==PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "权限申请成功", Toast.LENGTH_SHORT).show(); }else if (grantResults[0]== PackageManager.PERMISSION_DENIED) { Toast.makeText(this, "权限申请失败,用户拒绝权限", Toast.LENGTH_SHORT).show(); } }}
package cn.wuhu.authority;import android.Manifest;import android.content.pm.PackageManager;import android.os.Build;import android.support.annotation.NonNull;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v4.content.PermissionChecker;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Toast;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onTakePhoto(); } }); } public void onTakePhoto() { if (Build.VERSION.SDK_INT>=23) { int request=ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA); if (request!= PackageManager.PERMISSION_GRANTED)//缺少权限,进行权限申请 { ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},123); return;// } else { //权限同意,不需要处理,去掉用拍照的方法 Toast.makeText(this,"权限同意",Toast.LENGTH_SHORT).show(); } } else{ //低于23 不需要特殊处理,去掉用拍照的方法 } } //参数 requestCode是我们在申请权限的时候使用的唯一的申请码 //String[] permission则是权限列表,一般用不到 //int[] grantResults 是用户的操作响应,包含这权限是够请求成功 //由于在权限申请的时候,我们就申请了一个权限,所以此处的数组的长度都是1 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode==123) { //当然权限多了,建议使用Switch,不必纠结于此 if (grantResults[0]==PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "权限申请成功",Toast.LENGTH_SHORT).show(); }else if (grantResults[0]== PackageManager.PERMISSION_DENIED) { Toast.makeText(this, "权限申请失败,用户拒绝权限", Toast.LENGTH_SHORT).show(); } } }}