【问题标题】:Android songs fetching from SD card从 SD 卡获取 Android 歌曲
【发布时间】:2012-04-30 22:57:52
【问题描述】:

我正在从 SD 卡中获取我的歌曲并将他放到列表视图中。

我正在使用这种方法。 但它需要一些时间,如果路径不同,我没有得到该数据。

所以, QUE 是否有任何有用的脚本可以显示我所有 SD 卡中的歌曲。 如果他们进入目录/歌曲。

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 FileExtensionFilter implements FilenameFilter {
        public boolean accept(File dir, String name) {
            return (name.endsWith(".mp3") || name.endsWith(".MP3"));
        }
    }

请给你的cmets。

【问题讨论】:

标签: android filter hashmap android-sdcard android-mediaplayer


【解决方案1】:

我曾经将 MediaStore 用于我的音乐应用程序,这是一种非常有效和正确的方法来检索数据,然后使用 ListView 显示它。这将检索存储在 SDCard 上任何文件夹中的任何音乐文件。

    //your database elect statement 
    String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
    //your projection statement 
    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,
            MediaStore.Audio.Media.ALBUM_ID
    };
    //query 
    cursor = this.managedQuery(
            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            projection,
            selection,
            null,
            null);


    while(cursor.moveToNext()){
            songs.add(cursor.getString(0));
            songs.add(cursor.getString(1));
            songs.add(cursor.getString(2));
            songs.add(cursor.getString(3));
            songs.add(cursor.getString(4));
            songs.add(cursor.getString(5));
            album_id.add((long) cursor.getFloat(6));
    } 
    int a[]= new int[]{R.id.textView1 ,R.id.textView3};//, R.id.textview2};
    ListAdapter adapter = new SimpleCursorAdapter(this,
            R.layout.items, cursor, new String[]{MediaStore.Audio.Media.TITLE,           MediaStore.Audio.Media.ARTIST/*, MediaStore.Audio.Media.DURATION*/} ,a);
            setListAdapter(adapter); 
}

【讨论】:

  • 我应该用我的代码替换你的代码还是替换到另一个文件中?我肯定会接受你的回答,但如果可能的话,请多多指导我。我是这个领域的新手。
  • 用我的代码替换它。将此代码放在您的活动的 oncreate 中,其中包含 xml 中的列表视图。
  • 我明白了。正如您在我的代码中看到的那样> 我将另一个名称称为 SongManger 。所以我会用那个代替。谢谢..如果遇到任何错误我会告诉你请帮助我..
  • 嘿,我已经使用了上面提到的答案。我得到了所有的文件名,但我如何播放它们? MediaStore 有一个 getUri 方法,但是需要传入一个参数。
【解决方案2】:
ArrayList<String> names = new ArrayList<String>();
    String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
    Uri uri;
    int columnIndex;
    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, MediaStore.Audio.Media.ALBUM_ID };
    ListView lst;
    ArrayAdapter<String> adapter;
    Cursor cursor;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

        cursor = this.managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                projection, selection, null, null);

        if (cursor.getCount() == 0) {

            Toast.makeText(getBaseContext(),
                    "cursor value" + cursor.getCount(), Toast.LENGTH_SHORT)
                    .show();
        } else {

            cursor.moveToFirst();
            do {
                names.add(cursor.getString(cursor
                        .getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)));

            } while (cursor.moveToNext());

            adapter = new ArrayAdapter<String>(Home.this,
                    android.R.layout.simple_list_item_1, names);

            lst.setAdapter(adapter);
        }

我的光标计数为 0,实际上我在 sdcard 中添加了一个文件夹,但文件没有出现

