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:
- 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?
- 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)?
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