2012-01-24 15 views
7

मैं कोड के रूप यह पेज उपयोग कर रहा हूँ पर सभी संगीत:प्रदर्शन एसडी कार्ड

http://z4android.blogspot.com/2011/06/displaying-list-of-music-files-stored.html

कोड काम कर रहा है, लेकिन सू अच्छा नहीं। जब मैं नीचे स्क्रॉल करने का प्रयास कर रहा हूं, तो सूची दृश्य सूची में गीतों को दोहराता रहता है।

मैं कुछ वैकल्पिक कोड की तलाश कर दिया गया है, लेकिन मैं किसी भी नहीं मिला है।

किसी भी मदद के लिए धन्यवाद।

उत्तर

10

मैं पूरी तरह यकीन है कि वास्तव में क्या समस्या है आप का उल्लेख का कारण बनता है नहीं कर रहा हूँ, लेकिन इस कोड का प्रयास करें।

private MediaPlayer mMediaPlayer; 
private String[] mMusicList; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mMediaPlayer = new MediaPlayer(); 

    ListView mListView = (ListView) findViewById(R.id.listView1); 

    mMusicList = getMusic(); 

    ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(this, 
    android.R.layout.simple_list_item_1, mMusicList); 
    mListView.setAdapter(mAdapter); 

    mListView.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
    long arg3) { 
     try { 
     playSong(mMusicList[arg2]); 
     } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
     } catch (IllegalStateException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
    } 
    }); 
} 

private String[] getMusic() { 
    final Cursor mCursor = managedQuery(
    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
    new String[] { MediaStore.Audio.Media.DISPLAY_NAME }, null, null, 
    "LOWER(" + MediaStore.Audio.Media.TITLE + ") ASC"); 

    int count = mCursor.getCount(); 

    String[] songs = new String[count]; 
    int i = 0; 
    if (mCursor.moveToFirst()) { 
    do { 
     songs[i] = mCursor.getString(0); 
     i++; 
    } while (mCursor.moveToNext()); 
    } 

    mCursor.close(); 

    return songs; 
} 

private void playSong(String path) throws IllegalArgumentException, 
IllegalStateException, IOException { 
    String extStorageDirectory = Environment.getExternalStorageDirectory() 
    .toString(); 

    path = extStorageDirectory + File.separator + path; 

    mMediaPlayer.reset(); 
    mMediaPlayer.setDataSource(path); 
    mMediaPlayer.prepare(); 
    mMediaPlayer.start(); 
} 
+4

यह कारण बनता है IOException: तैयार विफल रहा है। स्थिति mmediaPlayer.prepare() पर स्थिति = 0x1; –

+0

IOException को विफल स्थिति = 0x1 तैयार करना !!! –

-1

कोड वहाँ सुपर त्रुटिपूर्ण है।

getView कोई मतलब नहीं है। वह जीसी() क्या कर रहा है ?! सभी moveToPosition() कॉल के साथ क्या है।

यहाँ कोड फिर से लिखा

 public View getView(int position, View convertView, ViewGroup parent) { 
       TextView tv = null; 
       String id = null; 
       if (convertView == null) { 
        tv = new TextView(getApplicationContext()); 
       } else 
        tv = (TextView) convertView; 

       music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME); 
       id = musiccursor.getString(music_column_index); 
       music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE); 
       id += " Size(KB): " + musiccursor.getString(music_column_index); 

       tv.setText(id); 
       return tv; 
     } 
+1

"कोड वहां" का अर्थ है @ nikos-leonov? – Gabor

+0

हां, कोड @Nikos Leonov द्वारा कोड को संदर्भित करता है। उन्होंने अपना जवाब बराबर खदान में अपडेट कर दिया है, इसलिए यह ठीक है: डी –

-1

इस कोड

public View getView(int position, View convertView, ViewGroup parent) { 
System.gc(); 
String id = null; 
TextView tv; 
if (convertView == null) { 
tv = new TextView(mContext.getApplicationContext()); 
} else{ 
tv = (TextView) convertView; 
} 
musiccursor.moveToPosition(position); 
music_column_index = musiccursor 
.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME); 
id = musiccursor.getString(music_column_index); 
music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE); 
id += " Size(KB):" + musiccursor.getString(music_column_index); 
tv.setText(id); 
return tv; 
} 
11

एंड्रियास जवाब की कोशिश है यह करने के लिए सही तरीका है, लेकिन यह कोड पूर्ण फ़ाइल पथ नहीं मिलता है। फेंकने के लिए mMediaPlayer.prepare(); का कारण बनता है।

यहाँ फ़ाइल नाम के साथ फ़ाइल पथ प्राप्त करने के लिए कोड है: अब जब हम निरपेक्ष पथ है

private String[] mAudioPath; 
private MediaPlayer mMediaPlayer; 
private String[] mMusicList; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mMediaPlayer = new MediaPlayer(); 

    ListView mListView = (ListView) findViewById(R.id.listView1); 

    mMusicList = getAudioList(); 

    ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(this, 
    android.R.layout.simple_list_item_1, mMusicList); 
    mListView.setAdapter(mAdapter); 

    mListView.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
    long arg3) { 
    try { 
     playSong(mAudioPath[arg2]); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 
    }); 
} 

private String[] getAudioList() { 
    final Cursor mCursor = getContentResolver().query(
      MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
      new String[] { MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.DATA }, null, null, 
      "LOWER(" + MediaStore.Audio.Media.TITLE + ") ASC"); 

    int count = mCursor.getCount(); 

    String[] songs = new String[count]; 
    String[] mAudioPath = new String[count]; 
    int i = 0; 
    if (mCursor.moveToFirst()) { 
     do { 
      songs[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)); 
      mAudioPath[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); 
      i++; 
     } while (mCursor.moveToNext()); 
    } 

    mCursor.close(); 

    return songs; 
} 

, हम पथ फिर से प्राप्त करने की आवश्यकता नहीं है। तो: सूचीदृश्य OnItemClickListener में

playSong(mMusicList[arg2]); 

:

private void playSong(String path) throws IllegalArgumentException, 
    IllegalStateException, IOException { 

    Log.d("ringtone", "playSong :: " + path); 

    mMediaPlayer.reset(); 
    mMediaPlayer.setDataSource(path);  
//mMediaPlayer.setLooping(true); 
    mMediaPlayer.prepare(); 
    mMediaPlayer.start(); 
} 

उपयोग करना सुनिश्चित करें:

playSong(mAudioPath[arg2]); 

बजाय।

केवल ट्रैक (विस्तार के साथ पूरे फ़ाइल नाम से लग रहा है और अधिक सुरुचिपूर्ण) का खिताब प्राप्त करने के लिए उपयोग करें:

`MediaStore.Audio.Media.TITLE` 

के बजाय:

`MediaStore.Audio.Media.DISPLAY_NAME` 
+0

आप getAudioList() – Leo

+1

पर कॉल नहीं करते हैं मैंने एक संपादन किया है। धन्यवाद! :) –

+0

कुछ अवधि से कम फ़ाइल की सूची कैसे प्राप्त करें? –