1

我正在尝试在我的 Android 应用程序中实现文件发送功能(允许任何文件,并且这些文件不属于我的应用程序)。从ACTION_OPEN_DOCUMENT我收到一个,然后我用我从's获得的名称InputStream制作一个临时File对象,然后发送文件。我做这一切的原因是我使用了一个只允许对象的 3rd 方 API。ContentResolverOpenableColumns.DISPLAY_NAMEFile

但是OpenableColumns.DISPLAY_NAME并不能保证我得到的文件名具有文档中所述的文件扩展。据我了解,在较新版本的 Android 中,无法使用Scoped Storage获取文件的实际文件名或物理路径。因此,我必须检查文件名是否包含扩展名,如果没有 -使用MimeTypeMapContentResolver获取文件的 MIME 类型和最常见的扩展名。这种方法感觉不是很可靠,因为我必须同时依赖正确确定 MIME 类型和检索正确的扩展名。获取扩展至关重要,至少因为用户应该能够从桌面应用程序下载和打开 PC 上的文件。ContentResolverMimeTypeMap

那么,是否有可能在启用范围存储的情况下获得 100% 保证的文件名或至少文件扩展名?或者也许有更有效的方法来处理我的情况?我很感激这方面的一些帮助。

4

1 回答 1

0

试试这个方法,它帮助了我:

public static String getFileName(Uri uri, Context context) {
    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));
            }
        } finally {
            cursor.close();
        }
    }
    if (result == null) {
        result = uri.getPath();
        int cut = result.lastIndexOf('/');
        if (cut != -1) {
            result = result.substring(cut + 1);
        }
    }
    return result;
}
于 2020-06-11T10:53:27.567 回答