播放视频的Android意图?
Posted
技术标签:
【中文标题】播放视频的Android意图?【英文标题】:Android intent for playing video? 【发布时间】:2010-12-07 00:35:54 【问题描述】:我正在尝试通过启动意图在 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 设备都应该支持的意图/类名列表吗?还是一个特定的启动视频? 谢谢!
【问题讨论】:
你有什么解决办法吗?? 【参考方案1】:在 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 并在之后设置。
【讨论】:
将解析后的 uri 保存到变量中。无需解析两次。 -1 这正是原始海报所使用的(setDataAndType) 我知道它不应该 - 但它确实......在意图构造函数和 setDataAndType 中添加 uri 会使一些 HTC 设备播放视频。这与 PanMan 最初尝试的细微差别。 更新:这有效:intent.setDataAndType(Uri.fromFile(new File(path)), "video/mp4"); 这在 API 24+ 中不起作用,因为 file:// 方案现在不允许在 targetSdkVersion 24 上附加 Intent。【参考方案2】:首先您需要将路径转换为真实路径。 例如,如果您的路径类似于 content://folder/123 您需要使用 Environment.getExternalStorageDirectory() 将其转换为文件夹名称/fil.mp4 之类的路径
所以你的路径字符串将是: 字符串路径 = Environment.getExternalStorageDirectory() + "文件夹名/文件.mp4"; 然后你需要将其转换为文件:
文件文件 = 新文件(路径);
最后在行中使用这个:
intent.setDataAndType(Uri.fromFile(file), "video/*");
【讨论】:
【参考方案3】:从 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更好地了解文件提供者。
【讨论】:
java.lang.IllegalArgumentException: Couldn't find meta-data for provider with authority com.example.videotest.fileprovider
【参考方案4】:
从调试信息来看,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);
【讨论】:
【参考方案5】:以下代码对我来说效果很好。
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(movieurl));
startActivity(intent);
【讨论】:
这很好,但是一旦用户按下音频屏幕上的后退按钮,如何停止音频。音频一直在播放。 它可以工作,但它首先打开浏览器,因为它不知道它是一个视频。我确实知道这是一个视频,所以我想将 URL 直接传递给视频播放器。【参考方案6】:我在 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 表示此手机/设备不支持此功能,但您应该避免未捕获的异常。结局很明显。
我发现Open Intents Registry of Intents Protocols 非常有用,但我还没有找到绝对必须支持的 TCK 类型的意图列表,以及不同手机的应用示例。
【讨论】:
以上是关于播放视频的Android意图?的主要内容,如果未能解决你的问题,请参考以下文章
为视频播放器启动新活动时,如何强制android视频播放器在视频播放后不退出
使用 android 意图在特定时间打开 youtube 视频