关于使用setcompletionlistener实现自动播放下一曲,新人菜鸟,求大牛解答
package com.android.onemusic;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
public class MusicActivity extends BaseActivity {
private Button btnSd;
@Override
public int initResource() {
// TODO Auto-generated method stub
return R.layout.activity_exit;
}
@Override
public void initComponent() {
// TODO Auto-generated method stub
btnSd = (Button) findViewById(R.id.btn_exit);
}
@Override
public void initData() {
// TODO Auto-generated method stub
}
@Override
public void addListener() {
// TODO Auto-generated method stub
btnSd.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MusicActivity.this,ExitApplication.class);
startActivity(intent);
}
});
}
List<HashMap<String, String>> list; // 歌曲信息的集合
ListView listview;
ImageView play,next,last;
SeekBar seek; //声明进度条组件
TextView antiontime,totaltime; //音乐播放时间和总时间
MediaPlayer mediaPalyer=null; //初始化媒体播放组件
boolean playSwitch=false; //判断是否处于播放
int currentPosition; //音乐当前位置
MusicBroadcastReceiver musicBroadcastReceiver;//广播接收者
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.music);
initview();
if (MusicActivity.this!= null){
// 从媒体库中读取音频信息并存入游标.android会在SD卡自动更新的时候将文件数据写入SQLit库,这些工作android早就替我们写好了
Cursor cursor = MusicActivity.this.getContentResolver().query( //查询媒体数据
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null,
null, null);
// MediaStore这个类是android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取。
// 这个MediaStore包括了多媒体数据库的所有信息,包括音频,视频和图像,android把所有的多媒体数据库接口进行了封装,
// 所有的数据库不用自己进行创建,直接调用利用ContentResolver去调用那些封装好的接口就可以进行数据库的操作了。
// 今天我就介绍一些这些接口的用法。 首先,要得到一个ContentResolver实例,ContentResolver可以这样获取,
// 利用一个Activity或者Service的Context即可。如下所示:
// ContentResolver mResolver = context.getContentResolver();
// ContentResolver对象负责获取ContentProvider提供的数据
// Cursor cursor = resolver.query(_uri, prjs, selections,
// selectArgs, order);
// ContentResolver的query方法接受几个参数,参数意义如下:
// Uri:这个Uri代表要查询的数据库名称加上表的名称。这个Uri一般都直接从MediaStore里取得,例如我要取所有歌的信息,就必须利用MediaStore.Audio.Media.
// EXTERNAL_CONTENT_URI这个Uri。专辑信息要利用MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI这个Uri来查询,其他查询也都类似。
// Prjs:这个参数代表要从表中选择的列,用一个String数组来表示。
// Selections:相当于SQL语句中的where子句,就是代表你的查询条件。
// selectArgs:这个参数是说你的Selections里有?这个符号是,这里可以以实际值代替这个问号。如果Selections这个没有?的话,那么这个String数组可以为null。
// Order:说明查询结果按什么来排序。
// 访问sdcard中的音频文件的URI为MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
if (cursor!=null){
// 轮循的游标并把音频信息加载到集合变量list中
while (cursor.moveToNext()) { //Cursor必须调用cursor.moveToNext()方法才能开始取数据,需要使用while循环
HashMap<String,String> haxi =new HashMap<String,String>();
haxi.put("music",cursor.getString(
cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)));
//getColumnIndexOrThrow(String columnName),从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
//MediaStore.Audio.Media.DISPLAY_NAME表示的是歌曲文件的名称
haxi.put("musicpath",cursor.getString(
cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)));
//MediaStore.Audio.Media.DATA表示的是歌曲文件的全路径
list.add(haxi); }
}
}
MusicAdapter musicAdapter=new MusicAdapter(list,MusicActivity.this,R.layout.music_item);
listview=(ListView)findViewById(R.id.music_listView);
listview.setAdapter(musicAdapter);
//开启播放器服务
startService(new Intent(MusicActivity.this,MusicServer.class));
listview.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String music_path=list.get(position).get("musicpath");
Intent start_intent=new Intent();
start_intent.setAction("receiver_music");
start_intent.putExtra("musicpath",music_path);
sendBroadcast(start_intent);
play.setImageResource(android.R.drawable.ic_media_pause);
playSwitch=true;
currentPosition=position;
} });
play.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(playSwitch){
//点击前是播放状态playSwitch是true,表明是播放状态。点击后变成暂停状态,点击后playSwitch是false
play.setImageResource(android.R.drawable.ic_media_play);
Intent intent=new Intent();
intent.setAction("pause_music");
sendBroadcast(intent);
playSwitch=false; }else{
play.setImageResource(android.R.drawable.ic_media_pause);
Intent intent=new Intent();
intent.setAction("continue_music");
sendBroadcast(intent);
playSwitch=true;} }});
next.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(currentPosition+1<list.size()){
String music_path=list.get(currentPosition+1).get("musicpath");
Intent intent=new Intent();
intent.setAction("receiver_music");
intent.putExtra("musicpath",music_path);
sendBroadcast(intent);
play.setImageResource(android.R.drawable.ic_media_pause);
playSwitch=true;
currentPosition+=1;
} } });
last.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(currentPosition-1>=0){
String music_path=list.get(currentPosition-1).get("musicpath");
Intent intent=new Intent();
intent.setAction("receiver_music");
intent.putExtra("musicpath",music_path);
sendBroadcast(intent);
play.setImageResource(android.R.drawable.ic_media_pause);
playSwitch=true;
currentPosition-=1;
} } });
seek.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progress=seekBar.getProgress(); //获取到拖动后的进度
Intent intent=new Intent();
intent.setAction("seekbar");
intent.putExtra("progress", progress);
sendBroadcast(intent);
} //停止拖动时调用
@Override
public void onStartTrackingTouch(SeekBar seekBar) { } //开始拖动时调用
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) { }// 拖动过过程中调用
});
//进度条通过广播接收函数更改进度条外观
IntentFilter intentFilter=new IntentFilter();
musicBroadcastReceiver=new MusicBroadcastReceiver();
intentFilter.addAction("currentProgress");
registerReceiver(musicBroadcastReceiver, intentFilter);
}
void setSeekbarProgress(int music_progress){
seek.setProgress(music_progress); }
//变量的初始化
private void initview(){
list=new ArrayList<HashMap<String,String>>();
play=(ImageView)findViewById(R.id.play);
last=(ImageView)findViewById(R.id.last);
next=(ImageView)findViewById(R.id.next);
seek=(SeekBar)findViewById(R.id.seek); }
class MusicBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent){
int music_progress=intent.getIntExtra("currentProgress",0);//默值为0
setSeekbarProgress(music_progress); //更改进度条
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true; }
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_exit:
Intent intent=new Intent(this,ExitApplication.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return true;
case R.id.action_about:
Toast.makeText(this, "一个音乐"
+ "1.0.0.0", Toast.LENGTH_SHORT).show();
return true;
case R.id.action_search:
Toast.makeText(this, "该功能暂未开放"
, Toast.LENGTH_SHORT).show();
return true;
case R.id.action_update:
Toast.makeText(this, "无可用更新"
, Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}