播放视频的Android意图?

65

我想通过启动一个意图在Android上播放视频。我使用的代码是:

tostart = new Intent(Intent.ACTION_VIEW);
tostart.setDataAndType(Uri.parse(movieurl), "video/*");
startActivity(tostart); 
这在大多数手机上都有效,但在HTC Hero上无效。它似乎加载了一个不同的视频播放器。它可以播放投放给它的第一个视频。然而,之后的每个视频都没有反应。(它保持在某个循环中)。
如果我添加一个显式的

tostart.setClassName("com.htc.album","com.htc.album.ViewVideo");

在调用startActivity之前,它可以在HTC Hero上运行。然而,由于这是一个HTC特定的调用,我无法在其他手机(如G1)上运行此代码。

G1上,这个代码可以正常工作:

tostart.setClassName("com.android.camera","com.android.camera.MovieView"); //g1 version

但是这个意图在英雄中缺失。 有人知道所有 Android 设备都应该支持的意图/类名列表吗?或者有一个特定的意图可以启动视频吗? 谢谢!


你有没有找到解决办法? - Vivek Samele
6个回答

95

在Intent上使用setDataAndType

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(newVideoPath));
intent.setDataAndType(Uri.parse(newVideoPath), "video/mp4");
startActivity(intent);

如果你不知道视频类型,请使用“video/*”作为MIME类型,或者使用“video/mp4”。

编辑:这不适用于一般用途。它修复了旧的HTC设备中的一个错误,该错误要求URI同时在意图构造函数中设置和设置后进行设置。


9
将解析后的 URI 保存到一个变量中。没有必要再次解析它。 - marden
2
-1 这正是原帖作者所使用的(setDataAndType)。 - Russ
6
我知道它不应该这样,但它确实发生了... 在意图构造函数和setDataAndType中都添加URI会使一些HTC设备播放视频。 这与PanMan最初尝试的不同之处就在于这个小细节。 - Christian
3
更新:这个方法可行: intent.setDataAndType(Uri.fromFile(new File(path)), "video/mp4"); - abbasalim
4
由于在 targetSdkVersion 为 24 及以上的情况下,file:// 方案不再被允许附加到 Intent 上,因此这在 API 24+ 中将无法正常工作。 - Binoy Babu
显示剩余7条评论

22

从API 24开始,Uri.parse(filePath)不再起作用。您需要使用以下内容:

FileProvider.getUriForFile(context, authority, file)
final File videoFile = new File("path to your video file");
Uri fileUri = FileProvider.getUriForFile(mContext, "{yourpackagename}.fileprovider", videoFile);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(fileUri, "video/*");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//DO NOT FORGET THIS EVER
startActivity(intent);

但在使用此功能之前,您需要了解文件提供程序的工作原理。请访问官方文档链接以更好地了解文件提供程序。


java.lang.IllegalArgumentException: Couldn't find meta-data for provider with authority com.example.videotest.fileprovider - user924

11

以下代码对我来说完全正常工作。

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(movieurl));
startActivity(intent);

那很好,但是当用户在音频屏幕上按下返回按钮时,如何停止音频播放呢?音频一直播放着。 - AndroidDev
它是有效的,但首先它会打开浏览器,因为它并不知道它是一个视频。而我知道它是一个视频,所以我想直接将URL传递给视频播放器。 - Timmmm

11

我遇到了这个问题,使用的是我认为已经发布的API。最终,我使用了一个测试来判断是否能够接收意图:

private boolean isCallable(Intent intent) {
    List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 
        PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}

在我通常只会启动活动时使用:

final Intent intent = new Intent("com.android.camera.action.CROP");
intent.setClassName("com.android.camera", "com.android.camera.CropImage");
if (isCallable(intent)) {
    // call the intent as you intended.
} else {
    // make alternative arrangements.
}

显而易见的是:如果你选择这种方法 - 使用非公开的API - 你必须提供一个绝对可行的备用方案。它不必完美,可以是一个Toast,说明此设备/手柄不支持此功能,但你应该避免未捕获的异常。结束明显。


我觉得意图协议的Open Intents注册表非常有用,但我没有找到必须被支持的意图的TCK类型列表和在不同设备上应用程序所做的示例。


0
从调试信息来看,似乎MainActivity中的VideoIntent无法将视频路径发送到VideoActivity。它会在uriString处出现NullPointerException错误。我认为这与VideoActivity中的某些代码有关:
Intent myIntent = getIntent();
String uri = myIntent.getStringExtra("uri");
Bundle b = myIntent.getExtras();

startVideo(b.getString(uri));

无法从此处接收URI:

public void playsquirrelmp4(View v) {
    Intent VideoIntent = (new Intent(this, VideoActivity.class));
    VideoIntent.putExtra("android.resource://" + getPackageName()
        + "/"+   R.raw.squirrel, uri);
    startActivity(VideoIntent);
}

0

首先,您需要将路径转换为真实路径。 例如,如果您有像content://folder/123这样的路径, 您需要将其转换为像foldername/fil.mp4这样的路径,并使用Environment.getExternalStorageDirectory()。

因此,您的路径字符串将是: String path = Environment.getExternalStorageDirectory() + "foldername/file.mp4"; 然后,您需要将其转换为文件:

File file = new File(path);

最后,在该行中使用它:

intent.setDataAndType(Uri.fromFile(file), "video/*");


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接