android - 有没有办法获取 Android 扩展文件中特定文件的 Url?

标签 android cordova android-videoview

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

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

  1. 将所需的视频文件从扩展文件解压到 SD 卡(可能是暂时的),获取其 URL 并启动媒体播放器应用程序。解压需要一些时间,因此用户必须等待几秒钟,具体取决于视频的大小。
  2. 使用 Android 的 VideoView 类将我自己的视频播放器编写为 PhoneGap 插件。这样我就可以直接从扩展文件中播放,而无需先解压文件并获得响应更快的应用程序。

但是,我想知道是否有办法获取扩展文件内视频文件的URL?这将允许我的应用程序将 URL 添加到启动用户首选媒体播放器应用程序的 Intent,我更喜欢这种方法。

最佳答案

我找到了一种通过内容提供商来做到这一点的方法。我从问题 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" />

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 的媒体插件不支持内容提供商,因为如果 URL 不是以 http 开头,则会在 URL 前面插入“/sdcard/”。 (!!!) 因此,要通过 zip 内容提供程序播放音频文件,您需要编写自己的音频插件。

关于android - 有没有办法获取 Android 扩展文件中特定文件的 Url?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16831273/

相关文章:

android - 在下一个 Activity 中检索时,放入 Intent 额外的 LinkedList 被重铸为 ArrayList

java - 运行应用程序时只能看到主屏幕,看不到我的应用程序

javascript - jQuery 移动 : Markup Enhancement of dynamically added content

Android MediaController 位置

android - 拉伸(stretch)填充VideoView,VideoView的纵横比

java - android java switch 语句中缺少或删除循环周期

node.js - phonegap 创建不工作

android - phonegap 2.2.0 无法通过 Android 上的 "Device is Ready"屏幕

android - SurfaceView、SurfaceTexture 和 MediaPlayer 无法在 android 中播放我的视频

android - Google 应用内购买(跨平台定期订阅)