Android打视频的意图?

时间:2009-10-15 12:39:29

标签: android video sdk android-intent

我正在尝试通过启动一个意图在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");

(在开始活动之前)它适用于 HTC Hero 。但是,由于这是一个 HTC 特定呼叫,我无法在其他手机上运行此代码(例如 G1 )。 在 G1 上,这有效:

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

但英雄没有想到这个意图。 有人知道所有Android设备应该支持的意图/类名列表吗?或者特定的一个发布视频? 谢谢!

6 个答案:

答案 0 :(得分:78)

在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 / *”。

答案 1 :(得分:12)

我和Hero一起使用了我认为已发布的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 Registry of Intents Protocols非常有用,但我没有找到相当于绝对必须支持的TCK类型的意图列表,以及哪些应用程序执行不同手机的示例。

答案 2 :(得分:12)

以下代码对我来说很好。

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

答案 3 :(得分:12)

从现在开始,在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);

但在使用之前,您需要了解文件提供程序的工作原理。转到official document link以更好地了解文件提供程序。

答案 4 :(得分:1)

来自调试信息,似乎来自 MainActivity VideoIntent 无法将视频路径发送到 VideoActivity 。它会从NullPointerException中产生uriString错误。我认为来自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);
}

答案 5 :(得分:0)

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

所以你的路径字符串将是: 字符串路径 = Environment.getExternalStorageDirectory() + "文件夹名/file.mp4"; 然后你需要把它转换成文件:

File file = new File(path);

最后在一行中使用它:

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