studio programacion herramientas fundamentos con avanzado aplicaciones android android-mediaplayer videoview

programacion - Error de Android MediaPlayer/VideoView(1,-2147483648)



manual de android en pdf (2)

Como resultado, el error -2147483648 indica un error desconocido. Esto podría tener algo que ver con la codificación del video, pero también vale la pena verificar que la ruta del archivo exista y que VideoView tenga permiso para leerlo .

Mi problema fue que estaba escribiendo mis archivos con Context.MODE_PRIVATE (el valor predeterminado).

openFileOutput(filename, Context.MODE_PRIVATE);

Esto indica que solo su aplicación puede acceder al archivo. No sé específicamente cómo o por qué, pero en Jelly Bean y más arriba, parece que la vista de video puede acceder al archivo que usted especifica como si fuera su aplicación, pero antes de Jelly Bean, la vista de video intenta abrir el archivo en su propio contexto (no su aplicación). Dado que el modo es privado, falla.

Una solución es escribir su archivo con Context.MODE_WORLD_READABLE , que ahora está en desuso. Esto indica que cualquiera puede abrir el archivo en esa ruta. Esto es obviamente inseguro y desalentado.

Terminé creando un proveedor de contenido y mi propia URI para manejar este caso. Específicamente:

AndroidManfest.xml :

... <provider android:name="com.myexampleapp.video.VideoProvider" android:authorities="com.myexampleapp.video.VideoProvider.files" android:exported="false" /> </application> </manifest>

VideoProvider.java :

package com.myexampleapp.video; import java.io.File; import java.io.FileNotFoundException; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.ParcelFileDescriptor; public class VideoProvider extends ContentProvider { public static final Uri CONTENT_URI_BASE = Uri.parse("content://com.myexampleapp.video.VideoProvider.files.files/"); private static final String VIDEO_MIME_TYPE = "video/mp4"; @Override public boolean onCreate() { return true; } @Override public String getType(final Uri uri) { return VIDEO_MIME_TYPE; } @Override public ParcelFileDescriptor openFile(final Uri uri, final String mode) throws FileNotFoundException { File f = new File(uri.getPath()); if (f.exists()) return (ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY)); throw new FileNotFoundException(uri.getPath()); } @Override public int delete(final Uri uri, final String selection, final String[] selectionArgs) { throw new UnsupportedOperationException(); } @Override public Uri insert(final Uri uri, final ContentValues values) { throw new UnsupportedOperationException(); } @Override public Cursor query(final Uri uri, final String[] projection, final String selection, final String[] selectionArgs, final String sortOrder) { throw new UnsupportedOperationException(); } @Override public int update(final Uri uri, final ContentValues values, final String selection, final String[] selectionArgs) { throw new UnsupportedOperationException(); } }

Y luego, donde accedo a mis archivos de video:

VideoView myVideoView = findViewById(R.id.videoView); ... myVideoView.setVideoURI( Uri.parse( CachedActionProvider.CONTENT_URI_BASE + Uri.encode(videoFilename))); ... myVideoView.start();

Esta es una manera realmente larga de decirle a VideoView que pregunte a su proveedor de contenido el descriptor de archivo de los datos. Los descriptores de archivos no están permitidos, por lo que abre el archivo con los permisos de la aplicación y se lo entrega a VideoView en lugar de pedirle a VideoView que lo abra con sus propios permisos.

¡Esto soluciona mi problema y espero que el tuyo también!

He tenido una experiencia inconsistente con la configuración de un video de VideoView desde una ruta de archivo.

VideoView myVideoView = findViewById(R.id.videoView); ... myVideoView.setVideoPath(videoFilename); ... myVideoView.start();

videoFilename es la ruta absoluta de un video en mi directorio de caché:

String videoFilename = new File(context.getCacheDir(), "myawesomevideo.mp4").getAbsolutePath();

En Android SDK> = 16 (Jelly Bean), esto funciona bien y se reproduce mi asombroso video. En Android 4.0.4 (SDK = 15), el MediaPlayer se rompe cuando se llama a myVideoView.start ().

El error es siempre inútil:

error (1, -2147483648)

¿Que me estoy perdiendo aqui? Cargar un archivo directamente desde mi paquete de activos (res / raw) o internet ( http://something.com/myawesomeinternetvideo.mp4 ), ¡pero no puedo descubrir cómo leer archivos de mi directorio de caché!


También tuve este problema al cargar un archivo de video desde el directorio de caché. El problema parecía ocurrir solo en los dispositivos Nexus, pero no lo probé en muchos dispositivos.

Intenté escribir el archivo con Context.MODE_WORLD_READABLE pero esa solución no me funcionó. El VideoProvider.java tampoco lo arregló.

Así que encontré otra solución que me funcionó. Creé un archivo temporal en mi actividad y le di a VideoView el camino absoluto hacia él.

Tal vez mi código pueda ayudar a alguien :)

private MediaController mController; private VideoView mVideoView; private File mTmpFile = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_video); init(); } private void init() { mProgressDialog = new ProgressDialog(this); mVideoView = (VideoView) findViewById(R.id.surface_video); mVideoView.requestFocus(); mController = new MediaController(this); mVideoView.setMediaController(mController); mVideoView.setOnPreparedListener(this); mVideoView.setOnCompletionListener(this); mVideoView.setOnErrorListener(this); String url = getIntent().getExtras().getString(MainActivity.VIDEO_URL_EXTRA_KEY); if (VideoLoaderTask.hasVideo(this, url)) { url = getCacheDir().toString().concat("/" + VideoLoaderTask.VIDEO_DIR + "/").concat(url); copyToTmpFile(url); mVideoView.setVideoPath(mTmpFile.getAbsolutePath()); } else { mVideoView.setVideoURI(Uri.parse(url)); } mProgressDialog.show(); mVideoView.start(); } @Override public void onDestroy() { if (mTmpFile != null) { mTmpFile.delete(); } super.onDestroy(); } private void copyToTmpFile(String url) { File f = new File(url); try { mTmpFile = File.createTempFile("video", null); mTmpFile.deleteOnExit(); FileInputStream is = new FileInputStream(f); int size = is.available(); byte[] buffer = new byte[size]; is.read(buffer); is.close(); FileOutputStream fos = new FileOutputStream(mTmpFile); fos.write(buffer); fos.close(); } catch (Exception e) { mVideoView.setVideoURI(Uri.parse(url)); } }