После того как я выяснил, что возможности доступа к внешнему хранилищу сильно различаются в разных android версиях, я выбрал go с Storage Access Framework (SAF). SAF - это API (начиная с уровня API 19), который предлагает пользователю пользовательский интерфейс для просмотра файлов.
Используя Intent, появляется пользовательский интерфейс, который позволяет пользователю создать файл или выбрать существующий:
private static final int CREATE_REQUEST_CODE = 40;
private Uri mFileLocation = null;
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("text/plain"); // specify file type
intent.putExtra(Intent.EXTRA_TITLE, "newfile.txt"); // default name for file
startActivityForResult(intent, CREATE_REQUEST_CODE);
После выбора пользователем файла вызывается onActivityResult(...)
. Теперь можно получить URI файла, вызвав resultData.getData ();
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (resultCode == Activity.RESULT_OK)
{
if (requestCode == CREATE_REQUEST_CODE)
{
if (resultData != null) {
mFileLocation = resultData.getData();
}
}
}
}
Теперь используйте этот URI для записи в файл:
private void writeFileContent(Uri uri, String contentToWrite)
{
try
{
ParcelFileDescriptor pfd = this.getContentResolver().openFileDescriptor(uri, "w"); // or 'wa' to append
FileOutputStream fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());
fileOutputStream.write(contentToWrite.getBytes());
fileOutputStream.close();
pfd.close();
} catch (IOException e) {
e.printStackTrace();
}
}