问题描述
我正在尝试使用Storage Access Framework
删除文件。
以下是一些代码元素:
public class MyActivity extends AppCompatActivity
{
@Override
public boolean onoptionsItemSelected(MenuItem menuItem)
{
int n_requestCode;
switch(menuItem.getItemId())
{
[...]
case R.id.delete_file:
n_requestCode = 108;
startSAFActionopendocumentTree(n_requestCode);
break;
[...]
}
[...]
}
public void startSAFActionopendocumentTree(int n_requestCode)
{
Intent intent;
intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent,n_requestCode);
}
private void startSAFActionopendocument(int n_requestCode)
{
Intent intent = null;
intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent,n_requestCode);
}
protected void onActivityResult(int n_requestCode,int n_resultCode,Intent data)
{
android.net.Uri uri;
ContentResolver contentResolver;
if(n_requestCode == 108)
{
n_requestCode = 109;
startSAFActionopendocument(n_requestCode);
}
else if(n_requestCode == 109)
{
uri = data.getData();
contentResolver = getContentResolver();
try
{
contentResolver.delete(uri,null,null);
}
catch(Exception exn)
{
exn.printstacktrace();
}
}
}
}
因此,用例如下:
问题如下:
contentResolver.delete(uri,null);
引发以下异常:
W/System.err: java.lang.UnsupportedOperationException: Delete not supported
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.delete(ContentProviderNative.java:544)
at android.content.ContentResolver.delete(ContentResolver.java:1330)
at [...]MyActivity.onActivityResult(MyActivity.java:[...])
at android.app.Activity.dispatchActivityResult(Activity.java:6490)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
at android.app.ActivityThread.access$1400(ActivityThread.java:150)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
请注意,在代码的另一处,我使用delete()
类的java.io.File
方法,并将其参数作为文件路径(字符串)而不是android.net.Uri
并且删除适用于相同的文件。
您能帮我解决这个问题吗?谢谢。
解决方法
消息不支持该操作。
请尝试:
DocumentFile srcDoc = DocumentFile.fromSingleUri(context,data.getData());
if ( srcDoc.delete() )
{
}
您的答案可能有用,但是代码太复杂。 此外,用户不必先选择目录。
,我发现使用类DocumentFile
而不是ContentResolver
的解决方案。
该文件已删除。
public class MyActivity extends AppCompatActivity
{
@Override
public boolean onOptionsItemSelected(MenuItem menuItem)
{
int n_requestCode;
switch(menuItem.getItemId())
{
[...]
case R.id.delete_file:
n_requestCode = 109;
startSAFActionOpenDocument(n_requestCode);
break;
[...]
}
[...]
}
private void startSAFActionOpenDocument(int n_requestCode)
{
Intent intent = null;
intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent,n_requestCode);
}
protected void onActivityResult(int n_requestCode,int n_resultCode,Intent data)
{
DocumentFile srcDoc;
if(n_requestCode == 109)
{
srcDoc = DocumentFile.fromSingleUri(this,data.getData());
try
{
srcDoc.delete();
}
catch(Exception exn)
{
exn.printStackTrace();
}
}
}
}