Android存储访问框架:打开文档读/写

时间:2015-12-05 15:51:39

标签: java android android-5.0-lollipop

我的任务:使用新的API(目标操作系统级别为21 / Lollipop),让用户选择一个或多个文件,以便应用程序可以修改它们。

我正在关注官方示例here

但无论我尝试什么,返回的URI都是只读的。 每当我尝试打开它们进行写作时,我都会得到java.lang.IllegalArgumentException: Media is read-only

 java.lang.IllegalArgumentException: Media is read-only
     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
     at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:148)
     at android.content.ContentProviderProxy.openAssetFile(ContentProviderNative.java:618)
     at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:986)
     at android.content.ContentResolver.openOutputStream(ContentResolver.java:733)
     at android.content.ContentResolver.openOutputStream(ContentResolver.java:709)
     at com.udojava.android.test.Test.modifyFile(Tools.java:95)

我试过了:

OutputStream os = context.getContentResolver().openOutputStream(uri);

ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "rw");

虽然文档说明了它不再需要它,但我甚至把

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

到我的清单,它没有帮助。

到目前为止我的代码:

private static final int ACTION_PICK_FILE = 99;
private List<Uri> selectedFiles = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // (...)

    findViewById(R.id.pick_file_button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
            intent.setType("*/*");
            intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
            intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
            intent.addCategory(Intent.CATEGORY_OPENABLE);

            startActivityForResult(intent, ACTION_PICK_FILE);
        }
    });
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
    if (requestCode == ACTION_PICK_FILE && resultCode == RESULT_OK) {
        selectedFiles = new ArrayList<Uri>();
        ClipData data = resultData.getClipData();
        if (data != null) {
            for (int i = 0; i < data.getItemCount(); i++) {
                selectedFiles.add(data.getItemAt(i).getUri());
            }
        }
        if (resultData.getData() != null) {
            selectedFiles.add(resultData.getData());
        }
    }
}

0 个答案:

没有答案