在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的时候。
如果读者有更好的实现方式满足以上需求欢迎评论交流。