【讨论】:

    【解决方案3】:

    //试试这个它的工作代码

    public ArrayList<HashMap<String, String>> getAudioList() {
    
        ArrayList<HashMap<String, String>> mSongsList = new ArrayList<HashMap<String, String>>();
        Cursor mCursor = getContentResolver().query(
                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                new String[] { MediaStore.Audio.Media.DISPLAY_NAME,
                        MediaStore.Audio.Media.DATA }, null, null, null);
    
        int count = mCursor.getCount();
        System.out.println("total no of songs are=" + count);
        HashMap<String, String> songMap;
        while (mCursor.moveToNext()) {
            songMap = new HashMap<String, String>();
            songMap.put(
                    "songTitle",
                    mCursor.getString(mCursor
                            .getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)));
            songMap.put("songPath", mCursor.getString(mCursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)));
            mSongsList.add(songMap);
        }
        mCursor.close();
        return mSongsList;
    }
    

    【讨论】:

    • Akshay Tyagi 请按照我的以下代码进行操作,如果您遇到任何问题,可以向我咨询 :)
    【解决方案4】:

    这将帮助您使用该播放列表制作列表视图

    public class PlayListActivity extends ListActivity {
    public ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
    private Context context;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.playlist);
        EditText search = (EditText) findViewById(R.id.et_search_music);
        ListView lv = (ListView) findViewById(android.R.id.list);
        context = PlayListActivity.this;
        ArrayList<HashMap<String, String>> songsListData = new ArrayList<HashMap<String, String>>();
        this.songsList = MusicPlayerActivity.songsList;
        if (this.songsList.size() > 0) {
            final SimpleAdapter adapter = new SimpleAdapter(this,
                    this.songsList, R.layout.playlist_item,
                    new String[] { "songTitle" }, new int[] { R.id.songTitle });
            setListAdapter(adapter);
            lv.setTextFilterEnabled(true);
            lv = getListView();
            search.addTextChangedListener(new TextWatcher() {
    
                @Override
                public void onTextChanged(CharSequence s, int start,
                        int before, int count) {
                    adapter.getFilter().filter(s);
    
                }
    
                @Override
                public void beforeTextChanged(CharSequence s, int start,
                        int count, int after) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void afterTextChanged(Editable s) {
                    // TODO Auto-generated method stub
    
                }
            });
            lv.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    int CurrentSongIndex = position;
                    Intent in = new Intent();
                    in.putExtra("songIndex", CurrentSongIndex);
                    setResult(100, in);
                    finish();
                }
            });
        }
    }
    

    }

    【讨论】:

    • Intent i = new Intent(this, PlayListActivity.class); startActivityForResult(i, 100);通过这些行,您可以从任何地方调用 PlaylistActivity
    【解决方案5】:

    请使用此代码来实现此功能。

    public class SdCardSongsFragment extends Fragment {
    public File file;
    private List<String> myList;
    private List<String> mycountList;
    private ListView listView;
    private TextView pathTextView;
    private String mediapath = new String(Environment.getExternalStorageDirectory().getAbsolutePath());
    String selection =MediaStore.Audio.Media.DATA +" like ?";
    String[] projection = {MediaStore.Audio.Media.DATA , MediaStore.Audio.Media.DISPLAY_NAME}; 
    Cursor cursor2;
    //your database elect statement 
    String selection2 = MediaStore.Audio.Media.IS_MUSIC + " != 0";
    //your projection statement 
    String[] projection2= {
            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,
            MediaStore.Audio.Media.ALBUM_ID
    };
    
    private final static String[] acceptedExtensions= {"mp3", "mp2", "wav", "flac", "ogg", "au" , "snd", "mid", "midi", "kar"
        , "mga", "aif", "aiff", "aifc", "m3u", "oga", "spx"};
    
    /** Called when the activity is first created. */
    @Override
    
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.activity_sdcrad_song, container, false);
    
        listView=(ListView) rootView.findViewById(R.id.pathlist);
        pathTextView=(TextView) rootView.findViewById(R.id.path);
    
        myList = new ArrayList<String>();   
        mycountList= new ArrayList<String>();   
        String root_sd = Environment.getExternalStorageDirectory().toString();
        Log.e("Root",root_sd);
    
        String state = Environment.getExternalStorageState();
        File list[] = null ;
        /* if ( Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state) ) {  // we can read the External Storage...
            list=getAllFilesOfDir(Environment.getExternalStorageDirectory());
        }*/
    
        pathTextView.setText(root_sd);
    
        file = new File( root_sd ) ;       
        list = file.listFiles(new AudioFilter());
        Log.e("Size of list ","" +list.length);
        //LoadDirectory(root_sd);
    
        for( int i=0; i< list.length; i++)
        {
    
            String name=list[i].getName();
            int count =     getAudioFileCount(list[i].getAbsolutePath());
            Log.e("Count : "+count, list[i].getAbsolutePath());
            if(count!=0) {
                myList.add(name);
                mycountList.add(""+count);
            }
    
    
        }
    
    
        listView.setAdapter(new SDcardSongListAdapter(getActivity(), myList,mycountList ));
    
        listView.setOnItemClickListener(new OnItemClickListener() {
    
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                    long arg3) {
                File temp_file = new File( file, myList.get( position ) );  
    
                if( !temp_file.isFile())        
                {
    
    
                    file = new File( file, myList.get( position ));
                    File list[] = file.listFiles(new AudioFilter());
    
                    myList.clear();
                    mycountList.clear();
                    for( int i=0; i< list.length; i++)
                    {
                        String name=list[i].getName();
    
                        int count =     getAudioFileCount(list[i].getAbsolutePath());
                        Log.e("Count : "+count, list[i].getAbsolutePath());
                        if(count!=0) {
                            myList.add(name);
                            mycountList.add(""+count);
                        }
    
                    }
    
                    pathTextView.setText( file.toString());
                    //Toast.makeText(getApplicationContext(), file.toString(), Toast.LENGTH_LONG).show(); 
                    listView.setAdapter(new SDcardSongListAdapter(getActivity(), myList,mycountList ));
    
                }
    
                else {
                    Log.e("Not dirctory ", file.getAbsolutePath());
                    Cursor cur=getAudioFileCursor(file.getAbsolutePath());
                    Log.e("Cur count ", ""+cur.getCount());
                     MusicUtils.playAll(getActivity(), cur,position);
                }
    
    
            }
        });
        return rootView;
    
    
    
    }
    
    private int getAudioFileCount(String dirPath) {
    
         Log.e("Path :  ", dirPath);
        String[] selectionArgs={dirPath+"%"};
        Cursor cursor = getActivity().managedQuery(
                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                projection2,
                selection,
                selectionArgs,
                null);
    
    
        cursor2=cursor;
        if(cursor!=null)
            Log.e("Cur : ", ""+cursor.getCount());
        return cursor.getCount();
    }
    
    private Cursor getAudioFileCursor(String dirPath) {
    
    
        String[] selectionArgs={dirPath+"%"};
        Cursor cursor = getActivity().managedQuery(
                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                projection2,
                selection,
                selectionArgs,
                null);
        return cursor;
    }
    
    
    
    
    public void onBack() {
        String parent="";
        if(file!=null)
            parent = file.getParent().toString();
    
        file = new File( parent ) ;         
        File list[] = file.listFiles(new AudioFilter());
    
        myList.clear();
        mycountList.clear();
        for( int i=0; i< list.length; i++)
        {
            String name=list[i].getName();
            int count =     getAudioFileCount(list[i].getAbsolutePath());
            Log.e("Count : "+count, list[i].getAbsolutePath());
            if(count!=0) {
                myList.add(name);
                mycountList.add(""+count);
    
            }
            /*int count=getAllFilesOfDir(list[i]);
                Log.e("Songs count ",""+count);
                if(count!=0)*/
    
        }
        pathTextView.setText(parent);
        //  Toast.makeText(getApplicationContext(), parent,          Toast.LENGTH_LONG).show(); 
        listView.setAdapter(new SDcardSongListAdapter(getActivity(), myList,mycountList ));
    
    }
    
    
    
    // class to limit the choices shown when browsing to SD card to media files
    public class AudioFilter implements FileFilter {
    
        // only want to see the following audio file types
        private String[] extension = {".aac", ".mp3", ".wav", ".ogg", ".midi", ".3gp", ".mp4", ".m4a", ".amr", ".flac"};
    
        @Override
        public boolean accept(File pathname) {
    
            // if we are looking at a directory/file that's not hidden we want to see it so return TRUE
            if ((pathname.isDirectory() || pathname.isFile()) && !pathname.isHidden()){
                return true;
            }
    
            // loops through and determines the extension of all files in the directory
            // returns TRUE to only show the audio files defined in the String[] extension array
            for (String ext : extension) {
                if (pathname.getName().toLowerCase().endsWith(ext)) {
                    return true;
                }
            }
    
            return false;
        }      
    }
    

    }

    XML 文件代码:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/title_songs"
    android:orientation="vertical" >
    
    <TextView
        android:id="@+id/pathDR"
        android:layout_width="fill_parent"
        android:layout_height="70dp"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"
        android:gravity="bottom"
        android:text="Directory"
        android:textColor="#ffffff"
        android:textSize="19sp"
        android:typeface="monospace" />
    
    <TextView
        android:id="@+id/path"
        android:layout_width="fill_parent"
        android:layout_height="18dp"
        android:layout_marginBottom="10dp"
        android:layout_marginLeft="10dp"
        android:gravity="bottom"
        android:text=""
        android:textColor="#ffffff"
        android:textSize="12sp"
        android:typeface="monospace" />
    
    <View
        android:layout_width="fill_parent"
        android:layout_height="2dp"
        android:background="#ffffff" />
    
    <ListView
      android:background="@drawable/bg"
        android:id="@+id/pathlist"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ListView>
    
    </LinearLayout>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多