如何跨包引用Android“资产”?

Posted

技术标签:

【中文标题】如何跨包引用Android“资产”?【英文标题】:How to reference Android 'assets' across packages? 【发布时间】:2011-07-26 11:45:27 【问题描述】:

我有一个以“免费”和“专业”版本发布的 android 应用程序。我已经使用从两个版本引用的基本“库”项目设置了我的项目,因此我的包集如下所示:

com.example.myapp com.example.myapp.free com.example.myapp.pro

我的基础“库”项目中的一个 Activity 类将帮助文件加载到 WebView:WebView.loadUrl("file:///android_asset/help.html")。此类在“免费”和“专业”版本中都进行了扩展(出于此问题范围之外的原因),但我希望这两个版本都引用相同的 HTML 文件(即父包中的那个)。但是,在我当前的设置下,HTML 文件需要复制到“file://”的“com.example.myapp.free”和“com.example.myapp.pro”包下的“assets”文件夹中/android_asset/" URI 工作。

有没有办法指定“file:///android_asset/”URI 以便访问父包中的“assets”目录?

我发现的一个部分解决方案是从“原始”目录中读取 HTML 文件,然后将生成的字符串推送到我的 WebView 对象,但是对于纯文本 HTML 页面(例如,一个有图片,就像我的一样)。

干杯。

【问题讨论】:

【参考方案1】:

由于 Andrew White 没有解释如何按照他的建议去做,我会告诉你:

Context otherContext = context.createPackageContext("other.package.name", 0);
AssetManager am = otherContext.getAssets();

这似乎并没有那么糟糕。而且我已经验证了这两个包不需要共享一个用户 ID。

【讨论】:

我认为这是不正确的。请参阅 (developer.android.com/guide/topics/security/…)。您的代码意味着您可以访问 any 其他应用程序文件,这将是一个特别弱的操作系统安全模型。我已经尝试过了,但在我尝试打开文件时它失败了。 您的链接没有提到资产,这就是问题所在。您是否尝试打开资产?在我的设备上,/data/app 中的 apk 文件(以及其中的资产)是世界可读的。显然 /data/data 中的应用程序私有目录不是。如果这是正确的,请收回您的反对票。 +1 谢谢我正在使用 createPackageContext(package,2) - 它也可以工作(我不测试你的选择) 但你也可以获取apk位置并在ZipInputStream中读取 我可以确认这是可行的 - 当然,这 2 个 APK 必须使用相同的密钥进行签名。【参考方案2】:

作为拥有专业版和免费版的开发人员,我可以根据经验说,不要尝试跨应用共享资产。即使你让它工作,你最终会遇到比它值得的更多的麻烦。

如果您绝对必须这样做,则每个应用程序必须共享相同的系统用户,并且您必须在一个应用程序中创建一个模仿另一个应用程序的上下文。这些并不难做到,但可能是维护的噩梦。

【讨论】:

以上是关于如何跨包引用Android“资产”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在库项目中引用资产

资产文件夹不包括 NativeScript Android 构建中的 HTML 文件

Android:如何从资产中播放视频?

Android:如何找到资产文件夹的绝对路径?

如何将.db文件从资产放到数据/数据/包名/ android [重复]

如何使用 sqldelight 读取位于资产中的 db 文件 - Android