有没有办法在Android中启用作用域存储时获得100%正确的文件扩展名?

有没有办法在Android中启用作用域存储时获得100%正确的文件扩展名?,android,file,mime-types,storage-access-framework,scoped-storage,Android,File,Mime Types,Storage Access Framework,Scoped Storage,我正在尝试在我的Android应用程序中实现文件发送功能(任何文件都是允许的,并且这些文件不属于我的应用程序)。从ACTION\u OPEN\u文档我收到一个InputStream,然后我用从ContentResolver的OpenableColumns获取的名称创建一个temp文件对象。显示\u name,然后发送文件。我之所以这么做,是因为我使用的是第三方API,它只允许文件对象 但是,OpenableColumns.DISPLAY\u NAME不能保证我获得的文件名具有中所述的文件扩展名。

我正在尝试在我的Android应用程序中实现文件发送功能(任何文件都是允许的,并且这些文件不属于我的应用程序)。从
ACTION\u OPEN\u文档
我收到一个
InputStream
,然后我用从
ContentResolver
OpenableColumns获取的名称创建一个temp
文件
对象。显示\u name
,然后发送文件。我之所以这么做,是因为我使用的是第三方API,它只允许
文件
对象

但是,
OpenableColumns.DISPLAY\u NAME
不能保证我获得的文件名具有中所述的文件扩展名。据我所知,在较新版本的安卓系统中,没有办法获得文件的实际文件名或物理路径。因此,我必须检查文件名是否包含扩展名,如果不包含扩展名,则使用
ContentResolver
获取文件的MIME类型以及最常用的扩展名。这种方法感觉不是很可靠,因为我必须依靠
ContentResolver
正确确定MIME类型和
MimeTypeMap
检索正确的扩展名。获得扩展名至关重要,至少因为用户应该能够从桌面应用程序下载并打开PC上的文件


那么,在启用作用域存储的情况下,是否可以获得100%保证的文件名或至少文件扩展名?或者有没有更有效的方法来处理我的情况?我非常感谢您的帮助。

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

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;
}

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

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;
}

感谢您的输入,但我认为
ACTION\u OPEN\u DOCUMENT
只返回
内容://
URI,它的
显示\u名称
不一定是带扩展名的文件名。我用了一段时间,它得到了扩展名为“file.pdf”的名称。谢谢您的输入,但是我认为
ACTION\u OPEN\u DOCUMENT
只返回一个
content://
URI,它的
DISPLAY\u NAME
不一定是一个带扩展名的文件名。我用了一段时间,它得到了扩展名为“file.pdf”的名称。这与作用域存储有什么关系?OPEN_DOCUMENT_FILE在这里要长得多。@blackapps我的意思是,如果没有作用域存储,我可以非常轻松地检索文件路径,并从中获得文件扩展名(我可以在没有SAF的情况下访问文件)。不幸的是,我不知道什么是
OPEN\u DOCUMENT\u FILE
。你有没有得到一个不是文件名的显示名?@blackapps没有,我对Android开发非常陌生,所以我不知道它会发生多久(尽管我认为这是一种罕见的情况)。但正如文档中所述,这是可能发生的,所以我的问题是尽可能安全。如果用户从内存或可移动sd卡或下载文件夹中选择文件,则显示名称始终是文件名。如果选择了来自另一个提供商的文件(或者仅仅是内容),可能会发生这种情况。但我不想麻烦。这与作用域存储有什么关系?OPEN_DOCUMENT_FILE在这里要长得多。@blackapps我的意思是,如果没有作用域存储,我可以非常轻松地检索文件路径,并从中获得文件扩展名(我可以在没有SAF的情况下访问文件)。不幸的是,我不知道什么是
OPEN\u DOCUMENT\u FILE
。你有没有得到一个不是文件名的显示名?@blackapps没有,我对Android开发非常陌生,所以我不知道它会发生多久(尽管我认为这是一种罕见的情况)。但正如文档中所述,这是可能发生的,所以我的问题是尽可能安全。如果用户从内存或可移动sd卡或下载文件夹中选择文件,则显示名称始终是文件名。如果选择了来自另一个提供商的文件(或者仅仅是内容),可能会发生这种情况。但我不想麻烦。