2016-11-12 109 views
0

我在的Android開發初學者,我正在開發一個音樂應用程序我質疑所有SD卡音樂列表中,但我無法通過播放所選歌曲其名稱或ID。我列出了它在listView,並通過點擊所選項目顯示它的名稱,我選擇了哪首歌曲,但沒有使用mediaplayer類播放它。請幫我解決它。無法播放音樂的Android

這是從SD卡獲取歌曲的列表第一個Java文件

公共類MusicAppList延伸活動{

TextView tv; 
ContentResolver cr; 
Cursor cs; 
Uri uri; 
ListView lv; 
String tname,csong; 

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_music_app_list); 

     lv=(ListView)findViewById(R.id.songslist); 
     Songs(); 

} 
public void Songs(){ 

    cr=getContentResolver(); 
    uri=android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    cs=cr.query(uri,null,null, null,"title ASC"); 

    final ArrayList<String> list=new ArrayList<String>(); 
    while(cs.moveToNext()){ 
     list.add(cs.getString(cs.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE))); 
    } 
    ArrayAdapter<String> adapter=new ArrayAdapter<String>(getApplicationContext(),R.layout.mlistinterface,list); 
    lv.setAdapter(adapter); 

    lv.setOnItemClickListener(new OnItemClickListener(){ 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

     csong=(String)parent.getItemAtPosition(position); 
     Intent i1=new Intent(getApplicationContext(),MusicPlaying.class); 
     Bundle b=new Bundle(); 
     b.putInt("pos", position); 
     b.putString("song", csong); 
     b.putStringArrayList("songlist", list); 
     i1.putExtras(b); 
     startActivity(i1); 
     } 
    }); }} 

2.下面是第二的Java文件我正在嘗試播放歌曲。

公共類MusicPlaying延伸活動{

TextView tv; 
ImageView pre,nxt,play; 
ArrayList<String>songList; 
String name; 
private MediaPlayer mp; 
String song; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_music_playing); 

    tv=(TextView)findViewById(R.id.songname); 
    pre=(ImageView)findViewById(R.id.previous); 
    nxt=(ImageView)findViewById(R.id.next); 
    play=(ImageView)findViewById(R.id.play); 

    tv.setSelected(true); 

    Bundle bb=getIntent().getExtras(); 
    name=bb.getString("song"); 
    tv.setText(String.valueOf(name)); 
    songList=(ArrayList)bb.getStringArrayList("songlist") ; 
    int pos=bb.getInt("pos"); 
    mp=new MediaPlayer(); 
    Uri u=Uri.parse(songList.get(pos)); 

    try{ 
     mp.setDataSource(getApplicationContext(), u); 
     mp.prepareAsync(); 
     mp.start(); 

    } 
    catch(Exception e){ 
     Log.e("ErrorPlaying", "Unable to get Reference of the song"); 
    } 
}} 

3. logcat的錯誤是: -

11-15 15:57:13.503:E/AndroidRuntime(996):致命異常:主要 11-15 15:57:13.503:E/AndroidRuntime(996):進程:com.example.musicapp,PID:996

11-15 15:57:13.503:E/AndroidRuntime(996):java .lang.RuntimeException:無法啓動活動ComponentInfo {com.example.musicapp/com.example.musicapp.MusicPlaying}:java.lang.NullPointerException:試圖在空對象引用 11-15 15: 57:13.503:E/AndroidRuntime(996):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2455) 11-15 15:57:13.503:E/AndroidRuntime(996):at android.app.ActivityThread。 handleLaunchActivity(ActivityThread.java:2517) 11-15 15:57:13.503:E/AndroidRuntime(996):at android.app.ActivityThread.access $ 800(ActivityThread.java:162) 11-15 15:57:13.503 :E/AndroidRuntime(996):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1412) 11-15 15:57:13.503:E/AndroidRuntime(996):at android.os.Handler.dispatchMessage (Handler.java:106) 11-15 15:57:13.503:E/AndroidRuntime(996):at android.os.Looper.loop(Looper.java:189) 11-15 15:57:13.503:E/AndroidRuntime(996):at android.app.ActivityThread.main(ActivityThread.java:5529) 11-15 15:57:13.503:E/AndroidRuntime(996):at java.lang.reflect.Method.invoke(Native Method) 11-15 15:57:13.503:E/AndroidRuntime(996):at java.lang.reflect .Method.invoke(Method.java:372) 11-15 15:57:13.503:E/AndroidRuntime(996):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:950) 11-15 15:57:13.503:E/AndroidRuntime(996):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745) 11-15 15:57:13.503:E/AndroidRuntime(996 ):引起:java.lang.NullPointerException:嘗試調用空對象引用虛擬方法'void android.media.MediaPlayer.prepareAsync()' 11-15 15:57:13.50 3:E/AndroidRuntime(996):在com.example.musicapp.MusicPlaying.onCreate(MusicPlaying.java:60) 11-15 15:57:13.503:E/AndroidRuntime(996):at android.app.Activity。 performCreate(Activity.java:5966) 11-15 15:57:13.503:E/AndroidRuntime(996):at android.app。Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 11-15 15:57:13.503:E/AndroidRuntime(996):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2408)

+1

把一些代碼放在treid –

+1

您可以將問題中的代碼格式化爲文本,以便人們可以複製/粘貼來測試並幫助您。請考慮編輯您的問題並將代碼插入爲文本(並格式化)。 – Tom

+0

除非: 1)你會從MusicPlaying onCreate發佈一些代碼:你確定Intent數據被正確檢索嗎? 2)你也應該發佈一些logcat:你有什麼異常? 3)更好地複製和粘貼你的代碼,而不是截圖,因爲湯姆已經指出 – c0rtexx

回答

0


我的建議將查看您的 ApplicationManifest.xml並檢查以確保您具有從外部SD卡寫入/讀取的必要權限。

典型的外置SD卡的權限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 


很顯然,如果運行Marshallow或更高,你必須從中可以是一個痛苦的用戶請求許可。

+0

謝謝你給我你的時間。我已經在其中包含了該代碼。我已經更新了包括java文件的問題,請在代碼中幫助我。 –