0

Mit Android 6.0.1 API 23,Document-Picker halten auftauchend obwohl Ausdauer gesetzt (in SAF - Storage Access-Framework)

Ich implementierte erfolgreich eine Datei von einem Speicher-Standort zu lesen, dass die Benutzer-Picks in der Dokumentauswahl von SAF (Storage Access Framework).

Jetzt möchte ich die verwenden, die SAF erlaubt, damit meine App immer die selbe Datei auswählt (aber ohne irgendein Dokument-Auswahlfenster [und Unterfenster] zu jeder Zeit).

gelang es mir irgendwie in den (wie in den SAF-doc gezeigt) (für das ... siehe mein Codebeispiel unten ...) Persist-Berechtigungen Umsetzung - Aber Fragen kamen:

  1. Trotz von Persistenz-Erlaubnis arbeiten - warum taucht das Dokument-Picker-Fenster auf? Sobald die Datei vom Benutzer ausgewählt wurde - von diesem Moment an - möchte ich einfach den Dateiinhalt abrufen, ohne dass ein Auswahlfenster in den Vordergrund rückt. Ist das möglich? Und wenn ja, wie? (Ich kann sagen, dass die Persistenz-Erlaubnis irgendwie funktioniert, da die Datei sofort gelesen wird, ohne dass der Benutzer erneut auswählen muss. Aber dieses eklige Auswahlfenster sollte nicht auftauchen müssen - oder?
  2. Ist es möglich zu Behalte SAF-Persistenz-Erlaubnis, selbst wenn meine App geschlossen oder gestoppt wird? Wenn ja, wie?

Hier ist der Code-Beispiel, das den Inhalt der Datei bekommt, auch meine Studie mit dem Persistenz Erlaubnis:

Innerhalb einer StorageClientFragment Klasse:

public String locationFileContent; 

public void performFileSearch() { 
    Intent openDocumentIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
    openDocumentIntent.addCategory(Intent.CATEGORY_OPENABLE); 
    openDocumentIntent.setType("text/plain"); 
    openDocumentIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION 
           | Intent.FLAG_GRANT_WRITE_URI_PERMISSION 
           | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); 
    startActivityForResult(openDocumentIntent, READ_REQUEST_CODE); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent resultData) { 

    if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) { 
     Uri uri = null; 
     if (resultData != null) { 
      uri = resultData.getData(); 

      // Here is my Persist-permission trial !!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
      getActivity().getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 

      try { 
       this.locationFileContent = readTextFromUri(uri); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

private String readTextFromUri(Uri uri) throws IOException { 
    InputStream inputStream = getActivity().getContentResolver().openInputStream(uri); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
    StringBuilder stringBuilder = new StringBuilder(); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     stringBuilder.append(line); 
    } 
    inputStream.close(); 
    return stringBuilder.toString(); 
} 

das Fragment in MainActivity getan anlegen wird:

StorageClientFragment storageClientFragment; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (getSupportFragmentManager().findFragmentByTag(FRAGTAG) == null) { 
     FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
     storageClientFragment = new StorageClientFragment(); 
     transaction.add(storageClientFragment, FRAGTAG); 
     transaction.commit(); 
    } 
} 

die Filesearch Aufruf erfolgt, wenn ein Test Schaltfläche geklickt wird:

public void TestingButtonClicked(View view) { 
    this.storageClientFragment.performFileSearch(); 
    String stringFileContent = this.storageClientFragment.locationFileContent; 
    Toast.makeText(this, "Back in Main, Content = " + stringFileContent, Toast.LENGTH_SHORT).show(); 
} 

Der obige Code funktioniert gut. Aber noch einmal, wie kann ich verhindern, dass das SAF-Dokumentauswahlfenster ständig angezeigt wird (obwohl die persistente Berechtigung gesetzt ist)?

Antwort

0

Warum taucht das Dokumentauswahlfenster immer wieder auf?

Vermutlich weil Sie eine ACTION_OPEN_DOCUMENT Aktivität starten. Wenn Sie den Benutzer nicht bitten möchten, ein Dokument auszuwählen, starten Sie diese Aktivität nicht.

Ich möchte einfach den Dateiinhalt abrufen, ohne dass irgendein Auswahlfenster in den Vordergrund rückt. Ist das möglich ? Und wenn ja, wie?

Auf die gleiche Weise, dass Sie den Inhalt ursprünglich bekommen: die Uri-openInputStream() auf einem ContentResolver passieren.

Wenn Sie takePersistableUriPermissions() verwenden für langlebigen Zugriff auf den Inhalt zu zielen, ist es immer noch Ihr Job auf die Uri zu halten.Dies unterscheidet sich nicht wesentlich davon, wie diese Art von Sache in anderen Umgebungen funktioniert (z. B. Erinnerung an den Benutzerverlauf von lokalen Dateipfaden für ein Desktop-OS-Programm).

Da ein Uri kann trivialerweise zu und von einem String umgewandelt werden, das Speichern der Uri irgendwo (Datenbank, SharedPreferences oder andere Datei) ist nicht besonders schwierig.

Ist es möglich, SAF Persistenz-Erlaubnis zu behalten, selbst wenn meine App geschlossen oder gestoppt wird? Wenn ja, wie ??

takePersistableUriPermission(), wie Sie bereits implementiert haben.

+0

Vielen Dank! Das verdeutlicht viel. Das ist alles sehr neu für mich und mir war nicht bewusst, dass der URI einzigartig ist und beibehalten werden kann (zum Beispiel mit SharedPrefs). Und wenn ich richtig verstanden habe, überprüft die takePersistableUriPermission() irgendwie mit einer versteckten Sicherheitsflagge und sagt der App, dass es gut ist zu gehen (oder nicht, wenn der Benutzer nie etwas in der Dokumentenauswahl ausgewählt hat). Ganz nett - all das. Ich werde versuchen, dies umzusetzen. Danke noch einmal ! – iKK

Verwandte Themen