如何避開Android 6.0新增的特性獲取IMEI和讀寫記憶體卡許可權
在Android 6.0之後新增了動態許可權,比如獲取IMEI,寫入外接儲存卡的時候需要新增動態許可權。關於動態許可權參考文章。
我們在新增動態許可權的時候都需要回調Activity裡面的
onRequestPermissionsResult(int requestCode,String[] permissions, int[] paramArrayOfInt)方法。
但是如果我們寫的是SDK外掛。我們就需要去要求接入sdk的開發者去申請獲取IMEI或者讀寫外接儲存卡的時候需要新增動態許可權了。
開發者如果不新增動態許可權或者使用者決絕了該許可權就無法使用寫入記憶體卡的資料或者獲取IMEI了。
那麼Android 6.0以及之後的版本我們該如何處理這個問題呢
一,獲取讀寫儲存卡的的許可權
地址獲取方式為:String path = mContext.getFilesDir().getAbsolutePath();
使用該地址為/storage/emulated/0/fly/apk/8c7e1f8e966ea23c27daead5298b38c1.apk寫入apk檔案的時候在
Android 6.0之後出現以下異常。
解決的方式就是修改讀寫檔案的地址: mContext.getExternalCacheDir().getPath() + "/myFilePath/";就可以了。這個儲存地址為SDCard/Android/data/你的應用包名/cache/myFilePath下面。這樣就不需要新增動態許可權也可以讀寫儲存卡了。這樣不僅不需要動態許可權甚至都不用在AndroidManifest裡面新增WRITE_EXTERNAL_STORAGE
但是這個也有一些缺點。這個 mContext.getExternalCacheDir().getPath()方式獲取的儲存地址的資料容易被使用者清理掉。當用戶清理掉的時候需要從新下載寫入了。
二,獲取IMEI時需要動態的READ_PHONE_STATE的許可權:
很多SDK外掛都需要獲取手機的IMEI。在6.0之前的系統只要在AndroidManifest裡面添加了
<uses-permission android:name="android.permission.READ_PHONE_STATE" />就行了。
但是6.0以及之後的系統版本需要動態獲取動態許可權READ_PHONE_STATE才行。
以下為參考方案:
private String getImei() { String imei = null; TelephonyManager tm = (TelephonyManager) mycontext.getSystemService(mycontext.TELEPHONY_SERVICE); try { imei = tm.getDeviceId(); if (imei == null) {// android pad imei = Secure.getString(mycontext.getContentResolver(), Secure.ANDROID_ID);// 平板電腦 Pad獲取的imei } } catch (Exception e) { //當targetSdkVersion >22 也就是Android 5.1以上的版本時 imei = SharedUtile.getInstance(mycontext).getString(DataStatc.IMEIKey, ""); if ("".equals(imei)) { UUID uuid = UUID.randomUUID(); SharedUtile.getInstance(mycontext).setString(DataStatc.IMEIKey, "No_" + uuid.toString()); imei = SharedUtile.getInstance(mycontext).getString(DataStatc.IMEIKey, ""); Log.e( "tag", "UUID=" + SharedUtile.getInstance(mycontext).getString(DataStatc.IMEIKey, "")); } } return imei; }
三,最後:
以上的方案解決的是:在使用者需要獲取IMEI和讀寫記憶體卡許可權的時並且又不能新增動態許可權的情況。這種需求主要是在寫SDK的時候。
如果讀者有更好的實現方式滿足以上需求歡迎評論交流。