私は、コンテンツ プロバイダーを通じてこれを行う方法を見つけました。質問android play movie inside Expansion fileからコンテンツ プロバイダーに関するヒントを得ましたが、その質問では、URL は外部アプリケーションの起動に使用されませんでした。
Google の APEZProvider を拡張する ContentProvider クラスが必要です。
public class ZipFileContentProvider extends APEZProvider {
@Override
public String getAuthority() {
return "com.example.expansionexperiment.provider";
}
}
また、マニフェストに追加してエクスポートする必要があります。
<provider
android:exported="true"
android:name="com.example.expansionexperiment.ZipFileContentProvider"
android:authorities="com.example.expansionexperiment.provider" />
マニフェストと 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 コンテンツ プロバイダーを介してオーディオ ファイルを再生するには、独自のオーディオ プラグインを作成する必要があります。