Android 6.0執行時獲取許可權詳解
阿新 • • 發佈:2019-02-10
- 最近在工作過程中會遇到,明明已經在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();
}
}