5

Mit der Google Fotos App versuche ich ein Video auszuwählen, das nicht auf dem Gerät zwischengespeichert wird.Abrufen von Videos (nicht lokal) aus der Google Fotos App

Ich verwende die ACTION_GET_CONTENT Absicht, um den Optionen-Dialog zu starten, und von dort wähle ich die Google Fotos App.

Bei der Auswahl lokaler Videos wird ein Uri in dieser Form zurückgegeben.

Inhalt: // media/extern/Video/media/6708

Und davon, dass ich abfragen, um den Content-Provider die tatsächliche Speicherort der Datei abzurufen, und von dort aus gehen. Der Speicherort der Datei sieht folgendermaßen aus.

/storage/emulierten/0/WhatsApp/Medien/WhatsApp Video/VID-20131102-WA0000.mp4

Wenn ich jetzt ein Online-Video wählen, das heißt: ein Video nicht verfügbar mein Gerät noch nicht, und die heruntergeladen werden muss, verwendet werden soll, sieht der zurück Uri wie folgt aus:

Inhalt: //com.google.android.apps.photos.content/1/ https://lh6.googleusercontent.com/_RD-QTO_SK5jlaPldTe2n5GANqMc3h-ukcbNoFlF1NLy=s0-d

Jetzt, mit diesem, gibt es keinen dokumentierten ContentProvider, der mir helfen würde, den tatsächlichen Link zu diesem Video zu bekommen. Selbst wenn ich eine Abfrage mache, gibt sie nichts zurück, abgesehen von den Spalten DISPLAY_NAME und SIZE.

DISPLAY_NAME enthält video.mpeg (gleiche Anzeigenamen für verschiedene Videos)

SIZE sagt mir wahrscheinlich die Größe der eigentlichen Datei.

Referred to this post on SO.

Ich habe verschiedene Funktionen, und dachte, dass ich müsste einen Inputstream für das Video durch die Inhalte-Anbieter erhalten, die Datei speichern, und mit der Datei arbeiten. Die Auswahl einer Bilddatei funktioniert jedoch einwandfrei, bei Video dagegen nicht.

Also, um den Stream in eine Datei zu kopieren, habe ich diesen Code.

 
InputStream inputStream = context.getContentResolver().openInputStream(Uri.parse(path)); 

Und schließlich in eine temporäre Datei schreiben. Die Datei wird erstellt, aber das scheint nicht korrekt formatiert zu sein. VLC spielt die Datei ab, zeigt aber immer nur den ersten Frame an.

Wenn ich die URL aus dem letzten Teil des oben angegebenen URI nehme und versuche, sie in einem Browser anzuzeigen, wird eine GIF-Datei heruntergeladen. Ich vermute, das ist das Problem. Aber ich weiß nicht, wie man das mpeg Format des Videos bekommt.

Wer hat das gleiche erlebt?

Antwort

5

Endlich die Lösung des Problems gefunden. Dies funktioniert sowohl für Bilder als auch für Videos.

Dieses Video referenzierte:

DevBytes: Android 4.4 Speicherzugangs Framework: Client-

https://www.youtube.com/watch?v=UFj9AEz0DHQ

 
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
intent.setType("image/*"); 
startActivity(intent); 

die Uri holen und den Zugang und die Datei wie folgt speichern:

 
ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver() 
       .openFileDescriptor(Uri.parse(path),"r"); 

FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); 

InputStream inputStream = new FileInputStream(fileDescriptor); 

BufferedInputStream reader = new BufferedInputStream(inputStream); 

// Create an output stream to a file that you want to save to 
BufferedOutputStream outStream = new BufferedOutputStream(
        new FileOutputStream(filePath)); 
byte[] buf = new byte[2048]; 
int len; 
while ((len = reader.read(buf)) > 0) { 
    outStream.write(buf, 0, len); 
} 

Aus irgendeinem Grund funktioniert das Abrufen eines Eingabestreams ohne ParcelFileDescriptor nicht.

+0

Massives Dankeschön dafür, das hat viel geholfen! Hier ist eine verwandte Frage und akzeptierte Antwort: http://stackoverflow.com/q/30572261/3309883 –