Intention Android pour la lecture de vidéos?

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 joue la première vidéo lancée. Cependant, chaque vidéo après cela ne répond pas. (il rest en boucle).

Si j’ajoute un explicite

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

(avant le démarrage), cela fonctionne sur le HTC Hero . Toutefois, 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 le G1 ). Sur le G1 , cela fonctionne:

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

Mais cette intention est absente du héros. Est-ce que quelqu’un connaît une liste d’intents / noms de classe qui devraient être supportés par tous les appareils Android? Ou une version spécifique pour lancer une vidéo? Merci!

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.

Je suis tombé sur 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 list = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return list.size() > 0; } 

En cours d’utilisation, lorsque je commence habituellement 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. } 

évidente: si vous suivez cette voie – en utilisant des API non publiques – vous devez absolument fournir une solution de secours qui fonctionne sans aucun doute. Cela ne doit pas être parfait, il peut s’agir d’un Toast indiquant que ce combiné / périphérique n’est pas pris en charge, mais vous devez éviter une exception non interceptée. fin évidente.


Je trouve les protocoles de registre d’intentions ouverts très utiles, mais je n’ai pas trouvé l’équivalent d’une liste de types TCK qui doit absolument être prise en charge, et des exemples d’applications qui utilisent différents combinés.

le code suivant fonctionne très bien pour moi.

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

Après API 24, Uri.parse(filePath) ne fonctionnera plus. Vous devez l’utiliser

 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 comment fonctionne le fournisseur de fichiers. Aller au lien du document officiel pour mieux comprendre le fournisseur de fichiers.

à partir des informations de débogage, il semble que le VideoIntent de MainActivity ne puisse pas envoyer le chemin de la vidéo à VideoActivity . Il donne une erreur NullPointerException partir de uriSsortingng . Je pense que certains de ces codes de VideoActivity :

 Intent myIntent = getIntent(); Ssortingng uri = myIntent.getSsortingngExtra("uri"); Bundle b = myIntent.getExtras(); startVideo(b.getSsortingng(uri)); 

Ne peut pas 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); }