In meiner App muss der Benutzer eine Audiodatei auswählen, die die App dann verarbeitet. Das Problem ist, dass die URI im Dateiformat vorliegen muss, damit die App mit den Audiodateien das tun kann, was ich möchte. Wenn ich den nativen Musik-Player von Android verwende, um in der App nach der Audiodatei zu suchen, ist der URI ein Inhalts-URI, der folgendermaßen aussieht:
content://media/external/audio/media/710
Mit der beliebten Dateimanager-Anwendung Astro erhalte ich jedoch Folgendes:
file:///sdcard/media/audio/ringtones/GetupGetOut.mp3
Letzteres ist für mich viel zugänglicher, aber ich möchte natürlich, dass die App über Funktionen für die Audiodatei verfügt, die der Benutzer auswählt, unabhängig davon, mit welchem Programm er seine Sammlung durchsucht. Meine Frage ist also, gibt es eine Möglichkeit, den content://
Stil-URI in einen file://
URI zu konvertieren ? Was würden Sie mir sonst empfehlen, um dieses Problem zu lösen? Hier ist der Code, der die Auswahl als Referenz aufruft:
Intent ringIntent = new Intent();
ringIntent.setType("audio/mp3");
ringIntent.setAction(Intent.ACTION_GET_CONTENT);
ringIntent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(ringIntent, "Select Ringtone"), SELECT_RINGTONE);
Ich mache Folgendes mit der Inhalts-URI:
m_ringerPath = m_ringtoneUri.getPath();
File file = new File(m_ringerPath);
Dann mache ein paar FileInputStream-Sachen mit dieser Datei.
Antworten:
Verwenden Sie einfach
getContentResolver().openInputStream(uri)
, um eineInputStream
von einer URI zu erhalten.http://developer.android.com/reference/android/content/ContentResolver.html#openInputStream(android.net.Uri)
quelle
Dies ist eine alte Antwort mit veralteter und hackiger Methode, um einige spezifische Schwachstellen von Content Resolver zu überwinden. Nehmen Sie es mit einigen riesigen Salzkörnern und verwenden Sie nach Möglichkeit die richtige openInputStream-API.
Mit dem Content Resolver können Sie einen
file://
Pfad vomcontent://
URI abrufen:quelle
android.provider.MediaStore.Images.ImageColumns.DATA
) immer garantiert, wenn das Schema vorhanden istcontent://
?File
wenn Sie versuchen, ContentResolver zu umgehen. Verwenden Sie ContentResolver-Methoden, um mit Uris zu arbeitencontent://
. Dies ist der offizielle Ansatz, der von Google-Ingenieuren empfohlen wird.Wenn Sie einen Inhalts-Uri haben
content://com.externalstorage...
, können Sie diese Methode verwenden, um den absoluten Pfad eines Ordners oder einer Datei unter Android 19 oder höher abzurufen .Sie können überprüfen, ob jeder Teil von Uri println verwendet. Die zurückgegebenen Werte für meine SD-Karte und den Hauptspeicher des Geräts sind unten aufgeführt. Sie können darauf zugreifen und löschen, wenn sich die Datei im Speicher befindet, aber ich konnte die Datei mit dieser Methode nicht von der SD-Karte löschen, sondern nur das Bild über diesen absoluten Pfad lesen oder öffnen. Wenn Sie eine Lösung zum Löschen mit dieser Methode gefunden haben, teilen Sie diese bitte mit. SD-KARTE
HAUPTERINNERUNG
Wenn Sie Uri erhalten möchten,
file:///
nachdem Sie den Pfad verwendet habenquelle
Der Versuch, den URI mit dem Schema content: // durch Aufrufen zu behandeln,
ContentResolver.query()
ist keine gute Lösung. Unter HTC Desire unter 4.2.2 kann NULL als Abfrageergebnis angezeigt werden.Warum nicht stattdessen ContentResolver verwenden? https://stackoverflow.com/a/29141800/3205334
quelle
content://
URL erhalten, die der Datei in ihrem privaten internen Verzeichnis entspricht, können Sie diese URLFile
in neuen Android-Versionen nicht mit APIs verwenden. ContentResolver wurde entwickelt, um diese Art von Sicherheitsbeschränkungen zu überwinden. Wenn Sie die URL von ContentResolver erhalten haben, können Sie davon ausgehen, dass sie nur funktioniert.Inspirierte Antworten sind Jason LaBrun & Darth Raven . Das Ausprobieren bereits beantworteter Ansätze führte mich zu der folgenden Lösung, die hauptsächlich Cursor-Null-Fälle und die Konvertierung von Inhalt: // in Datei: // abdeckt.
Um eine Datei zu konvertieren, lesen und schreiben Sie die Datei von gewonnenem uri
Um die Verwendung des Dateinamens zu erhalten, wird der Cursor-Null-Fall behandelt
Es gibt eine gute Option zum Konvertieren vom MIME-Typ in die Dateierweiterung
Cursor, um den Namen der Datei zu erhalten
quelle
Nun, ich bin etwas spät dran zu antworten, aber mein Code wird getestet
Prüfschema von uri:
In der obigen Antwort habe ich die Video-URL in ein Byte-Array konvertiert, aber das hat nichts mit der Frage zu tun. Ich habe nur meinen vollständigen Code kopiert, um die Verwendung von zu zeigen,
FileInputStream
undInputStream
da beide in meinem Code gleich funktionieren.Ich habe den variablen Kontext getActivity () in meinem Fragment verwendet und in Activity ist es einfach ActivityName.this
context=getActivity();
// im Fragmentcontext=ActivityName.this;
// in Aktivitätquelle
byte[] videoBytes;
? Die meisten Antworten zeigen nur die VerwendungInputStream
mit einem Bild.