如何从Android URI中获取文件名,而不仅仅是显示名?

如何从Android URI中获取文件名,而不仅仅是显示名?,android,Android,所以我对安卓系统的开发还很陌生。我试图让用户使用文件管理器从SD卡或内部存储器中选择一首歌曲,然后将该文件上载到服务器。现在,我只是尝试访问用户选择的文件名,以便稍后使用它访问文件内容并上载这些内容 我看过其他关于这方面的文章,大多数文章都告诉您查询内容解析器,然后使用光标获取显示名称,但这并不总是返回显示名称()。它没有返回完整的文件名,只是部分文件名(歌曲的标题) 以下是我的代码,它启动了意图: Intent chooseIntent = new Intent(Intent.ACTION_G

所以我对安卓系统的开发还很陌生。我试图让用户使用文件管理器从SD卡或内部存储器中选择一首歌曲,然后将该文件上载到服务器。现在,我只是尝试访问用户选择的文件名,以便稍后使用它访问文件内容并上载这些内容

我看过其他关于这方面的文章,大多数文章都告诉您查询内容解析器,然后使用光标获取显示名称,但这并不总是返回显示名称()。它没有返回完整的文件名,只是部分文件名(歌曲的标题)

以下是我的代码,它启动了意图:

Intent chooseIntent = new Intent(Intent.ACTION_GET_CONTENT); 
chooseIntent.addCategory(Intent.CATEGORY_OPENABLE);
chooseIntent.setType("audio/*");
startActivityForResult(chooseIntent, SELECT_SONG_FILE_REQUEST_CODE);
我现在如何获取显示名称:

String fileName = null;

    if (uri.getScheme().equals("content")) {
        try (Cursor cursor = getContentResolver().query(uri, null, null, null, null, null)) {
            if (cursor != null && cursor.moveToFirst()) {
                fileName = cursor.getString(
                        cursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME));
                Log.i(TAG, "Filename: " + fileName);
                cursor.close();
            }
        }
    }

如何获取完整的文件名而不仅仅是显示名?

您还可以使用游标中的TITLE作为URI参数来获取文件的完整名称 使用下面的代码吧

Cursor cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,MediaStore.Audio.Media.TITLE, null, null, null);
或者您可以使用数据获取文件路径

Cursor cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,MediaStore.Audio.Media.DATA, null, null, null);
你所要做的就是让用户选择音乐,使用数据选择后,你就有了歌曲的完整路径,使用标题你就有了文件的全名


接下来只需上传它。

您可以做几件事来提高查询的性能 你得到的所有列都可能慢得令人痛苦。 您可以编写如下代码,然后检查要使用的字段。您将获得设备中安装的所有音频文件的所有数据。您可以在调试器中浏览此代码以查看所需的数据

{


我应该使用
MediaStore.Audio.Media.EXTERNAL\u CONTENT\u URI
还是文件的实际URI?到目前为止,尝试使用前者会导致运行时异常,而后者在尝试使用数据时返回
null
                Uri             objUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                ContentResolver     cr = context.getContentResolver();
                String[] entityColumns =  {MediaStore.Audio.AudioColumns.DATA,
                        MediaStore.Audio.AudioColumns.DISPLAY_NAME,
                        MediaStore.Audio.AudioColumns.TITLE};

                cursor = cr.query(
                        objUri,
                        entityColumns,
                        null,
                        null,
                        null);

                if (cursor != null && cursor.moveToFirst()) {
                    do {
                        String filePath = cursor.getString(cursor.getColumnIndex(entityCoumns[0]));
                        String fileName = cursor.getString(cursor.getColumnIndex(entityColumns[1]));
                        String fileTitle =
                                cursor.getString(cursor.getColumnIndex(entityColumns[2]));
                    }  while (cursor.moveToNext());
                    cursor.close();
                }

            }