首页 > 解决方案 > DocumentsContract.copyDocument

问题描述

我有问题DocumentsContract.copyDocument

每次我的程序崩溃时:“java.lang.UnsupportedOperationException:不支持复制” 奇怪的是下面列出的操作工作正常

DocumentsContract.moveDocument

DocumentsContract.deleteDocument

DocumentsContract.renameDocument

DocumentsContract.createDocument

显然已授予访问 SD 卡的权限(未经许可,上述操作将失败)

为什么支持移动、删除和重命名文档,但不支持复制?谁能帮我解决这个问题?

copyDocument 和 moveDocument 之间是否存在很大的概念差异。为什么移动有效而复制无效?

任何提示将不胜感激

package com.example.forum14_11_2020;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.documentfile.provider.DocumentFile;

import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.UriPermission;
import android.net.Uri;
import android.os.Bundle;
import android.os.storage.StorageManager;
import android.os.storage.StorageVolume;
import android.provider.DocumentsContract;
import android.view.View;
import android.widget.Button;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    Uri uri;
    DocumentFile pickedDir;
    Button Button1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button1 = new Button(MainActivity.this);
        Button1 = findViewById(R.id.button1);
        Button1.setOnClickListener(onClickListener_Button1);

        takeCardUriPermission("storage/1619-0D07");

    }


    View.OnClickListener onClickListener_Button1 = new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            uri = getUri();
            pickedDir = DocumentFile.fromTreeUri(getBaseContext(), uri);

            DocumentFile file = pickedDir.findFile("attempt.txt");
            DocumentFile folder = pickedDir.findFile("folder");

            try {
                //DocumentsContract.moveDocument(getContentResolver(), file.getUri(), folder.getUri(), folder.getUri()); // does work!
                //DocumentsContract.deleteDocument(getContentResolver(), file.getUri()); // does work!
                //DocumentsContract.renameDocument(getContentResolver(), file.getUri(), file.getName() + "_rename"); // does work!
                DocumentsContract.copyDocument(getContentResolver(), file.getUri(), folder.getUri()); // does not work

            } catch (UnsupportedOperationException | FileNotFoundException e) {
                e.printStackTrace();
                e.getMessage();
            }

        }
    };





    public void takeCardUriPermission(String sdCardRootPath) {

        int stop=1;

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            File sdCard = new File(sdCardRootPath);
            StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
            StorageVolume storageVolume = storageManager.getStorageVolume(sdCard);
            Intent intent = storageVolume.createAccessIntent(null);
            try {
                startActivityForResult(intent, 4010);
            } catch (ActivityNotFoundException e) {
            }
        }
    }


    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 4010) {

            Uri uri = data.getData();

            grantUriPermission(getPackageName(), uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION |
                    Intent.FLAG_GRANT_READ_URI_PERMISSION);

            final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_WRITE_URI_PERMISSION |
                    Intent.FLAG_GRANT_READ_URI_PERMISSION);

            getContentResolver().takePersistableUriPermission(uri, takeFlags);
        }
    }

    public Uri getUri() {
        List<UriPermission> persistedUriPermissions = getContentResolver().getPersistedUriPermissions();
        if (persistedUriPermissions.size() > 0) {
            UriPermission uriPermission = persistedUriPermissions.get(0);
            return uriPermission.getUri();
        }
        return null;
    }






}

标签: filepermissionscopy

解决方案


推荐阅读