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

时间:2018-03-20 03:11:04

标签: android

所以我对Android开发很陌生。我正在尝试让用户使用文件管理器从SD卡或内部存储中选择一首歌曲并将文件上传到服务器。现在,我只是试图访问用户选择的文件的名称,以便我可以使用它来访问该文件的内容并上传这些内容。

我查看过有关此内容的其他帖子,其中大部分都会告诉您查询内容解析器,然后使用光标获取显示名称,但这并不总是返回显示名称(this is mentioned in Google's guide to the SAF) 。它还没有返回完整的文件名,只是它的一部分(歌曲的标题)。

这是启动意图的代码:

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

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

2 个答案:

答案 0 :(得分:0)

您还可以在Cursor中使用 TITLE 作为URI参数来获取文件的全名 使用下面的代码

Cursor cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,MediaStore.Audio.Media.TITLE, null, null, null);

或者您可以使用 DATA 来获取文件的路径

Cursor cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,MediaStore.Audio.Media.DATA, null, null, null);

所有您需要做的就是让用户选择音乐,在使用 DATA 选择后,您有完整的歌曲路径,并且 TITLE 您有全名的文件。

接下来只需上传。

答案 1 :(得分:0)

您可以采取一些措施来改善查询的性能 你得到的所有列都可能很慢。 您可以编写如下所示的代码,然后检查您要使用的字段。您将获得设备中安装的所有音频文件的所有数据。您可以在调试器中浏览此代码以查看所需的数据。

{

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

            }