我的任务:使用新的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());
}
}
}