有没有办法在Android中启用作用域存储时获得100%正确的文件扩展名?
我正在尝试在我的Android应用程序中实现文件发送功能(任何文件都是允许的,并且这些文件不属于我的应用程序)。从有没有办法在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不能保证我获得的文件名具有中所述的文件扩展名。
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卡或下载文件夹中选择文件,则显示名称始终是文件名。如果选择了来自另一个提供商的文件(或者仅仅是内容),可能会发生这种情况。但我不想麻烦。