1. 程式人生 > >Android 6.0執行時獲取許可權詳解

Android 6.0執行時獲取許可權詳解

  • 最近在工作過程中會遇到,明明已經在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();
        }
    }

好了,其實動態獲取許可權就這麼簡單,還有別忘了,還要在你的AndroidManifest.xml中配置你需要申請的許可權,大家可以加一下Android技術開發群,大家一起學習,成長 QQ群667941932。

下載原始碼