我发现自己可以通过内容提供商做到这一点。我从问题android play movie inside expansion file中得到了关于 Content Provider 的提示,尽管在那个问题中,URL 没有用于启动外部应用程序。
我们需要一个扩展 Google 的 APEZProvider 的 ContentProvider 类:
public class ZipFileContentProvider extends APEZProvider {
@Override
public String getAuthority() {
return "com.example.expansionexperiment.provider";
}
}
并且需要添加到 Manifest 并导出:
<provider
android:exported="true"
android:name="com.example.expansionexperiment.ZipFileContentProvider"
android:authorities="com.example.expansionexperiment.provider" />
manifest 和 getAuthority() 中的权限必须相同。
现在我们可以为扩展文件中的文件创建一个 Uri:
// Filename inside my expansion file
String filename = "video/video.mp4";
String uriString = "content://com.example.expansionexperiment.provider" + File.separator + filename;
Uri uri = Uri.parse(uriString);
// Start video view intent
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "video/*");
startActivity(intent);
内容提供者现在仅通过 URL 提供对 zip 文件和其中文件的访问。
但是,PhoneGap 的 Media 插件不支持内容提供者,因为如果 URL 不以 http 开头,它会在 URL 前面插入“/sdcard/”。(!!!) 因此,要通过 zip 内容提供程序播放音频文件,您需要编写自己的音频插件。