Вопрос по android, hashmap – Загрузка песен Android с SD-карты

2

Я загружаю свои песни с SD-карты и помещаю его в список.

Я использую этот метод. но это займет некоторое время, и если путь будет другим, я не получу эти данные.

так , QUE Есть ли полезный скрипт, который отображает песни со всех моих SD-карт. Если они в каталог / песни.

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

Please give your comments on this .

Вместо этого используйте провайдера контента MediaStorestackoverflow.com/questions/5273519/… Pramod

Ваш Ответ

5   ответов
0

// попробуйте этот рабочий код

public ArrayList<HashMap<String, String>> getAudioList() {

    ArrayList<HashMap<String, String>> mSongsList = new ArrayList<HashMap<String, String>>();
    Cursor mCursor = getContentResolver()..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;
}
как мы можем показать этот плейлист в виде списка
Акшай Тяги, пожалуйста, следуйте моему нижеследующему коду, и если у вас возникнут какие-либо проблемы, вы можете обратиться ко мне :)
1

используйте этот код для реализации этой функциональности.

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>
0

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 = новый Intent (это, PlayListActivity.class); startActivityForResult (i, 100); по этим линиям вы можете позвонить в PlaylistActivity из любого места
5

это очень эффективный и правильный способ получения данных и их отображения с помощью 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); 
}
Я понял. Как вы видели в моем коде & gt; Я называю другое имя вызова SongManger. ТАК Я заменю этим. Спасибо .. если возникнет какая-либо ошибка, я скажу вам, пожалуйста, помогите мне .. full Error
я должен заменить ваш код на мой или в другой файл? Я уверен, что приму ваш ответ, но, если возможно, пожалуйста, ведите меня мусорить больше. Я новичок в этой области. full Error
Надеюсь, его работа для меня. Большое спасибо.. full Error
замените его моим кодом. поместите этот код внутри на создание вашей деятельности, которая содержит представление списка в XML.
конечно, без проблем :)
1
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);
        }

но файлы не приходят

Похожие вопросы