Ok, takže jsem na tomto projektu pracoval několik dní a většinu času jsem pracoval na tom, jak vypsat veškerou hudbu na zařízení v seznamu LIST VIEW nebo něco jiného. tohle mě zabíjí. Udělal jsem si tak blízko na jednom místě se všemi hudbou v jedné složce ukazuje, i když od většiny lidí bude mít sub složky pro věci, jako je artiest a alba potřebuji způsob, jak hledat podsložky pro MP3 nebo hudební soubory.
Zde je to, co jsem zatím pro Hudební sbírku:
package com.androidhive.musicplayer;
import Java.io.File;
import Java.io.FilenameFilter;
import Java.util.ArrayList;
import Java.util.HashMap;
import Android.provider.MediaStore;
public class SongsManager {
// SDCard Path
final String MEDIA_PATH = new String(MediaStore.Audio.Media.getContentUri("external").toString());
private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
// Constructor
public SongsManager(){
}
/**
* Function to read all mp3 files from sdcard
* and store the details in ArrayList
* */
public ArrayList<HashMap<String, String>> getPlayList(){
File home = new File(MEDIA_PATH);
if (home.listFiles(new FileExtensionFilter()).length > 0) {
for (File file : home.listFiles(new FileExtensionFilter())) {
HashMap<String, String> song = new HashMap<String, String>();
song.put("songTitle", file.getName().substring(0, (file.getName().length() - 4)));
song.put("songPath", file.getPath());
// Adding each song to SongList
songsList.add(song);
}
}
// return songs list array
return songsList;
}
/**
* Class to filter files which are having .mp3 extension
* */
class FileExtensionFilter implements FilenameFilter {
public boolean accept(File dir, String name) {
return (name.endsWith(".mp3") || name.endsWith(".MP3"));
}
}
}
Děkujeme komukoliv, kdo vám může pomoci. :)
Ačkoliv je tento post starý, pro ostatní lidi, jako jsem já, abych si vytvořil seznam hudby s jejich souborovou cestou, přidal jsem řešení zde. Sloupec MediaStore.Audio.Media.DATA
ve skutečnosti obsahuje cestu mediálního souboru. Potřebné informace můžete získat pomocí následujícího fragmentu:
ContentResolver cr = getActivity().getContentResolver();
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";
Cursor cur = cr.query(uri, null, selection, null, sortOrder);
int count = 0;
if(cur != null)
{
count = cur.getCount();
if(count > 0)
{
while(cur.moveToNext())
{
String data = cur.getString(cur.getColumnIndex(MediaStore.Audio.Media.DATA));
// Add code to get more column here
// Save to your list here
}
}
}
cur.close();
Všechny hudební soubory můžete vypsat pomocí tohoto kódu
//Some audio may be explicitly marked as not being music
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
String[] projection = {
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.DURATION
};
cursor = this.managedQuery(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
null,
null);
private List<String> songs = new ArrayList<String>();
while(cursor.moveToNext()) {
songs.add(cursor.getString(0) + "||"
+ cursor.getString(1) + "||"
+ cursor.getString(2) + "||"
+ cursor.getString(3) + "||"
+ cursor.getString(4) + "||"
+ cursor.getString(5));
}
Nezkoušel jsem tento kód, ale zdá se být správné. S tím budete na správné cestě.
Pracuji na stejném projektu právě teď a problém jsem již vyřešil.
K uložení dat skladeb budete potřebovat vlastní třídu:
package YOUR_PACKAGE;
public class Songs
{
private long mSongID;
private String mSongTitle;
public Songs(long id, String title){
mSongID = id;
mSongTitle = title;
}
public long getSongID(){
return mSongID;
}
public String getSongTitle(){
return mSongTitle;
}
}
Pak musíte definovat ArrayList v aktivitě se seznamem, který vyplníte údaji:
private ArrayList<Songs> arrayList;
a ve službě onCreate:
arrayList = new ArrayList<Songs>();
Pak musíte načíst data ze svého zařízení:
public void YOUR_METHOD_NAME(){
ContentResolver contentResolver = getContentResolver();
Uri songUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor songCursor = contentResolver.query(songUri, null, null, null, null);
if(songCursor != null && songCursor.moveToFirst())
{
int songId = songCursor.getColumnIndex(MediaStore.Audio.Media._ID);
int songTitle = songCursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
do {
long currentId = songCursor.getLong(songId);
String currentTitle = songCursor.getString(songTitle);
arrayList.add(new Songs(currentId, currentTitle, currentArtist));
} while(songCursor.moveToNext());
}
}
Potom zavolejte tuto metodu z onCreate:
YOUR_METHOD_NAME();
A nakonec musíte vytvořit vlastní třídu adaptéru, definovat tento adaptér v onCreate (v aktivitě s ListView) a nastavit tento adaptér na objekt ListView.
Vidím, že to bylo položeno před 3 lety a problém, který jsem už vyřešil, ale možná to bude pro někoho užitečné. Dík.
Zde je jednoduchá funkce, která vám dává všechny zvukové soubory v File Object.
public static List<File> getAllAudios(Context c) {
List<File> files = new ArrayList<>();
String[] projection = { MediaStore.Audio.AudioColumns.DATA ,MediaStore.Audio.Media.DISPLAY_NAME};
Cursor cursor = c.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, null, null, null);
try {
cursor.moveToFirst();
do{
files.add((new File(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)))));
}while(cursor.moveToNext());
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
return files;
}