2016-10-21 2 views
1

В моем приложении пользователь может выбрать каталог для загрузки. Если он выбирает внешний съемный SD-карта (не эмулированная SD-карта !, а память, которая представляет собой настоящую физическую карту microSD, например), начиная с Android 4.4. Я могу писать только с помощью SAF (Storage Access Framework).Storage Access Framework, takePersistableUriPermission

Я понял, как создать и записать один файл с помощью SAF:

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

А вот мой onActivityResult, где я на самом деле записать в файл:

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

А также 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(); 
    } 
} 

И, наконец, мой вопрос:

Как создать другие файлы и записать их после того, как я вызвал getContentResolver().takePersistableUriPermission без подсказки, чтобы выбрать каталог в будущем?

Если я прав, то getContentResolver().takePersistableUriPermission shoudl позвольте мне сделать Tha

ответ

1

Благодаря @ earthw0rmjim ответ, и прибегая к помощи, я figgured из законченное решение:

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

Итак, во-первых, если мы не имеют PersistedUriPermissions, он будет запрашивать такие разрешения. Таким образом, вот как onActivityResult выглядит

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

И 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(); 
    } 
} 
Смежные вопросы