播放视频的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。它给出了来自uriStringNullPointerException 错误。我认为其中一些代码来自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 通过意图播放视频

为视频播放器启动新活动时,如何强制android视频播放器在视频播放后不退出

使用 android 意图在特定时间打开 youtube 视频

如何在我的 Android 应用程序中播放 YouTube 视频?

在 Android 的 Firebase URL 的 VideoView 中显示视频