peterdocter 发表于 2016-4-5 15:46:42

智器阅读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代码就有问题。。。


sndncel 发表于 2016-4-6 05:12:25

学习了呀。。。。支持一下呀。

xin 发表于 2016-4-6 07:23:27

4.4的路过帮顶

luokein 发表于 2016-4-11 20:09:14

这个没有修改好的apk么

pingf 发表于 2016-4-18 09:31:51

太棒了,这个真心要赞一个,最好的阅读器终于能用了~

wsklght 发表于 2016-4-27 19:53:04

这个没有修改好的apk么

linzifengzw 发表于 2016-5-30 08:48:15

有修改的app吗

longwang 发表于 2016-9-17 01:05:22

不错,阅读器终于又可以用了。谢谢!{:4_86:}
页: [1]
查看完整版本: 智器阅读Android6.0无源修复