我在 Android (SDK 19/KitKat 4.4.2) 中有一个场景,我的应用程序将使用 Manifest.xml 中的 android:sharedUserId="android.uid.system"作为系统级应用程序 ( App 1 ) 进行签名。这意味着此应用程序无法从 SD 卡写入或读取,无论它们是外部的还是内置于设备中的。
如果我需要从 SDCard 获取一个大文件并将其读入我的应用程序,那么最好的方法是什么?
我的目标只是从 SDCard 获取图像文件。但是,即使图像是未压缩的位图,它们也会相对较大。
我尝试了以下方法:
创建一个未作为系统用户 ( App2 ) 签名的新应用程序。从App1启动此App2中存在的服务,然后从此处从 SD 卡中读取文件,然后获取文件的 byte[],并通过 AIDL 将其分块发送到App1。这适用于从 SDCard 读取文件并将其发送过来,但是 AIDL 的每个事务的上限为 1mb,而且速度也非常慢,以至于我可能应该限制允许提供给应用程序的图像大小使此功能可用。在我看来不是最理想的。
我尝试在App 2 (UID: 10007)中使用 FileProvider ,但是在这种情况下,我不需要打开任何图形界面来选择我想要的文件和目标应用程序。我需要立即将其发送到App 1 (UID: 10047)或立即从App1获取。我不确定是否可以在没有这些 gui 步骤的情况下使用 FileProvider。我尝试从App2创建 Uri,然后通过 AIDL 将 Uri 发送到App1,然后通过 context.grantUriPermissions(packageName,uri,READ/WRITE) 授予权限,但总是以App1无权读取的安全错误告终uri App2提供。
java.lang.SecurityException:未找到 UID 10047 和 Uri 内容的权限授予://com.test.sdcard/folder/img.png
其中 UID 10047 是App 1而 UID 10007 是App 2。
这个问题的任何替代解决方案?