React Native - 从安卓内容URI中获取文件名

3


我需要从Android内容URI中获取文件名,例如:
content://com.android.providers.downloads.documents/document/15

我尝试使用React Native FS stat,但它返回“文件不存在”的错误。

我该怎么做呢?


这不是一个文件。在标准的Java/Kotlin Android中,您可以使用DocumentFile.fromSingleUri()getName()函数来获取与由Uri标识的内容相关联的“显示名称”。我不知道是否有人为此创建了React Native包装器。 - CommonsWare
1
在React Native中,您可以使用getContentResolver().query(uri)查询内容解析器以获取DISPLAY_NAME,并使用返回的游标来获取DISPLAY_NAME列。 - blackapps
2个回答

2

我在React Native中没有找到纯解决方案,因此我创建了一个Android原生包,并从中创建了React Native模块,以便我可以使用它。


以下是Android代码:

@ReactMethod
    public void getFileNameFromUri(String filepath, Promise promise) {
        Uri uri = Uri.parse(filepath);
        String fileName = "";

        if (uri.getScheme().equals("content")) {
            try {
                Cursor cursor = reactContext.getContentResolver().query(uri, null, null, null, null);

                if (cursor.moveToFirst()) {
                    fileName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
                    Log.d("FS", "Real File name: " + fileName);
                }
                cursor.close();
                promise.resolve(fileName);
            } catch (IllegalArgumentException ignored) {
                promise.reject("1", "Can not get cursor");
            }
        } else {
            promise.resolve(fileName);
        }
    }

这是如何在React Native中从Android原生代码进行模块化的方法:react-native-modules-android

太好了。我个人的目标是找到为React Native构建的支持Android和iOS的解决方案。你试过https://github.com/joltup/rn-fetch-blob吗?还有一个使用rn-fetch-blob的stackoverflow答案https://stackoverflow.com/questions/54743482/get-the-array-of-filenames-stored-in-document-directory-in-react-native - Alex
@Alex,我没有亲自试过,但是我了解到它的工作原理类似于reat-native-fs,可以获取文件的真实路径。就我所知,在Android中无法获取真实文件路径。而在IOS中,由于可以通过file://获取真实文件路径,因此获取文件名非常容易,只需要从路径中截取文件名即可。 - david890ch

1

也许:

let filename = uri.substring(uri.lastIndexOf('/') + 1, uri.length)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接