android音乐播放器

android音乐播放器

    学习了handler和ListView后,我做了一个音乐播放器。

    

    音乐播放器有两个界面activity,主界面是音乐文件列表,进入主界面后自动获取系统拥有的音乐mp3文件,然后把mp3的数据信息整理好,用一个ListView呈现给用户。

    可以获取mp3的歌名、作者名与系统文件路径。

    随机点击一个音乐文件进入了第二个页面:播放页面,播放页面有3个按钮,分别是:上一首歌、下一首歌与播放暂停,还有一个进度条SeekBar:调控歌曲播放进度。

    

主界面XML代码:

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:gravity="center"
        android:id="@+id/title"
        android:text="音乐播放器" />
    <ListView
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:layout_below="@id/title"
	android:id="@+id/list"
		/>

ListView里面每一个item的XML:

    <TextView
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:id="@+id/author"
		/>
    <TextView
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:id="@+id/title"
	    android:textSize="25sp"
	    android:layout_below="@id/author"
		/>
    <ImageView
    	    android:layout_width="wrap_content"
    	    android:layout_height="wrap_content"
    	    android:id="@+id/image"
    	    android:layout_alignParentRight="true"
    	    />

播放页面XML代码:

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="上一首"
        android:id="@+id/presong"
        android:onClick="onClick"
    	/>
    <Button	
    	android:layout_width="match_parent"
    	android:layout_height="wrap_content"
    	android:text="暂停"
    	android:id="@+id/control"
    	android:onClick="onClick"
    	/>
	
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="下一首"
        android:id="@+id/nextsong"
        android:onClick="onClick"
    	/>
    <SeekBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/seekbar"
        android:max="100"
    	/>


主页面activity的onCreate()方法初始化对象,获取XML页面组建的id,设置监听:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview_music);
        
        urlmap = new HashMap<String,String>();
        
        listView = (ListView) findViewById(R.id.list);
        String[] keys = {"author","title","image"};
        int[] ids = {R.id.author,R.id.title,R.id.image};
        
        SimpleAdapter adapter = new SimpleAdapter(this, getInfo(), R.layout.item, keys, ids);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(click_listener);
        
    }


SimpleAdapter适配器用于适配ListView,自定义getInfo()方法,获取系统的所有mp3文件,把标题、作者与路径等存放进List里面,然后在ListView展现出来,每一个mp3文件用一个item表示:

public List<Map<String,Object>> getInfo(){
    	list = new ArrayList<Map<String,Object>>();
    	musicCursor = this.getContentResolver().query(
         		MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
         		null,
         		null,
         		null,
         		MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
    	while(musicCursor.moveToNext()){
          	String title = musicCursor.getString(musicCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
          	String author = musicCursor.getString(musicCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
          	String url = musicCursor.getString(musicCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); 
          	
          	Map<String,Object> map = new HashMap<String,Object>();
          	map.put("author", author);
          	map.put("title", title);
          	map.put("image", R.drawable.ic_launcher);
          	urlmap.put(title, url);
          	list.add(map);
        }
		return list;
    }

创建一个ListView的item监听器,监听item,当ListView里面的任意一个mp3文件被点击,立即进入播放界面,并且开始播放:

OnItemClickListener click_listener = new OnItemClickListener(){
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			post = position;
			if(flag){
				mp.reset();
			}
			flag = true;
			mp = new MediaPlayer();
			String title = ((TextView)view.findViewById(R.id.title)).getText().toString();
			String url = urlmap.get(title);
			try {
				mp.setDataSource(url);
				mp.prepare();
				mp.start();
				Intent intent = new Intent(MainActivity.this,Play_page.class);
				startActivity(intent);
			} catch (Exception e) {
				e.printStackTrace();
			} 
		}
    };

进入了播放页面activity,onCreate()方法一样是初始化对象,获取SeekBar的id,然后设置与音乐事件一样大小的SeekBar长度,最后设置监听:

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.play_page);
		
		sb = (SeekBar)findViewById(R.id.seekbar);
		endtime = mp.getDuration();
		sb.setMax(endtime);
		
		sb.setOnSeekBarChangeListener(ocl);
	}

在onStart()方法里面控制handler,用于调节进度条,使进度条跟随mp3播放进度改变而改变,然后创建一个SeekBar监听,监听进度条的改变,改变之后,歌曲的播放进度也随之改变:

<span style="white-space:pre">	</span>protected void onStart() {
		super.onStart();
		handler.post(new Runnable(){
			public void run() {
				sb.setProgress(mp.getCurrentPosition());
				handler.postDelayed(this, 1000);
			}
		});
	};
	OnSeekBarChangeListener ocl = new OnSeekBarChangeListener() {
		public void onStopTrackingTouch(SeekBar arg0) {}
		public void onStartTrackingTouch(SeekBar arg0) {}
		public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
			mp.seekTo(sb.getProgress());
		}
	};

最后就是实现上一曲、下一曲与暂停播放按钮了,在主界面监听ListView里面可以获得当前播放mp的位置排序position,然后记录下来,在上一曲与下一曲就可以通过position来改变当前的位置,暂停播放就是pause()与start()两个方法:

<span style="white-space:pre">	</span>public void onClick(View v) {
		int id = v.getId();
		switch(id){
		case R.id.control:
			Button bt = (Button) findViewById(R.id.control);
			if( bt.getText().toString().equals("暂停") ){
				bt.setText("播放");
				mp.pause();
			}else{
				bt.setText("暂停");
				mp.start();
			}
			break;
		case R.id.presong:
			post --;
			if(post < 0){
				post = list.size()-1;
			}
			HashMap<String,Object> map = (HashMap<String, Object>) list.get(post);
			String title = (String) map.get("title");
			String url = urlmap.get(title);
			mp.release();
			mp = new MediaPlayer();
			try{
				mp.setDataSource(url);
				mp.prepare();
				mp.start();
			}catch(Exception e){
				e.printStackTrace();
			}
			break;
		case R.id.nextsong:
			post ++;
			post = post%list.size();
			HashMap<String,Object> nextsongmap = (HashMap<String, Object>) list.get(post);
			String nextsongtitle = (String) nextsongmap.get("title");
			String nextsongurl = urlmap.get(nextsongtitle);
			mp.release();
			mp = new MediaPlayer();
			try{
				mp.setDataSource(nextsongurl);
				mp.prepare();
				mp.start();
			}catch(Exception e){
				e.printStackTrace();
			}
			break;
		}
	}

音乐播放器效果如下:






  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值