2012-11-26 8 views
23

これで数日間はこのプロジェクトに取り組んできましたが、ほとんどの時間は、リストビューやその他そうでなければ、私は数日前にこれを探し、これが私を殺している。ほとんどの人は芸術的なものやアルバムのようなもののためのサブフォルダを持っているので、私は1つのフォルダにすべての音楽を表示するので、私は近くになった。私はMP3や音楽ファイルのサブフォルダを検索する方法が必要です。助けることができる誰にでもPATHを使ってMediaStoreのすべての音楽を一覧表示

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

} 

感謝を:ここで

は、私がこれまでの音楽コレクションのために持っているものです。 :)

+0

MediaStoreからそのリストを取得してみませんか? –

+0

メディアストアを試してみましたが、どうすればいいですか? – user1853951

答えて

17

あなたはthis code

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

を使用して、すべての音楽ファイルを一覧表示することができ、私はこのコードを試していないが、それは正しいようです。あなたはそれで正しい軌道に乗るでしょう。

+0

Hmmm私はあなたのコードをtryedしていますが、私のコードを修正して、それをどのようにして表示することができますか?私はちょうどそれの周りに私の頭を得るcarnt。 – user1853951

+0

@MarvinLabsあなたは特定の曲のmediastoreからファイルパスを取得する方法を知っていますか? –

+0

賢いコード。私は解決のために約8時間を探していました。ありがとうございました。 –

26

投稿は古いですが、自分のファイルパスで音楽のリストを作成するというアイデアを得るために、私はここで解決策を追加しました。 MediaStore.Audio.Media.DATA実際には、列にメディアファイルのパスが含まれています。次のスニペットを使用して必要な情報を取得できます。

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(); 
+0

@AshishSahuあなたはあなたのコメントを説明してください。私はそれを何度も読んだことがあり、あなたが何を言っているのかを知りません:) –

+0

@ amos-bordowitzコードがAshishのコメントの後に修正されている可能性があります。 – Sara

2

私は現在同じプロジェクトに取り組んでおり、すでに問題を解決しています。

あなたの曲データを保存するためにカスタムクラスが必要になります。

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

次に、あなたがデータを取り込むなるリストビューの活動でのArrayListを定義する必要があります。

private ArrayList<Songs> arrayList; 

とでonCreate:

arrayList = new ArrayList<Songs>(); 

次に、デバイスからデータを取得する必要があります。

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

その後のonCreateからこのメソッドを呼び出します。

YOUR_METHOD_NAME(); 

そして最後に、あなたは、カスタムアダプタクラスを作成します(リストビューでの活動で)のonCreateでこのアダプタを定義し、あなたのListViewオブジェクトにこのアダプタを設定する必要があります。

私はそれが3年前に尋ねられたと私はすでに解決したと思う問題を参照してくださいが、おそらくそれは誰かの役に立つだろう。ありがとう。

関連する問題