有没有办法在Android扩展文件中获取Url到特定文件?

时间:2013-05-30 08:25:25

标签: android cordova android-videoview

我正在构建一个包含大型音频和视频文件的PhoneGap应用程序。在Android中,媒体文件应位于扩展文件中,以使应用程序大小保持在Google Play 50 MB限制之下。

我目前正在考虑两种播放视频文件的方式:

  1. 将所需的视频文件从扩展文件解压缩(可能暂时)到SD卡,获取其URL并启动媒体播放器应用程序。解包需要一些时间,因此用户必须等待几秒钟,具体取决于视频的大小。
  2. 使用Android的VideoView类将我自己的视频播放器编写为PhoneGap插件。这样我就可以直接从扩展文件中播放,而无需先解压缩文件并获得响应更快的应用程序。
  3. 但是,我想知道是否有办法在扩展文件中获取 URL到视频文件?这将允许我的应用程序将URL添加到用户首选媒体播放器应用程序启动的Intent,我更喜欢这种方法。

1 个答案:

答案 0 :(得分:2)

我发现自己是一种通过内容提供商实现这一目标的方法。我从问题android play movie inside expansion file得到了关于内容提供商的提示,尽管在该问题中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" />

清单和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);

内容提供商现在提供对zip文件的访问以及仅使用URL的文件。

但是,PhoneGap的Media插件不支持内容提供程序,因为如果URL不以http开头,它会在URL前面插入“/ sdcard /”。 (!!!)因此,要通过zip内容提供商播放音频文件,您需要编写自己的音频插件。