Android打视频的意图?

Pan*_*Man 53 video sdk android android-intent

我试图通过启动一个意图在Android上播放视频.我正在使用的代码是:

tostart = new Intent(Intent.ACTION_VIEW);
tostart.setDataAndType(Uri.parse(movieurl), "video/*");
startActivity(tostart); 
Run Code Online (Sandbox Code Playgroud)

这适用于大多数手机,但不适用于HTC Hero.它似乎加载了一些不同的视频播放器.这确实播放了第一个视频.但是,之后的每个视频都没有响应.(它保持一定的循环).

如果我添加一个明确的

tostart.setClassName("com.htc.album","com.htc.album.ViewVideo");
Run Code Online (Sandbox Code Playgroud)

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

tostart.setClassName("com.android.camera","com.android.camera.MovieView"); //g1 version
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ian 80

在Intent上使用setDataAndType

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(newVideoPath));
intent.setDataAndType(Uri.parse(newVideoPath), "video/mp4");
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

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

  • 将解析后的uri保存到变量中.没有必要解析它两次. (7认同)
  • 我知道它不应该 - 但它确实...在意图构造函数和setDataAndType中添加uri BOTH会使一些HTC设备播放视频.这与PanMan最初尝试的差别很小. (6认同)
  • 这在API 24+中不起作用,因为file:// scheme现在不允许在targetSdkVersion 24上附加Intent. (4认同)
  • -1这正是原始海报所使用的(setDataAndType) (2认同)
  • 更新:这个工作:intent.setDataAndType(Uri.fromFile(new File(path)),"video/mp4"); (2认同)

Kis*_*nki 14

从现在开始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);
Run Code Online (Sandbox Code Playgroud)

但在使用之前,您需要了解文件提供程序的工作原理.转到官方文档链接以更好地了解文件提供程序.


jam*_*esh 12

我和Hero一起使用了我认为已发布的API.最后,我使用了一个测试来查看是否可以收到意图:

private boolean isCallable(Intent intent) {
    List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 
        PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}
Run Code Online (Sandbox Code Playgroud)

在使用时,我通常只是开始活动:

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.
}
Run Code Online (Sandbox Code Playgroud)

显而易见:如果你沿着这条路走 - 使用非公共API - 你必须绝对提供一个你知道肯定有用的后备.它不一定是完美的,它可以是Toast说这个手机/设备不支持,但你应该避免未被捕获的异常.结局很明显.


我发现Intent ProtocolsOpen Intents Registry非常有用,但是我没有找到相当于必须支持的TCK类型的意图列表,以及哪些应用程序执行不同手机的示例.


小智 12

以下代码对我来说很好.

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(movieurl));
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)