繁体   English   中英

删除给定存储访问框架 uri 的文件并使用内容解析器失败

[英]Deleting a file given a Storage Access Framework uri and using content resolver fails

我正在尝试使用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();
            }
        }
    }
}

因此,用例如下:

  • 用户点击 ID 为R.id.delete_file的活动菜单条目。
  • 然后用户必须选择一个目录
  • 然后是这个目录中的一个文件。 这是在代码中检索android.net.Uri地方。
  • 鉴于这个uri,我想删除相应的文件。

问题如下:

contentResolver.delete(uri, null, 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)

请注意,在代码的另一个地方,我使用java.io.File类的delete()方法,其参数是文件路径(字符串),而不是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();
            }                
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM