2017-06-15 4 views
1

Benutzer klicken Sie auf .txt Datei im Datei-Explorer und rufen Sie den Dialog "Öffnen mit ..." und dort ist meine App aufgeführt. Wenn ich versuche, die Datei zu öffnen, möchte ich ihren absoluten Pfad erhalten. Alles, was ich Inhalt erhalten ist: // URIWie Datei-URI beim Öffnen der Datei mit intent.action.VIEW erhalten?

I/ActivityManager: START u0 {act=android.intent.action.VIEW dat=content://com.android.providers.downloads.documents/document/1031 typ=text/plain

Wenn ich Pfad zu meiner Datei abrufen möchten, muss ich Datei erhalten: // URI. Wie kann ich nur file:// URI anstelle von content:// bekommen? Hier

ist AndroidManifest

 <intent-filter > 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" />  
      <data android:mimeType="text/*"/> 
     </intent-filter> 

Hier ist, wie ich versuche, Datei zu handhaben:

Intent i = getIntent(); 
String action = i.getAction(); 
String type = i.getType(); 

if (Intent.ACTION_VIEW.equals(action) && type != null) { 
    Uri uri = i.getData(); 
    if (uri != null) { 
     Toast.makeText(this, uri.toString(), Toast.LENGTH_SHORT).show(); 
    }     
} 

Antwort

1

Hier ist AndroidManifest

Ihre <intent-filter> sagt, dass Sie behandeln können text/* Inhalt egal wo kommt es von.

Wenn ich versuche, Datei zu öffnen, ich will seinen absoluten Pfad bekommen

Dann brauchen Sie <data android:scheme="file"> zu Ihrem <intent-filter> hinzuzufügen, zu erklären, dass Sie nur mit file Systemen arbeiten. Ihre App wird in Apps, die keine fileUri Werte verwenden, wie der von Ihnen verwendete "Dateimanager", nicht mehr als Option angezeigt. Und seit fileUri Werte auf Android 7.0+ effektiv verboten sind, wird Ihre App mit der Zeit weniger nützlich sein. Bis 2020 oder so wird Ihre App nutzlos sein.

Oder Sie könnten die Anforderung "wollen ihren absoluten Pfad" loswerden. Wenn Sie den Textinhalt von einer file oder contentUri abrufen möchten, können Sie beispielsweise openInputStream() auf einer ContentResolver verwenden.

+0

Aber ich will nicht nur Datei lesen, ich möchte auch Datei bearbeiten und speichern. –

+0

@PersonalJesus: Es gibt 'openOutputStream()', auch auf 'ContentResolver'. IOW, die gleichen Dinge, die Sie mit einem absoluten Pfad machen würden und 'FileInputStream' /' FileOutputStream' sind Dinge, die Sie mit 'content'' Uri' und 'openInputStream()'/'openOutputStream()' machen können. – CommonsWare

Verwandte Themen