gpt4 book ai didi

android - 如何在 Android Oreo (8.1) 或更高版本中从 URI 获取文件路径

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:42:27 27 4
gpt4 key购买 nike

预期行为

当我选择存储在“下载”中的文件时,它应该能够检索其文件名和路径

实际行为

当我选择存储在“下载”中的文件时,它返回 null。

重现问题的步骤

  1. 调用picking file方法时,显示Android中的文件夹
  2. 转到下载,选择一个文件
  3. 从URI获取真实路径返回null

Here is the code what i implemented

public static String getPath(final Context context, final Uri uri) {
String id = DocumentsContract.getDocumentId(uri);
if (!TextUtils.isEmpty(id)) {
if (id.startsWith("raw:")) {
return id.replaceFirst("raw:", "");
}
try {
final boolean isOreo = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
String stringContentURI;
Uri contentUri;
if(isOreo){
stringContentURI = "content://downloads/my_downloads";
}else{
stringContentURI = "content://downloads/public_downloads";
}
contentUri = ContentUris.withAppendedId(
Uri.parse(stringContentURI), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
} catch (NumberFormatException e) {
return null;
}
}
}

public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = { column};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}

但是,从 Android 设备中的其他文件夹中选择文件时,它可以正常工作

请指教。谢谢大家:)

最佳答案

目前,获取路径的最佳方法是:

从 URI 获取物理文件作为 InputStream,ContentResolver.openInputStream() 允许您在不知道其真实路径的情况下访问文件的内容

String id = DocumentsContract.getDocumentId(uri);
InputStream inputStream = getContentResolver().openInputStream(uri);

然后将其作为临时文件写入缓存存储

File file = new File(getCacheDir().getAbsolutePath()+"/"+id);
writeFile(inputStream, file);
String filePath = file.getAbsolutePath();

Here is the method to write temporary file into cached storage

void writeFile(InputStream in, File file) {
OutputStream out = null;
try {
out = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len;
while((len=in.read(buf))>0){
out.write(buf,0,len);
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
try {
if ( out != null ) {
out.close();
}
in.close();
} catch ( IOException e ) {
e.printStackTrace();
}
}
}

不确定这是否是最好的方法,但代码可以正常工作 :D

关于android - 如何在 Android Oreo (8.1) 或更高版本中从 URI 获取文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52775398/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com