所以我对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();
}
}
}
如何获取完整的文件名而不仅仅是显示名称?
答案 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();
}
}