华为Android10外置存储操作失败

报错分析

Posted by JovenHe on October 23, 2020

在Android10以上,外置存储操作文件时和低版本有所不同,具体可以参考 管理分区外部存储访问

大致意思就是在Android10上想要在外置存储访问时,除了本应用专有目录和特定类型的媒体,需要使用存储访问框架来管理外部存储文件

而项目中要求是在禁用外部存储后,处于自己的应用时启用,以自身为文件管理应用。所以自身应用需要有权限管理外部存储。我在华为的mate10手机上,通过 ACTION_OPEN_DOCUMENT_TREE跳转后,完全无响应,而在OPPO 10系统上却可以正常跳转到文件[com.android.documentsui],进行授权。以此猜测是华为Android10的系统上可能有部分功能进行了剔除,导致Android接口不能使用,但不排除机型的因素。

只好通过自身应用跳转到系统文件管理来实现外置存储的禁用启用。我一开始是想在本身应用中列举出内部存储、外置存储,点击后分别跳转。

提取出应用[文件管理]的apk文件,使用jadx打开。

通过adb命令[adb shell dumpsys window findstr mCurrentFocus ],点击内部存储和外部存储的路径都是com.huawei.hidisk/com.huawei.hidisk.view.activity.category.StorageActivity。所以可以判断只是intent的传值不同

1603709450834

可以看到intent转化为HiCloudSafeIntent,得到一个auto_upload_app的字符串后并没有其他操作。

1603709612527

在onNewIntent方法中,通过判断action和mo23689方法后,拿到了curr_dir字段执行mo23691方法。这两个方法都在对象f9355中,正是StorageFragment这个很有用的类,其中mo23691方法就是通过路径进行显示文件夹和文件的。

1603709950640

可以看到参数就是file,后面还有adapter进行显示。

所以可以判断intent是要传递curr_dir为文件路径

跳转

val intent = Intent() 
intent.addCategory(Intent.CATEGORY_DEFAULT)
intent.component = ComponentName("com.huawei.hidisk","com.huawei.hidisk.view.activity.category.StorageActivity")
intent.putExtra("curr_dir", path) 
intent.action = "android.intent.action.MEDIA_EJECT"
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 
startActivity(intent)

10-30更新

通过 ACTION_OPEN_DOCUMENT_TREE跳转后,完全无响应

是同事给该测试机进行documentsui应用的禁用导致的。以上只作为跳转分析