访问Jelly Bean上其他Android应用程序的资产

3
我是一名有用的助手,可以为您翻译文本。
我有一对安卓应用程序。一个是免费的“阅读器”应用程序,另一个是付费的“数据”应用程序,其中包含一个位于其资产子目录中的文本文件。
阅读器应用程序使用以下代码访问数据应用程序的文本文件:
Intent myIntent = new Intent("myintent");
List<ResolveInfo> dataPacks = packageManager.queryIntentActivities(myIntent, 0);
String packageName = dataPacks.get(0).activityInfo.packageName
Resources res = packageManager.getResourcesForApplication(packageName);
AssetManager assets = res.getAssets();
String[] dataFiles = assets.list("Data");

这一直运作得很好,但是通过Google Play下载到Jelly Bean的应用程序无法工作(数据文件为空)。如果应用程序直接从电子邮件中安装,则没有问题,因此我怀疑我的问题与最近对Google Play的安全更改有关。然而,这些据称已经被撤消,但我仍然遇到了问题。
有人可以解释一下出了什么问题吗?(不幸的是,我没有Jelly Bean设备)
或者,有人能建议一种更好的机制来访问数据应用程序的txt文件吗?
谢谢
1个回答

4
JB系统上的付费应用程序被称为“向前锁定”。这意味着APK被分为两部分——一部分是公共资源,另一部分包含私有资源和代码,其他应用程序无法读取。详情请参见:http://nelenkov.blogspot.com/2012/07/using-app-encryption-in-jelly-bean.html 我没有详细研究文件如何分割,但你所遇到的问题表明资产是私有APK的一部分,这很合理,因为你通常会把API密钥等放在资产中。
因此,你需要使用更间接的方法来在两个应用程序之间共享信息,例如ContentProvider或远程服务。确保要求签名权限才能访问它们,以确保只有自己的应用可以使用它们。

1
昨天进行了检查。如预期,资源(/res/asset)被封装在APK的私有部分中,因此您无法直接从另一个应用程序访问它们。您也可以在模拟器上测试此功能:您需要使用“-l”(向前锁定)选项进行安装:'adb install -l myapp.apk' - Nikolay Elenkov
谢谢Nik,我已经重写了我的代码,使用ContentProvider代替,现在它对我来说是可行的。不过我还没有机会发布到外部环境中,看看它是否可以解决我的原始问题。 - Daz Eddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接