2016-11-12 108 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文件的问题,请在代码中帮助我。 –