Android实际音乐播放的代码
2016-03-15 18:31
483 查看
//为了防止出现4.4版本前后的差别:利用各种手段,严格处理:在各自的状态做各自应该做的方法。防止底层报error
//还要做上来电监听:停止播放的操作
//还包含上一首 下一首的播放
//是在activity中实现的
//还要做上来电监听:停止播放的操作
//还包含上一首 下一首的播放
//是在activity中实现的
/** * Created by jiangxiangfei on 2015/12/21. */ public class PlayActivity extends BaseActivity implements MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener { private MediaPlayer player; private boolean ispause=false; private int progress; private Timer timer; //需要控件 private TextView tv_progress; private TextView tv_max; private SeekBar seek; private ImageView music_paly_orpause; private TextView tv_marquee; private ImageView iv_play_center_photo; private RoundedImageView iv_teacher_head; private TextView tv_teacher_name; private TextView tv_class_category; private TextView tv_class_title; private ImageView play_loading_iv; private RotateAnimation rotateAnimation; private TextView paly_grade_tv; private TextView paly_islike_tv; private LinearLayout play_isor_like_group; private CheckBox play_checkbox; //上页传参 private String title; private String categoryName; private String pictureUrlSmall; private int initCurrentposition; private String url; private double score; private int thumbsCount; private int isThumbs; private int teacherId; private int itemposition; private String portraitUrlSmall; private String nickname; private ArrayList<MusicLesson> lessons; private TelephonyManager manager; private MyListener listener; //标记是否是空闲状态 private boolean isCallIdle=true; //广播 private BroadcastReceiver myNetReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)){ ConnectivityManager mConnectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = mConnectivity.getActiveNetworkInfo(); if (info == null || !mConnectivity.getBackgroundDataSetting()) { Log.e("jxf", "没网"); DefinedSingleToast.showToast(PlayActivity.this,getResources().getString(R.string.network_no_force)); } } } }; Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { Bundle bundle = msg.getData(); int duration = bundle.getInt("duration"); int currentPosition = bundle.getInt("currentPosition"); progress=currentPosition; seek.setMax(duration); tv_max.setText(trans(duration)); seek.setProgress(progress); tv_progress.setText(trans(progress)); } }; private String trans(int haomiao){ int miaoZong=haomiao/1000; int miao=miaoZong%60; String miaoString = null; if (miao<10){ miaoString="0"+miao; } else{ miaoString=""+miao; } int fen=(miaoZong-miao)/60; String fenString = null; if (fen<10){ fenString="0"+fen; } else { fenString=""+fen; } return fenString+":"+miaoString; } @Override protected void initView() { IntentFilter mFilter = new IntentFilter(); mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(myNetReceiver, mFilter); Bundle bundle = getIntent().getExtras(); portraitUrlSmall=bundle.getString("portraitUrlSmall"); nickname=bundle.getString("nickname"); itemposition=bundle.getInt("itemposition"); score=bundle.getDouble("score"); thumbsCount=bundle.getInt("thumbsCount"); isThumbs=bundle.getInt("isThumbs"); teacherId=bundle.getInt("teacherId"); lessons= (ArrayList<MusicLesson>) getIntent().getSerializableExtra("list"); title=lessons.get(itemposition).title; categoryName=lessons.get(itemposition).categoryName; pictureUrlSmall=lessons.get(itemposition).pictureUrlSmall; url=lessons.get(itemposition).url; initCurrentposition=lessons.get(itemposition).currentposition; progress=initCurrentposition; //评分 paly_grade_tv= (TextView) findViewById(R.id.paly_grade_tv); paly_grade_tv.setText(""+score); //点赞数 paly_islike_tv= (TextView) findViewById(R.id.paly_islike_tv); paly_islike_tv.setText(""+thumbsCount); //点赞的容器 play_isor_like_group= (LinearLayout) findViewById(R.id.play_isor_like_group); //点赞的checkbox play_checkbox= (CheckBox) findViewById(R.id.play_checkbox); //0表示可以点赞 if (isThumbs==0){ play_isor_like_group.setEnabled(true); play_checkbox.setChecked(false); } else{ play_isor_like_group.setEnabled(false); play_checkbox.setChecked(true); } play_isor_like_group.setOnClickListener(this); RelativeLayout pre= (RelativeLayout) findViewById(R.id.pre); pre.setOnClickListener(this); RelativeLayout next= (RelativeLayout) findViewById(R.id.next); next.setOnClickListener(this); ImageView iv_goback= (ImageView) findViewById(R.id.iv_goback); iv_goback.setOnClickListener(this); play_loading_iv= (ImageView) findViewById(R.id.play_loading_iv); rotateAnimation = (RotateAnimation) AnimationUtils.loadAnimation(this, R.anim.rotate_refresh_drawable_default); play_loading_iv.setAnimation(rotateAnimation); play_loading_iv.setVisibility(View.VISIBLE); tv_marquee= (TextView) findViewById(R.id.tv_marquee); iv_play_center_photo= (ImageView) findViewById(R.id.iv_play_center_photo); music_paly_orpause= (ImageView) findViewById(R.id.music_paly_orpause); tv_progress= (TextView) findViewById(R.id.tv_progress); tv_max= (TextView) findViewById(R.id.tv_max); seek= (SeekBar) findViewById(R.id.seek); iv_teacher_head= (RoundedImageView) findViewById(R.id.iv_teacher_head); ImageLoader.getInstance().displayImage(portraitUrlSmall, iv_teacher_head, ImageLoaderOptions.headOptions); tv_teacher_name= (TextView) findViewById(R.id.tv_teacher_name); tv_teacher_name.setText(nickname); tv_class_category= (TextView) findViewById(R.id.tv_class_category); tv_class_title= (TextView) findViewById(R.id.tv_class_title); tv_marquee.setText(title); ImageLoader.getInstance().displayImage(pictureUrlSmall, iv_play_center_photo, ImageLoaderOptions.playRoundOption); tv_class_category.setText(categoryName); tv_class_title.setText(getResources().getString(R.string.play_front_content) + title); seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { progress = seekBar.getProgress(); Log.e("jxf", "seekbar进度改变:拖拽播放:进度到" + progress); seekToplay(progress); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); music_paly_orpause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (ispause) { continuePlay(); } else { pause(); } } }); player=new MediaPlayer(); player.setOnCompletionListener(this); player.setOnErrorListener(this); player.setAudioStreamType(AudioManager.STREAM_MUSIC); //获取电话管理器 manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); listener=new MyListener(); //设置侦听监控电话状态 manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); play(); } private void play() { player.reset(); try { player.setDataSource(url); player.prepareAsync(); player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { //异步准备完毕,此方法调用 @Override public void onPrepared(MediaPlayer mp) { Log.e("jxf", "准备完毕"); player.start(); addTimer(); if(progress!=0){ Log.e("jxf","progress不为0开始播放"+progress); seekToplay(progress); } play_loading_iv.clearAnimation(); play_loading_iv.setVisibility(View.GONE); } }); } catch (Exception e) { e.printStackTrace(); Log.e("jxf","play异常扑捉"+e.toString()); } } private void pause() { //此位置是为电话监听准备的判断 if (player != null && player.isPlaying()) { Log.e("jxf","pause:对象不为空;并且正在播放"); player.pause(); ispause = true; music_paly_orpause.setImageResource(R.drawable.content_video_suspend); }else{ Log.e("jxf","暂停走else"); } } private void continuePlay() { if (player != null && (!player.isPlaying())) { Log.e("jxf","continuePlay:对象不为空;并且已经暂停"); player.start(); ispause = false; music_paly_orpause.setImageResource(R.drawable.content_video_suspend_display); }else{ Log.e("jxf","continue走else"); } } private void callPause(){ if (player==null){ Log.e("jxf", "pause:对象为空"); }else{ Log.e("jxf","pause:对象不为空"); player.pause(); } } private void callContinue(){ //此位置是为电话监听准备的判断 if (player==null){ Log.e("jxf","continuePlay:对象为空"); }else{ Log.e("jxf","continuePlay:对象不为空"); player.start(); } } private void seekToplay(int progress) { Log.e("jxf","改变进度"); player.seekTo(progress); } private void addTimer() { if(timer == null){ timer = new Timer(); timer.schedule(new TimerTask() { //此方法在子线程执行 @Override public void run() { int duration = player.getDuration(); int currentPosition = player.getCurrentPosition(); Message msg = handler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putInt("duration", duration); bundle.putInt("currentPosition", currentPosition); msg.setData(bundle); handler.sendMessage(msg); } }, 5, 500); } } @Override protected void onDestroy() { super.onDestroy(); if(timer != null){ timer.cancel(); timer = null; } player.stop(); player.release(); player = null; if(myNetReceiver!=null){ unregisterReceiver(myNetReceiver); } manager.listen(listener, PhoneStateListener.LISTEN_NONE); if (manager!=null){ manager=null; } if (listener!=null){ listener=null; } handler.removeCallbacksAndMessages(null); DefinedSingleToast.cancleToast(); System.gc(); Log.e("jxf", "play释放"); } @Override public void setContentLayout() { setContentView(R.layout.activity_paly); } @Override protected void onClickEvent(View view) { switch (view.getId()){ case R.id.iv_goback: Intent intent=new Intent(); intent.putExtra("progress",progress); intent.putExtra("itemposition",itemposition); this.setResult(510,intent); PlayActivity.this.finish(); overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out); break; case R.id.pre: if (itemposition==0){ DefinedSingleToast.showToast(this,"到头啦~"); }else{ play_loading_iv.setAnimation(rotateAnimation); play_loading_iv.setVisibility(View.VISIBLE); itemposition=itemposition-1; progress=0; ispause=false; music_paly_orpause.setImageResource(R.drawable.content_video_suspend_display); refresh(); } break; case R.id.next: if (itemposition==(lessons.size()-1)){ DefinedSingleToast.showToast(this,"到底啦~"); }else{ play_loading_iv.setAnimation(rotateAnimation); play_loading_iv.setVisibility(View.VISIBLE); itemposition=itemposition+1; progress=0; ispause=false; music_paly_orpause.setImageResource(R.drawable.content_video_suspend_display); refresh(); } break; } } //标记:切换上一首 下一首的时候 是不用更改点赞的 private void refresh(){ player.stop(); title=lessons.get(itemposition).title; categoryName=lessons.get(itemposition).categoryName; pictureUrlSmall=lessons.get(itemposition).pictureUrlSmall; url=lessons.get(itemposition).url; tv_marquee.setText(title); ImageLoader.getInstance().displayImage(pictureUrlSmall, iv_play_center_photo, ImageLoaderOptions.playOption); tv_class_category.setText(categoryName); tv_class_title.setText(getResources().getString(R.string.play_front_content) + title); tv_max.setText(""); tv_progress.setText(""); if(timer != null){ Log.e("jxf","计时器移除"); timer.cancel(); timer = null; } Log.e("jxf","调用play"); play(); } @Override public void onBackPressed() { //super.onBackPressed(); Intent intent=new Intent(); intent.putExtra("progress",progress); intent.putExtra("itemposition",itemposition); this.setResult(510, intent); PlayActivity.this.finish(); overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out); } //添加boolean值做为判断:完成状态的进入:只有播放着进入才能出发监听:如果是暂停 拖拽进入 不会进入完成状态 @Override public void onCompletion(MediaPlayer mp) { //一首播放完毕 自动下一首 if (itemposition==(lessons.size()-1)){ player.pause(); ispause=true; music_paly_orpause.setImageResource(R.drawable.content_video_suspend); }else{ play_loading_iv.setAnimation(rotateAnimation); play_loading_iv.setVisibility(View.VISIBLE); itemposition=itemposition+1; progress=0; refresh(); } } @Override public boolean onError(MediaPlayer mp, int what, int extra) { Log.e("jxf","onErrorListener扑捉到:::what="+what+"...extra="+extra); switch (what) { case MediaPlayer.MEDIA_INFO_UNKNOWN: DefinedSingleToast.showToast(this,"MEDIA_INFO_UNKNOWN"); break; case MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING: DefinedSingleToast.showToast(this,"MEDIA_INFO_BAD_INTERLEAVING"); break; case MediaPlayer.MEDIA_INFO_METADATA_UPDATE: DefinedSingleToast.showToast(this,"MEDIA_INFO_METADATA_UPDATE"); break; case MediaPlayer.MEDIA_INFO_NOT_SEEKABLE: DefinedSingleToast.showToast(this,"MEDIA_INFO_NOT_SEEKABLE"); break; case MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING: DefinedSingleToast.showToast(this,"MEDIA_INFO_VIDEO_TRACK_LAGGING"); break; } return false; } //监控电话状态 空闲:平时 。 响铃 。摘机:接电话;挂了不接电话:进入空闲:使用服务:进入后台:启动服务 class MyListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); switch (state) { case TelephonyManager.CALL_STATE_IDLE: Log.e("jxf","空闲"); //如果已进入就是空闲:响铃和摘机都不是空闲状态 //接到电话后改变了 if (!isCallIdle){ if (ispause){ Log.e("jxf","来电返回::::之前就是暂停状态,不做任何处理"); } else { Log.e("jxf","来电返回::::之前就是播放状态,做处理"); callContinue(); } } isCallIdle=true; break; case TelephonyManager.CALL_STATE_RINGING: Log.e("jxf", "响铃"); isCallIdle=false; // ispause = true; if (ispause){ }else { callPause(); } // music_paly_orpause.setImageResource(R.drawable.content_video_suspend); break; // case TelephonyManager.CALL_STATE_OFFHOOK: // Log.e("jxf", "摘机"); // isCallIdle=false; // ispause = true; // pause(); // music_paly_orpause.setImageResource(R.drawable.content_video_suspend); // break; } } } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories