智器阅读Android6.0无源修复
智器阅读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-objectv2 invoke-virtual {v2},Ljava/io/File;->getAbsolutePath()Ljava/lang/String; move-result-objectv2(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-objectv2 invoke-direct {v3, v2},Ljava/io/File;-><init>(Ljava/lang/String;)V invoke-virtual {v3},Ljava/io/File;->listFiles() move-result-objectv2 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-objectv4 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代码就有问题。。。
学习了呀。。。。支持一下呀。 4.4的路过帮顶 这个没有修改好的apk么 太棒了,这个真心要赞一个,最好的阅读器终于能用了~ 这个没有修改好的apk么 有修改的app吗 不错,阅读器终于又可以用了。谢谢!{:4_86:}
页:
[1]