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

Java Android存储访问框架:打开文档读/写,java,android,android-5.0-lollipop,Java,Android,Android 5.0 Lollipop,我的任务:使用新的API(目标操作系统级别为21/棒棒糖),让用户选择一个或多个文件,以便应用程序可以修改它们 我正在遵循官方的榜样 但无论我尝试什么,返回的URI都是只读的。 每当我试图打开它们进行写作时,都会得到一个java.lang.IllegalArgumentException:媒体是只读的: java.lang.IllegalArgumentException: Media is read-only at android.database.DatabaseUtils.re

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

我正在遵循官方的榜样

但无论我尝试什么,返回的URI都是只读的。 每当我试图打开它们进行写作时,都会得到一个
java.lang.IllegalArgumentException:媒体是只读的

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

尽管文档中声明不再需要它,但我甚至把

<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());
        }
    }
}
private static final int ACTION\u PICK\u FILE=99;
私有列表selectedFiles=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
// (...)
findviewbyd(R.id.pick_file_按钮).setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
意向意向=新意向(意向.行动\打开\文件);
intent.setType(“*/*”);
intent.putExtra(intent.EXTRA_允许_倍数,true);
intent.putExtra(仅intent.EXTRA_本地_,true);
intent.addCategory(intent.CATEGORY\u可打开);
startActivityForResult(意图、行动和选择文件);
}
});
}
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图结果数据){
if(requestCode==ACTION\u PICK\u FILE&&resultCode==RESULT\u OK){
selectedFiles=新建ArrayList();
ClipData data=resultData.getClipData();
如果(数据!=null){
对于(int i=0;i
作为用户,您从哪些提供商中挑选?没有严格要求所有提供程序都授予写访问权限。另外,如果可以,请发布整个堆栈跟踪,而不仅仅是错误消息。从画廊/相机图像中选择,我将异常添加到问题中。嗨,亲爱的,我面临着同样的问题。你有什么问题吗?请帮忙
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());
        }
    }
}