64

我正在尝试通过启动意图在 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 设备都应该支持的意图/类名列表吗?还是一个特定的启动视频?谢谢!

4

6 回答 6

93

在 Intent 上使用 setDataAndType

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

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

编辑:这不适用于一般用途。它修复了旧 HTC 设备中的一个错误,该错误需要在意图构造函数中使用 URI 并在之后设置。

于 2013-01-07T10:41:18.413 回答
20

从现在开始 API 24 之后,Uri.parse(filePath)将无法使用。你需要使用这个

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);

但在使用它之前,您需要了解文件提供程序是如何工作的。转到官方文档链接以更好地了解文件提供者。

于 2018-01-18T13:34:50.827 回答
11

以下代码对我来说很好。

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(movieurl));
startActivity(intent);
于 2011-11-16T00:27:04.990 回答
11

我在 Hero 中遇到过这个问题,使用我认为是已发布的 API。最后,我用了一个测试,看看是否能收到intent:

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 表示此手机/设备不支持此功能,但您应该避免未捕获的异常。结束明显。


我发现Intents Protocols 的 Open Intents Registry非常有用,但我还没有找到绝对必须支持的 TCK 类型的意图列表的等价物,以及不同手机的应用程序示例。

于 2009-10-23T16:22:56.393 回答
0

从调试信息来看,MainActivity中的VideoIntent似乎无法将视频的路径发送到VideoActivity。它给出了一个错误。我认为其中一些代码来自:NullPointerExceptionuriStringVideoActivity

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);
}
于 2013-04-15T16:40:08.090 回答
0

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

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

文件文件 = 新文件(路径);

最后在该行中使用它:

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

于 2021-03-22T15:59:45.380 回答