我正在尝试通过启动一个意图在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设备应该支持的意图/类名列表吗?或者特定的一个发布视频? 谢谢!
答案 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/*");