web-dev-qa-db-fra.com

Android intention de lire une vidéo?

J'essaie de lire des vidéos sur Android, en lançant une intention. Le code que j'utilise est:

tostart = new Intent(Intent.ACTION_VIEW);
tostart.setDataAndType(Uri.parse(movieurl), "video/*");
startActivity(tostart); 

Cela fonctionne sur la plupart des téléphones, mais pas sur le HTC Hero. Il semble charger un lecteur vidéo un peu différent. Cela lit la première vidéo qui y est lancée. Cependant, chaque vidéo après cela ne répond pas. (il garde une boucle).

Si j'ajoute une explicite

tostart.setClassName("com.htc.album","com.htc.album.ViewVideo");

(avant le démarrage) il fonctionne sur le HTC Hero. Cependant, comme il s'agit d'un appel spécifique HTC , je ne peux pas exécuter ce code sur d'autres téléphones (tels que G1) . Sur le G1, cela fonctionne:

tostart.setClassName("com.Android.camera","com.Android.camera.MovieView"); //g1 version

Mais cette intention manque au héros. Quelqu'un connaît-il une liste d'intentions/de noms de classe qui devraient être pris en charge par tous les appareils Android? Ou un spécifique pour lancer une vidéo? Merci!

53
PanMan

Utilisez setDataAndType sur l'intention

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

Utilisez "video/mp4" comme MIME ou utilisez "video/*" si vous ne connaissez pas le type.

78
Christian

A partir de maintenant après l'API 24, Uri.parse(filePath) ne fonctionnera pas. Vous devez utiliser ceci

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

Mais avant de l'utiliser, vous devez comprendre le fonctionnement du fournisseur de fichiers. Allez sur lien vers le document officiel pour mieux comprendre le fournisseur de fichiers.

12
KishanSolanki124

J'ai rencontré cela avec le héros, en utilisant ce que je pensais être une API publiée. Au final, j'ai utilisé un test pour voir si l'intention pouvait être reçue:

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

Utilisé lorsque je commençais généralement l'activité:

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.
}

évident: Si vous suivez cette voie - en utilisant des API non publiques - vous devez absolument fournir une solution de secours que vous savez certainement fonctionner. Cela ne doit pas être parfait, cela peut être un Toast disant que cela n'est pas pris en charge pour ce combiné/appareil, mais vous devez éviter une exception non interceptée. fin évidente.


Je trouve le Open Intents Registry of Intents Protocols très utile, mais je n'ai pas trouvé l'équivalent d'une liste d'intentions de type TCK qui doivent absolument être prises en charge, et des exemples de quelles applications font différents combinés.

12
jamesh

le code suivant fonctionne très bien pour moi.

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

à partir des informations de débogage, il semble que le VideoIntent du MainActivity ne peut pas envoyer le chemin de la vidéo à VideoActivity. Il donne une erreur NullPointerException provenant de uriString. Je pense qu'une partie de ce code de VideoActivity:

Intent myIntent = getIntent();
String uri = myIntent.getStringExtra("uri");
Bundle b = myIntent.getExtras();

startVideo(b.getString(uri));

Impossible de recevoir l'URI d'ici:

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