web-dev-qa-db-ja.com

Android動画を再生する意図?

インテントを起動して、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デバイスでサポートされているインテント/クラス名のリストを知っていますか?または、ビデオを起動する特定のものですか?ありがとう!

53
PanMan

インテントでsetDataAndTypeを使用します

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(newVideoPath));
intent.setDataAndType(Uri.parse(newVideoPath), "video/mp4");
startActivity(intent);

MIMEとして「video/mp4」を使用するか、タイプがわからない場合は「video/*」を使用します。

78
Christian

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);

ただし、これを使用する前に、ファイルプロバイダーの動作を理解する必要があります。 公式ドキュメントリンク に移動して、ファイルプロバイダーをよりよく理解します。

12

公開された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を使用してこのルートを下る場合、間違いなく機能することがわかっているフォールバックを絶対に提供する必要があります。完全である必要はありません。これは、このハンドセット/デバイスではサポートされていないことを示すトーストになりますが、キャッチされない例外を避ける必要があります。明らかな終わり。


Open Intents Registry of Intents Protocols は非常に便利ですが、絶対にサポートする必要があるインテントのTCKタイプのリストに相当するものや、さまざまなアプリがどのハンドセットを実行するかの例は見つかりませんでした。

12
jamesh

次のコードは私のためにうまく機能します。

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

デバッグ情報から、VideoIntent from MainActivityはビデオのパスを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);
}
1
Leinad