File 文档contract.copyDocument

File 文档contract.copyDocument,file,permissions,copy,File,Permissions,Copy,我对文档contract.copyDocument有问题 每次程序崩溃时:“java.lang.UnsupportedOperationException:不支持复制” 奇怪的是,下面列出的操作正在正常运行 文档合同.移动文档 文档合同.删除文档 文档合同.重命名文档 DocumentsContract.createDocument SD卡访问权限显然已授予(未经许可,上述操作将失败) 为什么支持文档移动、删除和重命名,但不支持复制? 有人能帮我解决这个问题吗 copyDocument和move

我对
文档contract.copyDocument有问题

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

文档合同.移动文档

文档合同.删除文档

文档合同.重命名文档

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;
    }






}

package com.example.forum14\u 11\u 2020;
导入androidx.annotation.Nullable;
导入androidx.appcompat.app.appcompat活动;
导入androidx.documentfile.provider.documentfile;
导入android.content.ActivityNotFoundException;
导入android.content.Context;
导入android.content.Intent;
导入android.content.uri权限;
导入android.net.Uri;
导入android.os.Bundle;
导入android.os.storage.StorageManager;
导入android.os.storage.StorageVolume;
导入android.provider.documents合同;
导入android.view.view;
导入android.widget.Button;
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.util.List;
公共类MainActivity扩展了AppCompatActivity{
Uri;
文档文件pickedDir;
按钮1;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button1=新按钮(MainActivity.this);
Button1=findViewById(R.id.Button1);
按钮1.setOnClickListener(onClickListener_按钮1);
TakeCarduri许可(“存储/1619-0D07”);
}
View.OnClickListener OnClickListener\u Button1=新建View.OnClickListener(){
@凌驾
公共void onClick(视图v){
uri=getUri();
pickedDir=DocumentFile.fromtreeeuri(getBaseContext(),uri);
DocumentFile file=pickedDir.findFile(“trunt.txt”);
DocumentFile folder=pickedDir.findFile(“文件夹”);
试一试{
//DocumentsContract.moveDocument(getContentResolver()、file.getUri()、folder.getUri()、folder.getUri());//工作正常!
//DocumentsContract.deleteDocument(getContentResolver(),file.getUri());//工作正常!
//DocumentsContract.RenamedDocument(getContentResolver(),file.getUri(),file.getName()+“_rename”);//工作正常!
DocumentsContract.copyDocument(getContentResolver()、file.getUri()、folder.getUri());//不工作
}捕获(不支持操作异常| FileNotFoundException e){
e、 printStackTrace();
e、 getMessage();
}
}
};
public void takeCardUriPermission(字符串sdCardRootPath){
int stop=1;
if(android.os.Build.VERSION.SDK\u INT>=android.os.Build.VERSION\u code.N){
文件sdCard=新文件(sdCardRootPath);
StorageManager StorageManager=(StorageManager)getSystemService(Context.STORAGE\u服务);
StorageVolume-StorageVolume=storageManager.getStorageVolume(SD卡);
Intent Intent=storageVolume.createAccessIntent(null);
试一试{
startActivityForResult(意向书,4010);
}捕获(ActivityNotFounde异常){
}
}
}
受保护的void onActivityResult(int-requestCode、int-resultCode、@Nullable-Intent-data){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==4010){
Uri=data.getData();
grantUriPermission(getPackageName(),uri,Intent.FLAG\授予\写入\ uri\权限|
意图。标志(授予读取权限);
final int takeFlags=data.getFlags()&(Intent.FLAG\授予\写入\ URI\权限|
意图。标志(授予读取权限);
getContentResolver().takePersistableUriPermission(uri,takeFlags);
}
}
公共Uri getUri(){
List PersistedUrpermissions=getContentResolver().GetPersistedUrpermissions();
if(persistedPermissions.size()>0){
UriPermission UriPermission=persistedPermissions.get(0);
返回uriPermission.getUri();
}
返回null;
}
}

我也有同样的问题。有什么解决办法吗?嗨,SayantanRC!还没有,到目前为止我还没有一个解决方案是的,我想还有其他的方法来解决这个问题。但无论如何,我试图找到一个问题的答案,为什么只复制不起作用,这一切的意义是什么:),我甚至认为我的电脑软件或硬件有问题。DocumentsContract的操作是一种很好的、相对简单的文件操作方法,很遗憾花时间尝试发明其他(逻辑性较差的)方法。我肯定有人知道答案,但似乎技术娴熟的人没有时间回答:)@SayantanRC这里最近类似的讨论是的,那家伙也放弃了。遗憾的是,开发人员不得不使用各种复杂的方法来完成如此简单的文件操作。