hpi*_*que 369 android uri file file-uri
什么是从一个转换的最简单的方法file: android.net.Uri,以一个File在Android的?
尝试以下但它不起作用:
final File file = new File(Environment.getExternalStorageDirectory(), "read.me");
Uri uri = Uri.fromFile(file);
File auxFile = new File(uri.toString());
assertEquals(file.getAbsolutePath(), auxFile.getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)
Adi*_*ain 733
你想要的是......
new File(uri.getPath());
Run Code Online (Sandbox Code Playgroud)
... 并不是...
new File(uri.toString());
Run Code Online (Sandbox Code Playgroud)
注意: uri.toString()返回格式为:的String "file:///mnt/sdcard/myPicture.jpg",而uri.getPath()返回格式为String的字符串:"/mnt/sdcard/myPicture.jpg".
San*_*rde 44
搜索了很长时间后,这对我有用:
File file = new File(getPath(uri));
public String getPath(Uri uri)
{
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
if (cursor == null) return null;
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String s=cursor.getString(column_index);
cursor.close();
return s;
}
Run Code Online (Sandbox Code Playgroud)
Mat*_*hen 27
编辑:对不起,我之前应该测试得更好.这应该工作:
new File(new URI(androidURI.toString()));
Run Code Online (Sandbox Code Playgroud)
URI是java.net.URI.
小智 17
使用
InputStream inputStream = getContentResolver().openInputStream(uri);
Run Code Online (Sandbox Code Playgroud)
直接复制文件.另见:
https://developer.android.com/guide/topics/providers/document-provider.html
Jac*_*ień 13
这些都不适合我.我发现这是一个有效的解决方案.但我的案例是针对图像的.
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getActivity().getContentResolver().query(uri, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();
Run Code Online (Sandbox Code Playgroud)
Tim*_*mur 12
另一种方法是创建临时文件。要做到这一点:
fun createTmpFileFromUri(context: Context, uri: Uri, fileName: String): File? {
return try {
val stream = context.contentResolver.openInputStream(uri)
val file = File.createTempFile(fileName, "", context.cacheDir)
org.apache.commons.io.FileUtils.copyInputStreamToFile(stream,file)
file
} catch (e: Exception) {
e.printStackTrace()
null
}
}
Run Code Online (Sandbox Code Playgroud)
我们使用Apache Commons库FileUtils类。要将其添加到您的项目中:
implementation "commons-io:commons-io:2.7"
Run Code Online (Sandbox Code Playgroud)
请注意,请务必file.delete()在使用后调用。欲了解更多信息,请查看文档。
最佳方案
创建一个简单的FileUtil java类并用于创建,复制和重命名该文件
我用uri.toString(),uri.getPath()但不适合我.我终于找到了这个解决方案
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.OpenableColumns;
import android.util.Log;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class FileUtil {
private static final int EOF = -1;
private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
private FileUtil() {
}
public static File from(Context context, Uri uri) throws IOException {
InputStream inputStream = context.getContentResolver().openInputStream(uri);
String fileName = getFileName(context, uri);
String[] splitName = splitFileName(fileName);
File tempFile = File.createTempFile(splitName[0], splitName[1]);
tempFile = rename(tempFile, fileName);
tempFile.deleteOnExit();
FileOutputStream out = null;
try {
out = new FileOutputStream(tempFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
if (inputStream != null) {
copy(inputStream, out);
inputStream.close();
}
if (out != null) {
out.close();
}
return tempFile;
}
private static String[] splitFileName(String fileName) {
String name = fileName;
String extension = "";
int i = fileName.lastIndexOf(".");
if (i != -1) {
name = fileName.substring(0, i);
extension = fileName.substring(i);
}
return new String[]{name, extension};
}
private static String getFileName(Context context, Uri uri) {
String result = null;
if (uri.getScheme().equals("content")) {
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
try {
if (cursor != null && cursor.moveToFirst()) {
result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
if (result == null) {
result = uri.getPath();
int cut = result.lastIndexOf(File.separator);
if (cut != -1) {
result = result.substring(cut + 1);
}
}
return result;
}
private static File rename(File file, String newName) {
File newFile = new File(file.getParent(), newName);
if (!newFile.equals(file)) {
if (newFile.exists() && newFile.delete()) {
Log.d("FileUtil", "Delete old " + newName + " file");
}
if (file.renameTo(newFile)) {
Log.d("FileUtil", "Rename file to " + newName);
}
}
return newFile;
}
private static long copy(InputStream input, OutputStream output) throws IOException {
long count = 0;
int n;
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
while (EOF != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}
return count;
}
}
Run Code Online (Sandbox Code Playgroud)
在代码中使用FileUtil类
try {
File file = FileUtil.from(MainActivity.this,fileUri);
Log.d("file", "File...:::: uti - "+file .getPath()+" file -" + file + " : " + file .exists());
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
Android + Kotlin
为Kotlin Android扩展添加依赖项:
implementation 'androidx.core:core-ktx:{latestVersion}'
从uri获取文件:
uri.toFile()
Android + Java
只是移到顶部;)
如果您有一个Uri符合 的,DocumentContract那么您可能不想使用File. 如果您使用 kotlin,请用于DocumentFile执行您在旧世界中会使用的操作File,并用于ContentResolver获取流。
其他一切几乎肯定会破裂。
使用Kotlin,它甚至更容易:
val file = File(uri.path)
Run Code Online (Sandbox Code Playgroud)
或者,如果您使用的是Android的Kotlin扩展程序:
val file = uri.toFile()
Run Code Online (Sandbox Code Playgroud)