![](/img/trans.png)
[英]How can I get information about the audio file that was selected by the user? (using SAF and MediaStore)
[英]How to get all the audio file using mediastore
我正在尝试从设备(内部和 SD 卡)获取所有媒体文件。到目前为止,我能够从 SD 卡的固定文件夹中获取所有媒体文件。我已经浏览了 mediastore 上的大部分网页。而且我能够获取媒体信息。但是如何从设备中获取所有音频文件,任何示例都会有所帮助。 我试过这种方式` public class SongDto {
public long songId;
public String songTitle;
public String songArtist;
public String path;
public short genre;
public long duration;
public String album;
public Bitmap albumArt;
public String toString() {
return String.format("songId: %d, Title: %s, Artist: %s, Path: %s, Genere: %d, Duration %s",
songId, songTitle, songArtist, path, genre, duration);
}
并在另一个类名中获取这些值
public class Utils {
private Context _context;
// constructor
public Utils(Context context) {
this._context = context;
}
public static ArrayList<SongDto> getMusicInfos(Context context) {
ArrayList<SongDto> musicInfos = new ArrayList<SongDto>();
现在我正试图在另一个班级中获得歌曲标题
private ArrayList<SongDto> musicInfos;
private Utils utils;
private ArrayList<String> songPaths = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
utils = new Utils(this);
songPaths = utils. getMusicInfos(songTitle);
}
private void update(){
ArrayAdapter<String> list=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,musicInfos.add(songTitle) );
}
}
我如何才能只获得所需的数组,如songId、songArtist、song duration 的数组。我做错的地方。如何设置getMusicInfos 方法`
你可以试试这个
ArrayList audio=new ArrayList();
Cursor c=getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Audio.Media.DISPLAY_NAME}, null, null, null);
while(c.moveToNext())
{
String name=c.getString(c.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
audio.add(name);
}
同样,您也可以通过指定INTERNEL_CONTENT_URI来获取内部存储音频文件
我用这段代码来获取所有歌曲数据
public static ArrayList<SongDto> getMusicInfos(Context context) {
ArrayList<SongDto> musicInfos = new ArrayList<SongDto>();
Cursor cursor = context.getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
if (cursor == null) {
return null;
}
for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToNext();
int isMusic = cursor.getInt(cursor
.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));
if (isMusic != 0) {
SongDto music = new SongDto();
music.path = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
if (!new File(music.path).exists()) {
continue;
}
music.songId = cursor.getLong(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
music.songTitle = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
music.songTitle = cursor.getString(cursor
.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
music.album = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
music.songArtist = cursor.getString(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
music.duration = cursor
.getLong(cursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(music.path);
music.albumArt = getBitmap(mmr.getEmbeddedPicture());
mmr.release();
musicInfos.add(music);
}
}
return musicInfos;
}
并将其用作数据对象
public class SongDto {
public long songId;
public String songTitle;
public String songArtist;
public String path;
public short genre;
public long duration;
public String album;
public Bitmap albumArt;
public String toString() {
return String.format("songId: %d, Title: %s, Artist: %s, Path: %s, Genere: %d, Duration %s",
songId, songTitle, songArtist, path, genre, duration);
}
}
AbumArt可能会为空
要将歌曲ID作为列表获取
String[] columns = { MediaStore.Audio.Media._ID };
cursor = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,columns, null, null, null);
并从游标中获取数据。 要获得内部和外部存储歌曲列表,截至目前我还没有解决方案。
以下代码获取手机中的所有 mp3 文件(包括从 Messenger 下载的音频文件、录制文件等):
private fun getAllMusics(): List<String> {
val result = mutableListOf<String>()
val cursor = contentResolver.query(
MediaStore.Files.getContentUri("external"),
arrayOf(MediaStore.Files.FileColumns.DATA),
"${MediaStore.Files.FileColumns.MIME_TYPE} = ?",
arrayOf(MimeTypeMap.getSingleton().getMimeTypeFromExtension("mp3")),
MediaStore.Files.FileColumns.DATE_ADDED
)
cursor?.let {
if (cursor.moveToFirst()) {
while (cursor.moveToNext()) {
result.add(cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA)) ?: "--")
}
}
}
return result
}
您可以通过修改selection
和selection args
参数来获取其他音频文件(如 WAV、WMA 等)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.