Wie sich herausstellt, zeigt der Fehler -2147483648 einen unbekannten Fehler an. Dies könnte etwas mit der Videokodierung zu tun haben, aber es lohnt sich auch zu überprüfen, ob der Dateipfad existiert und dass der VideoView die Berechtigung hat, ihn zu lesen.
Mein Problem war, dass ich meine Dateien mit Context.MODE_PRIVATE (der Standard) schrieb.
openFileOutput(filename, Context.MODE_PRIVATE);
Dies zeigt an, dass nur Ihre Anwendung auf die Datei zugreifen kann. Ich weiß nicht genau, wie oder warum, aber in Jelly Bean und darüber scheint es, dass die Videoansicht auf die von Ihnen angegebene Datei zugreifen kann, als wäre es Ihre Anwendung, aber vor Jelly Bean versucht die Videoansicht, die Datei in einem eigenen Kontext (nicht der Ihrer Anwendung). Da der Modus privat ist, schlägt er fehl.
Eine Lösung besteht darin, Ihre Datei mit Context.MODE_WORLD_READABLE zu schreiben, die jetzt veraltet ist. Dies zeigt an, dass jeder die Datei unter diesem Pfad öffnen kann. Dies ist offensichtlich unsicher und entmutigt.
Ich habe einen Inhaltsanbieter und meine eigene URI erstellt, um diesen Fall zu behandeln. Im Einzelnen:
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();
}
}
Und dann, wo ich meine Videodateien zuzugreifen:
VideoView myVideoView = findViewById(R.id.videoView);
...
myVideoView.setVideoURI(
Uri.parse(
CachedActionProvider.CONTENT_URI_BASE + Uri.encode(videoFilename)));
...
myVideoView.start();
Diese ist echt langweilige Möglichkeit, dem VideoView mitzuteilen, dass Sie Ihren ContentProvider nach dem Dateideskriptor für die Daten fragen sollen. Dateideskriptoren sind nicht berechtigt, daher öffnen Sie die Datei mit den Berechtigungen Ihrer App und geben sie an die Videoansicht weiter, anstatt die Videoansicht zu bitten, die Datei mit ihren eigenen Berechtigungen zu öffnen.
Das behebt mein Problem und hoffentlich auch Ihnen!
Hallo, ich Ihre Lösung versucht Video in Video spielen view.It spielt auch in Android-Version 4.1, aber wenn ich diese laufen in Emulatoren ich bin immer gleichen Fehler 'Fehler (1, -2147483648)'. Ich habe .3gp und .mp4 Videos versucht, aber es gibt mir denselben Fehler in den Emulatoren. Was soll ich tun, um dieses Problem zu lösen, bitte führen Sie mich. Dieser Fehler ist sehr vage, ich verstehe nicht, was ich jetzt tun soll. – Dory
In welchen Versionen laufen Ihre Emulatoren? – spitzanator
Ich versuchte in der Version 2.3 und auch in 4.0 – Dory