Java Android存储访问框架:打开文档读/写
我的任务:使用新的API(目标操作系统级别为21/棒棒糖),让用户选择一个或多个文件,以便应用程序可以修改它们 我正在遵循官方的榜样 但无论我尝试什么,返回的URI都是只读的。 每当我试图打开它们进行写作时,都会得到一个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
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());
}
}
}