Android SD card Write Permission using SAF (Storage Access Framework)

Po wielu ustaleniach dotyczących zapisu (i zmiany nazwy) pliku na karcie SD (android 5 i wyżej), myślę, że nowy SAF dostarczony przez Androida będzie musiał pobrać pozwolenie od użytkownika do zapisu pliku Karty SD.

Widziałem w tej aplikacji żłobka pliku ES File Explorer , że początkowo zajmuje uprawnienia do odczytu i zapisu w następujący sposób, jak pokazano na zdjęciach.

Tutaj wpisz opis obrazka

Zdjęcie 2

Po wybraniu karty sd zapis udzielam pozwolenia.

Więc w ten sam sposób próbowałem użyć SAF, ale nie udało mi się zmienić nazwy pliku. Mój kod:

@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();
    }
}

Nadal po uruchomieniu kodu dostaję odmowę uprawnień EAacces.

Author: jox, 2016-04-26

1 answers

Pozwalając użytkownikowi wybrać" kartę SD "lub nawet" pamięć wewnętrzną " SAF root Daje aplikacji dostęp do odpowiedniej pamięci masowej, ale tylko przez interfejs API SAF, a nie bezpośrednio przez system plików. Na przykład kod można przetłumaczyć na coś w stylu:

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);
    }
}

W najnowszej wersji Androida dostęp do danych poza aplikacją za pomocą java.io.File jest prawie całkowicie przestarzały.

 18
Author: bwt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-26 12:56:42