2016-10-21 4 views
1

In meiner Anwendung kann Benutzer das Download-Verzeichnis auswählen. Wenn er wählt externe entfernbare SD-Karte (keine emulierte SD-Karte !, aber ein Speicher, der zum Beispiel eine echte microSD-Karte ist), ab Android 4.4 kann ich nur schreiben mit SAF (Storage Access Framework).Storage Access Framework, takePersistableUriPermission

Ich habe herausgefunden, wie eine einzelne Datei mit SAF erstellen und schreiben:

public void newFile() { 
    Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); 

    intent.addCategory(Intent.CATEGORY_OPENABLE); 
    intent.setType("text/plain"); 
    intent.putExtra(Intent.EXTRA_TITLE, "newfile.txt"); 

    startActivityForResult(intent, CREATE_REQUEST_CODE); 
} 

public void saveFile() { 
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 
    intent.setType("text/plain"); 

    startActivityForResult(intent, SAVE_REQUEST_CODE); 
} 

Und hier ist mein onActivityResult, wo ich Datei tatsächlich schreiben Sie an:

public void onActivityResult(int requestCode, int resultCode, 
          Intent resultData) { 
    Uri currentUri = null; 

    if (resultCode == Activity.RESULT_OK) { 
     if (requestCode == CREATE_REQUEST_CODE) { 
      if (resultData != null) { 
       Log.d(TAG, "CREATE_REQUEST_CODE resultData = " + resultData); 
      } 
     } else if (requestCode == SAVE_REQUEST_CODE) { 

      if (resultData != null) { 
       currentUri = resultData.getData(); 
       getContentResolver().takePersistableUriPermission(currentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION 
         | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
       writeFileContent(currentUri); 
       Log.d(TAG, "SAVE_REQUEST_CODE currentUri = " + currentUri); 
      } 
     } 
    } 
} 

Und auch writeFileContent :

private void writeFileContent(Uri uri) { 
    try { 
     ParcelFileDescriptor pfd = 
       this.getContentResolver(). 
         openFileDescriptor(uri, "w"); 

     FileOutputStream fileOutputStream = 
       new FileOutputStream(pfd.getFileDescriptor()); 

     String textContent = "some text"; 

     fileOutputStream.write(textContent.getBytes()); 

     fileOutputStream.close(); 
     pfd.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Und schließlich meine Frage:

Wie erstelle ich andere Dateien und schreibe sie, nachdem ich getContentResolver().takePersistableUriPermission ohne eine Aufforderung zur Auswahl eines Verzeichnisses in Zukunft angerufen habe?

Wenn ich Recht habe, dann getContentResolver().takePersistableUriPermission shoudl erlauben Sie mir tha

Antwort

1

Dank @ earthw0rmjim Antwort zu tun, und googeln, ich figgured eine Komplettlösung aus:

public void saveFile() { 
    List<UriPermission> permissions = getContentResolver().getPersistedUriPermissions(); 
    if (permissions != null && permissions.size() > 0) { 
     DocumentFile pickedDir = DocumentFile.fromTreeUri(this, permissions.get(0).getUri()); 
     DocumentFile file = pickedDir.createFile("text/plain", "try2.txt"); 
     writeFileContent(file.getUri()); 
    } else { 
     Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
     intent.addCategory(Intent.CATEGORY_OPENABLE); 
     intent.setType("text/plain"); 

     startActivityForResult(intent, SAVE_REQUEST_CODE); 
    } 
} 

Also erstens, wenn wir nicht haben PersistedUriPermissions, wird es solche Berechtigungen anfordern. Auf diese Weise ist hier, wie onActivityResult wie

sieht
public void onActivityResult(int requestCode, int resultCode, 
          Intent resultData) { 
    Uri currentUri = null; 

    if (resultCode == Activity.RESULT_OK) { 
     if (requestCode == SELECT_DIR_REQUEST_CODE) { 
      if (resultData != null) { 
       Uri treeUri=resultData.getData(); 
       Log.d(TAG, "SELECT_DIR_REQUEST_CODE resultData = " + resultData); 
       getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION 
         | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
       DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri); 
       DocumentFile file = pickedDir.createFile("text/plain", "try2.txt"); 
       writeFileContent(file.getUri()); 
      } 
     } 
    } 
} 

Und die writeFileContent sieht gleiche wie in der Frage

private void writeFileContent(Uri uri) { 
    try { 
     ParcelFileDescriptor pfd = 
       this.getContentResolver(). 
         openFileDescriptor(uri, "w"); 

     FileOutputStream fileOutputStream = 
       new FileOutputStream(pfd.getFileDescriptor()); 

     String textContent = "some text"; 

     fileOutputStream.write(textContent.getBytes()); 

     fileOutputStream.close(); 
     pfd.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
Verwandte Themen