¿Android tiene la intención de reproducir video?

Intento reproducir videos en Android, lanzando un bash. El código que estoy usando es:

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

Esto funciona en la mayoría de los teléfonos, pero no en el HTC Hero . Parece cargar un reproductor de video un poco diferente. Esto sí reproduce el primer video lanzado sobre él. Sin embargo, cada video después de eso no responde. (se mantiene en un bucle).

Si agrego un explícito

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

(antes de la actividad) funciona en el HTC Hero . Sin embargo, dado que esta es una llamada específica de HTC , no puedo ejecutar este código en otros teléfonos (como el G1 ). En el G1 , esto funciona:

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

Pero esta intención le falta al héroe. ¿Alguien sabe una lista de intents / classnames que deberían ser compatibles con todos los dispositivos Android? ¿O uno específico para lanzar un video? ¡Gracias!

Use setDataAndType en el bash

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

Use “video / mp4” como MIME o use “video / *” si no conoce el tipo.

Me he topado con esto con Hero, utilizando lo que pensé que era una API publicada. Al final, utilicé una prueba para ver si se podía recibir el bash:

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

En uso cuando por lo general solo comenzaba la actividad:

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

obvio: si sigues esta ruta, utilizando API no públicas, debes proporcionar un respaldo que definitivamente funcione. No tiene que ser perfecto, puede ser un brindis diciendo que esto no es compatible con este dispositivo / dispositivo, pero debe evitar una excepción no detectada. final obvio.


Encuentro que el Registro de Intentos Abiertos de Protocolos de Intenciones es bastante útil, pero no he encontrado el equivalente de una lista de bashs de tipo TCK que absolutamente debe ser admitida, y ejemplos de qué aplicaciones tienen diferentes teléfonos.

El siguiente código funciona bien para mí.

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

A partir de ahora después de API 24, Uri.parse(filePath) no funcionará. Necesitas usar esto

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

Pero antes de usar esto necesitas entender cómo funciona el proveedor de archivos. Vaya al enlace del documento oficial para comprender mejor al proveedor de archivos.

de la información de depuración, parece que VideoIntent de MainActivity no puede enviar la ruta del video a VideoActivity . Da un error NullPointerException de uriString . Creo que parte de ese código de VideoActivity :

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

No puede recibir el uri desde aquí:

 public void playsquirrelmp4(View v) { Intent VideoIntent = (new Intent(this, VideoActivity.class)); VideoIntent.putExtra("android.resource://" + getPackageName() + "/"+ R.raw.squirrel, uri); startActivity(VideoIntent); }