- 最近在工作过程中会遇到,明明已经在AndroidManifest.xml中配置了权限,但是就是没有作用,百度了之后才发现现在在应用系统大于等于6.0的手机上面,需要动态的获取权限。就是当你需要这个权限的时候,需要手机给用户一个提示选择是否同意开启这个权限。
- 看到网上有很多关于这方面的文章,但是大部分都是很随意的copy别人的,看起来好像很麻烦似的,其实动态获取权限就那几行代码就可以搞定。
- 接下来就举一个很常用的需要获取手机IMEI值时需要动态获取权限的例子代码,后面会附送源代码连接。
public static String IMEI = null;
private int WRITE_EXTERNAL_STORAGE_REQUEST_CODE = 1;
String str="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
isOK();
}
// public String getIMEI(Context context){
//
// if (TextUtils.isEmpty(IMEI)){
// TelephonyManager tm = (TelephonyManager)context.getSystemService(context.TELEPHONY_SERVICE);
// IMEI = tm.getDeviceId();
// }
// return IMEI==null?"未知设备":IMEI;
// }
public void isOK(){
int osVersion = Integer.valueOf(android.os.Build.VERSION.SDK);
if (osVersion>22){
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
!= PackageManager.PERMISSION_GRANTED) {
//申请WRITE_EXTERNAL_STORAGE权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE},
WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
}else{
getImei();
}
}else{
//如果SDK小于6.0则不去动态申请权限
getImei();
}
// if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE)
// != PackageManager.PERMISSION_GRANTED) {
// //申请WRITE_EXTERNAL_STORAGE权限
// ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_PHONE_STATE},
// WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
// }else{
// ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_PHONE_STATE},
// WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
// }
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {
getImei();
Toast.makeText(getApplicationContext(),"授权成功",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(),"授权拒绝",Toast.LENGTH_SHORT).show();
}
}
public void getImei(){
TelephonyManager tm = (TelephonyManager)this.getSystemService(this.TELEPHONY_SERVICE);
IMEI = tm.getDeviceId();
String mtype = android.os.Build.MODEL;
Log.d("Main",mtype);
Toast.makeText(this,"IMEI的值为:"+mtype,Toast.LENGTH_SHORT).show();
}
- 1首先判断手机的SDK版本是否大于22,如果小于的话就不需要动态的去申请权限,让用户有更好的体验。
ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
!= PackageManager.PERMISSION_GRANTED
这里判断用户是否获取READ_PHONE_STATE这个权限了没有,如果没有则去申请
//申请READ_PHONE_STATE权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE},
WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
- 2 如果已经获取了这个权限就不需要申请,可以直接执行下一步需要做的方法。
- 3申请动态获取权限之后回有一个回调的方法,如果用户同意的话,就执行下一步的方法。在这里需要强调的是这个回调是异步的执行的下一步的方法一定要写在获取权限成功的逻辑里面,要不然会调用与代码不同步
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {
getImei();
Toast.makeText(getApplicationContext(),"授权成功",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(),"授权拒绝",Toast.LENGTH_SHORT).show();
}
}