在Android 11中,将文件从一个路径复制到另一个路径可以通过以下步骤实现:
FileProvider
类来获取文件的Uri,该类提供了安全的文件共享机制。使用FileProvider.getUriForFile()
方法,传入上下文、授权提供者的authority和源文件路径,即可获取到源文件的Uri。FileProvider.getUriForFile()
方法,传入上下文、授权提供者的authority和目标文件路径,即可获取到目标文件的Uri。ContentResolver
的openInputStream()
方法打开源文件的输入流,再使用ContentResolver
的openOutputStream()
方法打开目标文件的输出流。然后,通过读取源文件的输入流并将数据写入目标文件的输出流,即可完成文件的复制操作。以下是一个示例代码,演示了如何在Android 11中将文件从一个路径复制到另一个路径:
import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import androidx.core.content.FileProvider;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class FileCopyUtil {
public static void copyFile(Context context, String sourceFilePath, String destinationFilePath) throws IOException {
// 获取源文件的Uri
Uri sourceUri = getFileUri(context, sourceFilePath);
// 创建目标文件的Uri
Uri destinationUri = getFileUri(context, destinationFilePath);
// 执行文件复制操作
copyFileFromUri(context, sourceUri, destinationUri);
}
private static Uri getFileUri(Context context, String filePath) {
File file = new File(filePath);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// Android 10及以上版本使用MediaStore的API获取文件的Uri
return MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY, file.getId());
} else {
// Android 9及以下版本使用FileProvider获取文件的Uri
return FileProvider.getUriForFile(context, "com.example.fileprovider", file);
}
}
private static void copyFileFromUri(Context context, Uri sourceUri, Uri destinationUri) throws IOException {
ContentResolver contentResolver = context.getContentResolver();
try (InputStream inputStream = contentResolver.openInputStream(sourceUri);
OutputStream outputStream = contentResolver.openOutputStream(destinationUri)) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
}
}
请注意,上述示例代码中使用了FileProvider
来获取文件的Uri,需要在AndroidManifest.xml文件中进行相应的配置。
此外,为了确保文件复制操作的顺利进行,需要在AndroidManifest.xml文件中添加相应的权限声明。例如,如果要复制外部存储上的文件,需要添加以下权限声明:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
以上是在Android 11中将文件从一个路径复制到另一个路径的方法。这种方式适用于各种文件类型,包括图片、视频、音频、文档等。