15

Nach vielen Erkenntnissen über das Schreiben (und umbenennen) einer Datei in SD-Karte (Android 5 und höher), denke ich, die neue SAF von Android bereitgestellt werden erforderlich, um die Erlaubnis des Benutzers zum Schreiben der SD-Kartendatei zu erhalten.Android SD-Karte Schreibberechtigung mit SAF (Storage Access Framework)

Ich habe in diesem File Manger Anwendung ES Datei Explorer gesehen, dass zunächst Lese-und Schreibberechtigung der folgenden Art und Weise, wie in Bildern gezeigt.

enter image description here

Picture 2

Nach SD-Karte wählen, wird die Schreiberlaubnis erteilt.

Also auf die gleiche Weise habe ich versucht, SAF zu verwenden, aber beim Umbenennen einer Datei fehlgeschlagen. Mein Code:

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

    rename = (Button) findViewById(R.id.rename); 

    startActivityForResult(new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE), 42); 
} 

@Override 
public void onActivityResult(int requestCode,int resultCode,Intent resultData) { 
    if (resultCode != RESULT_OK) 
     return; 
    Uri treeUri = resultData.getData(); 
    DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri); 
    grantUriPermission(getPackageName(), treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
    getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
} 

public void renameclick(View v) { 
    File ff = new File("/storage/sdcard1/try1.jpg"); 
    try { 
     ff.createNewFile(); 
    } catch (Exception e) { 
     Log.d("error", "creating"); 
     e.printStackTrace(); 
    } 
} 

Noch nach dem Ausführen des Codes bekomme ich EAacces-Berechtigung verweigert.

Antwort

17

Wenn der Benutzer die "SD-Karte" oder sogar den SAF-Stamm "Interner Speicher" auswählt, erhält Ihre Anwendung Zugriff auf den entsprechenden Speicher, aber nur über die SAF-API, nicht direkt über das Dateisystem.

public void writeFile(DocumentFile pickedDir) { 
    try { 
     DocumentFile file = pickedDir.createFile("image/jpeg", "try2.jpg"); 
     OutputStream out = getContentResolver().openOutputStream(file.getUri()); 
     try { 

      // write the image content 

     } finally { 
      out.close(); 
     } 

    } catch (IOException e) { 
     throw new RuntimeException("Something went wrong : " + e.getMessage(), e); 
    } 
} 

In den letzten Version von Android, Daten außerhalb der Anwendung den Zugriff mit java.io.File ist fast vollständig veraltet: Zum Beispiel könnten Sie Code in so etwas wie übersetzt werden.

+0

Aber wenn ich eine Datei erstellen oder umbenennen muss, öffnet SAF-Picker –

+2

Sobald Sie den Baum-URI haben, können Sie alles tun, was Sie wollen mit den Dateien und Verzeichnissen, die es enthält. Sie müssen den Benutzer nicht jedes Mal fragen, ob 1) Sie 'takePersistableUriPermission()' verwenden und 2) Sie den URI irgendwo speichern, damit Sie ihn beim Start der Anwendung abrufen können. – bwt

+0

ok, habe ich verstanden. Danke –