2016-08-02 42 views
2

Hallo ich jede Datei in Android mit folgendem Vorsatz bin Kommissionierung:Warum funktioniert der URI-Pfad nicht mit der Datei?

 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
     intent.setType("*/*"); 
     startActivityForResult(intent, PICKFILE_REQUEST_CODE); 

ich Uri für gepflückt Datei bin immer & auch durch den Aufruf uri.getPath() Dateipfad Methode Ich erhalte. Nach dem Ermitteln des Pfads erstelle ich ein Dateiobjekt mit file = new File(new URI(filePath));, aber ich bekomme IllegalArgumentException : URI is not absolute. Warum ist das so? Wie bekomme ich den Absoluten Pfad? Gibt es eine andere Alternative, um irgendeine Datei mit Intent & dann Uri auszuwählen?

In android Debugger uri Objekt zeigt wie (es von Downloads ist): content://com.android.providers.downloads.documents/document/67

& uri.getPath() gibt mir /document/67

+0

wählen Sie Bild? –

+0

'Log.d' der Wert von' filePath', auch warum verwenden Sie 'File (URI)' ctor? – pskink

+0

Sohail Zahid Ich erstelle keine Datei mit angegebenem Mime-Typ, @pskink plz siehe bearbeitete Frage. – pcj

Antwort

2

Zurück Uri Schema haben kann, die von file:// unterscheidet, dh es ist nicht immer eine URI ist zu lokale Datei oder Datei für alle Geräte-Apps verfügbar. Z.B. es kann content:// URI sein und sein Pfad hat nichts mit dem lokalen Dateisystempfad gemeinsam. Fairer Weg zur Problemumgehung - testen Sie, ob das Schema file:// ist und falls nicht - öffnen Sie InputStream über context.getContentResolver().openInputStream(uri) und kopieren Sie dann den Inhalt in die lokale temporäre Datei.

+0

Im Debugger sehe ich Schema als Inhalt: // – pcj

+0

Und das ist der Grund, warum Sie nicht URI-Pfad als Pfad zur lokalen Datei verwenden können - dieser Pfad ist eine abstrakte Entität, die nur im Kontext von 'ContentProvider' eine Bedeutung hat, Das hat diesen URI generiert. Sie können nur die in Antwort beschriebene Problemumgehung verwenden. – Sergio

+0

Sie meinen also, dass, wenn das Schema Inhalt ist, ich dies tun muss ---> "öffne InputStream über context.getContentResolver(). OpenInputStream (uri) und kopiere dann den Inhalt in die lokale temporäre Datei." ? – pcj