安卓播放器实现自动播放下一曲功能

baidu_19189497 2014-11-19 08:28:53
关于使用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);
}
}
}
...全文
4268 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
w18310624146 2015-09-11
  • 打赏
  • 举报
回复
不错!!值得学习!!
BeoPlayer Java v0.53 纯白版个性,简洁,时尚,的音乐播放器,给你从来没有过的音乐体验,让操作成为艺术!快快下载!-- 2008-8-03修正当鼠标拖动垂直滚动条时,鼠标离开窗口导致的错误行为-- 2008-7-16加入离线图片缓存-- 2008-7-15播放列表可以显示专辑图片自动在网络上搜索专辑图片-- 2008-7-13重写文件选择的数据模型,修正文件数量过多导致的视图速度下降加入‘纯白’版本!!-- 2008-7-12修正启动脚本,在有多个Jre时不能正确选择版本的问题-- 2008-7-6** 修正播放列表的动画效果 **加入对鼠标滚轮的支持修正列表为空时保存自动播放抛出的异常修正列表的消息响应-- 2008-7-5修正选择文件窗口的卡屏问题修正无法读取系统锁文件时抛出异常的问题修正退出的顺序问题加入了好看的Win32启动程序加入自动播放功能添加右键删除的功能(右键双击删除文件)把手柄的图表改为原先的样式修改手柄弹出的范围-- 2008-7-4修正文件不停播放时不自动切换到下一曲修正第一次选择播放时,不播放的问题修正注释的错别字:)重写了文件选择对话框(去掉原先丑陋的东东)** 严重,JWindow的事件似乎用问题InfoWindow暂时用JFrame实现-- 2008-7-3加入文件选择模块修正Info窗口的动画加入...很棒的动画效果,怎么说呢...修正列表为空时抛出的null异常修正列表为空时动画线程的死锁-- 2008-7-2修正音量控制模块 (终于可以不用java自带混频器了)必须在Line被open之后取得控制器!修改音量淡出的方法加入播放列表窗口,加入信息窗口-- 2008-7-1修正PM一处死锁添加音量动画加入解码器模块加入设置对话框...(记不住了)-- 2008-6-27启动

6,721

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 Google技术社区
社区管理员
  • Google技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