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

Léa*_*iot 0 java android uri delete-file

我正在尝试使用 删除文件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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,用例如下:

  • 用户点击 id 为 的活动菜单条目R.id.delete_file
  • 然后用户必须选择一个目录
  • 然后是这个目录下的一个文件。这是android.net.Uri在代码中检索 an 的位置。
  • 给定这个 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)
Run Code Online (Sandbox Code Playgroud)

请注意,在代码中的另一个位置,我使用类delete()的方法java.io.File,其参数是文件路径(字符串),而不是 ,android.net.Uri并且删除适用于同一个文件。

你能帮我解决这个问题吗?谢谢。

bla*_*pps 5

消息中显示不支持该操作。

尝试改为:

DocumentFile srcDoc = DocumentFile.fromSingleUri(context, data.getData());

if ( srcDoc.delete() )
                    {

                    }
Run Code Online (Sandbox Code Playgroud)

您的答案可能有效,但代码太复杂。用户也不必先选择目录。