智器阅读Android6.0无源修复
无源修复者:PeterDocter 修复时间: 解决Android6.0上的sd内外卡无法别问题
关键代码\com\smartdevices\bookmanager\active\ac.smali .method public staticd()Ljava/util/ArrayList; .registers 6 const/4 v0, 0 new-instance v1,Ljava/util/ArrayList; invoke-direct {v1},Ljava/util/ArrayList;-><init>()V invoke-static {},Landroid/os/Environment;->getExternalStorageDirectory()Ljava/io/File; move-result-object v2 invoke-virtual {v2},Ljava/io/File;->getAbsolutePath()Ljava/lang/String; move-result-object v2 (1) new-instance v3, Ljava/io/File; const-string v4, "/" const/4 v5, 1 invoke-virtual {v2, v4, v5},Ljava/lang/String;->indexOf(Ljava/lang/String;I)I move-result v4 invoke-virtual {v2, v0, v4}, Ljava/lang/String;->substring(II)Ljava/lang/String; move-result-object v2 invoke-direct {v3, v2},Ljava/io/File;-><init>(Ljava/lang/String;)V invoke-virtual {v3},Ljava/io/File;->listFiles()[Ljava/io/File; move-result-object v2 array-length v3, v2 :46 if-ge v0, v3, :8A :4A aget-object v4, v2, v0 if-eqz v4, :84 :52 invoke-virtual {v4},Ljava/io/File;->exists()Z move-result v5 if-eqz v5, :84 :5E invoke-virtual {v4},Ljava/io/File;->canRead()Z move-result v5 if-eqz v5, :84 :6A (2) invoke-virtual {v4}, Ljava/io/File;->canWrite()Z move-result v5 if-eqz v5, :84 :76 invoke-virtual {v4},Ljava/io/File;->getAbsolutePath()Ljava/lang/String; move-result-object v4 invoke-virtual {v1, v4},Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z :84 add-int/lit8 v0, v0, 0x01 goto :46 :8A return-object v1 .end method 代码分析(1) 这里主要从/storage/emulated/0中提取出/storage,进行遍历当前路径结果如下: /storage/emulated 内卡 /storage/FADF-18EC 外卡 在android 6.0测试/storage/emulated虽然这个目录存在但是无读写权限,必须是用 Environment.getExternalStorageDirectory().getAbsolutePath()返回完整路径才有读写权限也就是/storage/emulated/0。 这就是造成内卡无法读写的原因! (2) 主要功能是检测外卡是否有读写权限,在android 4.4以上所有外卡都只有读权限除非有root权限与修改过系统权限配置文件。 外卡没有读写权限就不保存此路径,也就是无法认识外卡的原因。 修改代码public static final ArrayList d() { int i = 0; ArrayList arrLlist = new ArrayList(); String sd1 =Environment.getExternalStorageDirectory().getAbsolutePath(); File sd = new File(sd1); arrLlist.add(sd.getAbsolutePath()); if (sd.canRead()) { Log.i(TAG, sd.getAbsolutePath().toString() + " Reading isok!"); if (sd.canWrite()) { Log.i(TAG,sd.getAbsolutePath().toString() + " Writing is ok!"); } } File[] FPath = new File(sd1.substring(0, sd1.indexOf("/",1))).listFiles(); while (i < FPath.length) { File FPath2 = FPath; if (FPath2 != null) { if (FPath2.exists()) { if (FPath2.canRead()) { Log.i(TAG,FPath2.toString() + " Reading is ok!"); arrLlist.add(FPath2.getAbsolutePath()); } } } i++; } return arrLlist; } 转换成smali代码替换原来d()方法内容,这样就可以解决问题了! 这样修复之后,所有浏览图片格式pdf都没有阅读了! 有款修复的是 这个功能是浏览文字格式的pdf时用到,这个功能是so中主要是 Java_com_smartdevices_pdfreader_PdfView_nativeGetSelectText 这个函数的问题,在模拟器上测试过android 4.4.x以上都不正常。不知道是否7a中so本身嵌入arm代码就有问题。。。
|