10 Stimmen

Wiedergabe der Videodatei aus dem internen Speicher von Android mit VideoView

Ich versuche, ein Video abzuspielen, das im internen Speicher von Android gespeichert ist. Aber egal was ich tue, es kommt immer entweder mit einem -1 Fehler oder einem -38 Fehler zurück. Beide scheinen ziemlich generische Fehler zu sein und sind daher nicht besonders verständlich.

Ich frage mich, ob es möglich ist, ein Video mit einem VideoView und nicht mit einer MediaPlayer-Instanz aus dem lokalen Speicher abzuspielen.

Die Schritte in meiner App sind folgende:

  1. eine Datei von einer Remote-URL herunterladen

  2. Die Datei im internen Speicher speichern (ich verwende die Konvention, um sicherzustellen, dass sie globale Leseberechtigungen hat, d.h.

    openFileOutput(file_name, Context.MODE_WORLD_READABLE);
  3. Die Mediendatei zu einem späteren Zeitpunkt von diesem Speicherort auslesen und in einem VideoView abspielen.

    String filePath = "file://" + getFilesDir()+File.separator+file_name;
    Uri videoUri = Uri.parse(filePath);
    Log.d("Video Player", filePath);
    videoPlayer.setVideoURI(videoUri);

Ich habe auch andere Links in StackOverflow durchgesehen, die darauf hinweisen, dass ich einen CustomContentProvider implementieren muss, um diese Dateien lesen zu können. Gibt es einen direkten Weg, auf die Datei-URI zuzugreifen und sie dem VideoView zuzuweisen, ohne dass ich einen benutzerdefinierten Content-Provider erstellen und stattdessen eine MediaPlayer anstelle eines VideoView verwenden muss.

Weitere verwendete StackOverflow-Verweise

  1. Android - Video aus privatem Ordner der App laden
  2. Kann ein VideoView ein Video abspielen, das im internen Speicher gespeichert ist?

8voto

Joshua Pinter Punkte 41335

Kopieren Sie es vorübergehend in den externen Speicher

Ich bin auf das gleiche Problem gestoßen wie Sie und habe einfach die Datei vorübergehend in den externen Speicher kopiert, bevor ich sie abgespielt und anschließend die temporäre Datei gelöscht habe.

Hier ist ein Beispielcode, den ich dafür verwendet habe:

try {
  // Datei in eine temporäre Datei kopieren, um sie anzuzeigen.
  temporaryFile = generateTemporaryFile(file.getName());
  FileUtils.copyFile(file, temporaryFile);
  previewVideo(temporaryFile, videoView);

} catch (IOException e) {
  e.printStackTrace();
}

# Hilfsfunktionen

protected File generateTemporaryFile(String filename) throws IOException {
  String tempFileName = "20130318_010530_";

  File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);

  File tempFile = File.createTempFile(
    tempFileName,       /* Präfix     "20130318_010530" */
    filename,           /* Dateiname   "video.3gp" */
    storageDir          /* Verzeichnis  "/data/sdcard/..." */
  );

  return tempFile;
}

protected void previewVideo(File file, VideoView videoView) {
  videoView.setVideoPath(file.getAbsolutePath());

  MediaController mediaController = new MediaController(this);

  videoView.setMediaController(mediaController);

  mediaController.setMediaPlayer(videoView);

  videoView.setVisibility(View.VISIBLE);

  videoView.start();
}

6voto

Basil Punkte 2157

Bitte versuchen Sie dies. Ich habe das Verfahren zum Abspielen von Videos aus dem Raw-Ordner auf diesem Link erklärt: Video-Player funktioniert nicht!. Wenn Sie das ändern

Uri uri = Uri.parse("android.resource://" + getPackageName() + "/"+R.raw.VideoName);

mit

Uri uri = Uri.parse(Environment.getExternalStorageDirectory()+"");

Zum Beispiel:

Uri uri = Uri.parse(Environment.getExternalStorageDirectory()+"/dcim/camera/2012-05-15_17-50-39_319.3gp");

Ich denke, dass dieses Problem lösen wird. Denken Sie daran, die notwendigen Berechtigungen im Manifest zu erteilen.

2voto

ekawas Punkte 6494

Ein wenig spät im Spiel hier, aber wenn Sie einen FileProvider zu Ihrer App hinzufügen, können Sie URIs erstellen, die VideoView nutzen kann.

Es ist tatsächlich ziemlich trivial zu tun und sobald Sie fertig sind, können Sie auf Ihre Dateien zugreifen wie:

Uri video = FileProvider.getUriForFile(context, context.getPackageName(), new File(myAbsoluteVideoPath));

myVideoView.setVideoURI(video);

Dies kann verwendet werden, um Videos abzuspielen, die Sie in Ihrer App generiert haben und auf dem Gerät gespeichert sind.

0voto

Naved Shaikh Punkte 29

Ändere targetSdkVersion auf 27.

android

compileSdkVersion 30 
buildToolsVersion "30.0.3"

defaultConfig 
{
    applicationId "com.naved.playonmp3"
    minSdkVersion 18
    targetSdkVersion 27
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X