package org.zywx.wbpalmstar.plugin.uexaudio; import org.zywx.wbpalmstar.base.BUtility; import org.zywx.wbpalmstar.base.ResoureFinder; import android.app.Activity; import android.app.AlertDialog; import android.app.Service; import android.content.DialogInterface; import android.content.Intent; import android.content.res.AssetFileDescriptor; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.provider.MediaStore; import android.view.Display; import android.view.KeyEvent; import android.view.View; import android.view.Window; import android.view.View.OnClickListener; import android.view.WindowManager; import android.widget.Button; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; public class PMusicPlayerActivity extends Activity implements OnCompletionListener { public static final String F_INTENT_DATA_KEY_AUDIOMGR_AUDIO_LIST = "audioList"; public final static String TAG="MUSIC"; public final static String F_SDKARD_PATH = "file:///sdcard/";//sd卡 public final static String F_RES_PATH = "file:///res/";//工程的assets文件夹下 public final static String F_DATA_PATH = "file:///data/"; public final static String F_HTTP_PATH = "http://";//网络地址 public final static String F_RES_ROOT_PATH = "file:///res/widget/";//工程的assets文件夹下widget文件夹 public final static String F_WGT_PATH = "wgt://";//工程的assets文件夹下widget文件夹 public final static String F_WGTS_PATH = "wgts://";//工程的assets文件夹下widget文件夹 public final static String F_ABSOLUTE_PATH = "/";//绝对路径 public final static String F_OPPOSITE_PATH = "";//相对路径 public final static String F_BASE_RES_PATH="res://";//工程res目录 public final static String F_BASE_PATH="BASE_PATH";//基本路径 private ImageView mImage_special_image=null;//音乐专辑图片 private Button mButton_return=null;//返回按钮 private Button mButton_list=null;//返回按钮 private TextView mText_music_name=null;//歌曲名称 private SeekBar mBar_music_progress=null;//歌曲进度条 private TextView mText_play_time=null;//歌曲当前时间 private TextView mText_total_time=null;//歌曲总体时间 private ImageButton mButton_last=null;//上一首歌曲按钮 private ImageButton mButton_play=null;//播放歌曲按钮 private ImageButton mButton_next=null;//下一首歌曲按钮 private SeekBar mBar_sound_progress=null;//声音大小波动 private String[] mString_path_array=null;//歌曲路径字符串数组 private MediaPlayer mMediaplayer=null; private Integer mInt_music_index=0;//歌曲路径序号 private AudioManager audioManager=null; //音频 private int mInt_cache_time=0;//时间缓存 private Integer mInt_total_time=0;//歌曲总共的播放时间 private int mInt_max_volume=0;//volume max private Message mMsg=null; private int mInt_screen_width;//屏幕宽度 private String mString_file_Path;//音乐文件路径 private ResoureFinder finder = ResoureFinder.getInstance(); private Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 100: mText_play_time.setText(getTime(msg.arg1)); break; case 88: if (mMediaplayer != null && mBar_music_progress != null) { if (mMediaplayer.isPlaying()) { int currentTime = mMediaplayer.getCurrentPosition();// get music current position if (currentTime != 0) { mText_play_time.setText(getTime(currentTime));//show current position int progress = (currentTime * 100 / mInt_total_time);// 计算当前音乐播放进度 if (mInt_cache_time != progress) mBar_music_progress.setProgress(progress);// 设置当前进度 mInt_cache_time = progress;// 将当前音乐进度缓存下来 } handler.sendEmptyMessageDelayed(88, 1000); } } break; default: break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature( Window.FEATURE_NO_TITLE ); setContentView(finder.getLayoutId(this, "plugin_audio_style")); WindowManager manager=getWindowManager(); Display display=manager.getDefaultDisplay(); mInt_screen_width=display.getWidth(); ButtonOnClickListener buttonListener=new ButtonOnClickListener(); SeekBarOnClickListener seekBarListener=new SeekBarOnClickListener(); mImage_special_image=(ImageView)findViewById(finder.getId(this, "music_special_image")); mButton_return=(Button)findViewById(finder.getId(this, "plugin_music_button_return")); mButton_return.setOnClickListener(buttonListener); mButton_list=(Button)findViewById(finder.getId(this, "plugin_music_button_list")); mButton_list.setOnClickListener(buttonListener); mText_music_name=(TextView)findViewById(finder.getId(this, "plugin_music_name")); mBar_music_progress=(SeekBar)findViewById(finder.getId(this, "widget_top_progress_seekBar")); mBar_music_progress.setOnSeekBarChangeListener(seekBarListener); mText_play_time=(TextView)findViewById(finder.getId(this, "widget_top_play_time")); mText_total_time=(TextView)findViewById(finder.getId(this, "widget_top_total_time")); mButton_last=(ImageButton)findViewById(finder.getId(this, "widget_bottom_button_last")); mButton_last.setOnClickListener(buttonListener); mButton_play=(ImageButton)findViewById(finder.getId(this, "widget_bottom_button_play")); mButton_play.setOnClickListener(buttonListener); mButton_next=(ImageButton)findViewById(finder.getId(this, "widget_bottom_button_next")); mButton_next.setOnClickListener(buttonListener); mBar_sound_progress=(SeekBar)findViewById(finder.getId(this, "plugin_centre_bottom_seekBar")); mBar_sound_progress.setOnSeekBarChangeListener(seekBarListener); audioManager=(AudioManager)getSystemService(Service.AUDIO_SERVICE); mInt_max_volume=audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); mString_path_array=getIntent().getStringArrayExtra(F_INTENT_DATA_KEY_AUDIOMGR_AUDIO_LIST); mInt_music_index=getIntent().getIntExtra("fileIndex", 0); initMusic(); } private void initMusic() { try { if (mString_path_array != null) { if(mMediaplayer != null){ mMediaplayer.stop(); mMediaplayer.reset(); }else{ mMediaplayer = new MediaPlayer(); mMediaplayer.reset(); } mString_file_Path=mString_path_array[mInt_music_index]; if (mString_file_Path != null && mString_file_Path.length() > 0) { initMusicInfo();//初始化界面,跟mediaplayer无关 if (loadFile(mString_file_Path)) { mMediaplayer.setOnCompletionListener(this);// 播放完监听 mMediaplayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { mMediaplayer.reset(); errorPrompt(); return true; } }); mMediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {//播放器prepare后start @Override public void onPrepared(MediaPlayer mp) { setSpecialImage(); setMediaInfo(); mMediaplayer.start(); mButton_play.setImageResource(mMediaplayer.isPlaying()?/*R.drawable.plugin_audio_pause_selector*/finder.getDrawableId(PMusicPlayerActivity.this, "plugin_audio_pause_selector"):/*R.drawable.plugin_audio_play_selector*/ResoureFinder.getInstance().getDrawableId(PMusicPlayerActivity.this, "plugin_audio_play_selector")); handler.sendEmptyMessage(88); } }); } } } } catch (Exception e) { errorPrompt(); } } private void setSpecialImage() { try { String musicPath = mString_file_Path; Cursor currentCursor = getCursor(musicPath.substring(musicPath.lastIndexOf('/') + 1)); int album_id = currentCursor.getInt(currentCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID)); String albumArt = getAlbumArt(album_id); Bitmap bm = null; if (albumArt != null) bm = BitmapFactory.decodeFile(albumArt); if (albumArt != null && bm != null) { mImage_special_image.setImageBitmap(ZoomBitmap(bm)); } } catch (Exception e) { e.printStackTrace(); } } /* * 缩放专辑图片 */ private Bitmap ZoomBitmap(Bitmap bp){ if(bp!=null){ int width=(mInt_screen_width/5)*3; int bp_width=bp.getWidth(); int bp_height=bp.getHeight(); float scale=((float)width)/bp_width; Matrix matrix = new Matrix(); matrix.postScale(scale, scale); return Bitmap.createBitmap(bp, 0, 0, bp_width, bp_height, matrix, true); } return null; } /* * 初始化界面控件,和mediaplayer无关的 */ private void initMusicInfo(){ /* * 初始化专辑图片(如果歌曲有专辑图片,下面再更换) */ Bitmap bm = BitmapFactory.decodeResource(getResources(), finder.getDrawableId(this, "plugin_audio_special")); if (bm != null) mImage_special_image.setImageBitmap(ZoomBitmap(bm)); mButton_play.setImageResource(finder.getDrawableId(this, "plugin_audio_play_selector"));//初始化播放按钮图片 //show music name mText_music_name.setText(mString_file_Path.substring(mString_file_Path.lastIndexOf('/') + 1, mString_file_Path.lastIndexOf('.'))); mText_play_time.setText("00:00");//初始化歌曲时间 mText_total_time.setText("00:00");//初始化歌曲时间总长 mBar_music_progress.setProgress(0);// mBar_music_progress.setSecondaryProgress(0); int volume=audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); mBar_sound_progress.setProgress(volume*100/mInt_max_volume);//设置声音进度条 } /* * 初始化mediaplayer相关变量 */ private void setMediaInfo(){ //select ImageButton image mInt_total_time=mMediaplayer.getDuration();//得到歌曲时间总长 mText_total_time.setText(getTime(mInt_total_time));//show music time length mMediaplayer.seekTo(0); } /* * Button Listener */ class ButtonOnClickListener implements OnClickListener{ @Override public void onClick(View v) { if (v.getId() == ResoureFinder.getInstance().getId(PMusicPlayerActivity.this, "plugin_music_button_return")) { finishActivity(); } else if (v.getId() == ResoureFinder.getInstance().getId(PMusicPlayerActivity.this, "plugin_music_button_list")) { Intent intent = new Intent(); intent.putExtra(F_INTENT_DATA_KEY_AUDIOMGR_AUDIO_LIST, mString_path_array); intent.setClass(PMusicPlayerActivity.this, PMusicFileActivity.class); startActivityForResult(intent, 0); } if (v.getId() == ResoureFinder.getInstance().getId(PMusicPlayerActivity.this, "widget_bottom_button_last")/*getTrendsID("widget_bottom_button_last", "id")*/) { if (mMediaplayer != null) if (mString_path_array != null && mInt_music_index > 0) { mInt_music_index--; initMusic(); } } if (v.getId() == ResoureFinder.getInstance().getId(PMusicPlayerActivity.this, "widget_bottom_button_play")) { if (mMediaplayer != null && mBar_music_progress.getProgress() != 100) if (mMediaplayer.isPlaying()) { mMediaplayer.pause(); mButton_play.setImageResource(finder.getDrawableId(PMusicPlayerActivity.this, "plugin_audio_play_selector")); } else { mMediaplayer.start(); handler.sendEmptyMessage(88); mButton_play.setImageResource(finder.getDrawableId(PMusicPlayerActivity.this, "plugin_audio_pause_selector")); } } if (v.getId() == ResoureFinder.getInstance().getId(PMusicPlayerActivity.this, "widget_bottom_button_next")) { if (mMediaplayer != null) if (mString_path_array != null && mInt_music_index < mString_path_array.length - 1) { mInt_music_index++; initMusic(); } } } } /* * 接受文件列表返回的选择序号 * (non-Javadoc) * @see android.app.Activity#onActivityResult(int, int, android.content.Intent) */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (resultCode) { case RESULT_OK: mInt_music_index=data.getIntExtra("listIndex", 0); initMusic(); break; } super.onActivityResult(requestCode, resultCode, data); } private int startProgress=0;//缓存的音乐进度progress class SeekBarOnClickListener implements OnSeekBarChangeListener{ @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { if(seekBar.getId()==ResoureFinder.getInstance().getId(PMusicPlayerActivity.this, "widget_top_progress_seekBar")){ startProgress = seekBar.getProgress();// 缓存按下时的Progress值 } } @Override public void onStopTrackingTouch(SeekBar seekBar) { try{ if(seekBar.getId()==ResoureFinder.getInstance().getId(PMusicPlayerActivity.this, "widget_top_progress_seekBar")){ if(mMediaplayer!=null && startProgress!=100){//如果音乐没有播放完毕,可以设定播放进度 mMediaplayer.pause(); mMediaplayer.seekTo(mInt_total_time/100*mBar_music_progress.getProgress()); mMediaplayer.start();handler.sendEmptyMessage(88); mButton_play.setImageResource(finder.getDrawableId(PMusicPlayerActivity.this, "plugin_audio_pause_selector")); }else if(startProgress==100){//如果播放完毕就不许进度条再设定其他值 mBar_music_progress.setProgress(100); } }else if(seekBar.getId()==ResoureFinder.getInstance().getId(PMusicPlayerActivity.this, "plugin_centre_bottom_seekBar")){ int mediaPlayerVolume=mBar_sound_progress.getProgress(); int volume=mInt_max_volume*mediaPlayerVolume/100;//获取设置音量 audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, AudioManager.FLAG_SHOW_UI); } }catch(Exception e){ e.printStackTrace(); } } } private AlertDialog alertDialog; // 弹出消息框 private void alertMessage(String message, final boolean exitOnConfirm) { alertDialog = new AlertDialog.Builder(this).setTitle(finder.getString("prompt")).setMessage(message) .setCancelable(false) .setPositiveButton(finder.getString("confirm"), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (exitOnConfirm) { finishActivity(); dialog.dismiss(); PMusicPlayerActivity.this.finish(); } } }).create(); alertDialog.show(); } /* * 根据inPath导入路径的开头判断导入方式 */ boolean isPrepare=false; public boolean loadFile(String inPath){ try{ if (inPath.indexOf(BUtility.F_Widget_RES_path) >= 0) {// (res://) final AssetFileDescriptor descriptor = this.getAssets().openFd(inPath.substring(inPath.indexOf(BUtility.F_Widget_RES_path))); if (descriptor == null) { alertMessage(finder.getString("plugin_audio_info_nofile"), true); } else { mMediaplayer.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength()); } } else { Uri uri = Uri.parse(inPath); mMediaplayer.setDataSource(this.getApplicationContext(), uri); } mMediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mMediaplayer.prepareAsync(); mMediaplayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { try { if (percent == 100 && !isPrepare) { mBar_music_progress.setSecondaryProgress(percent); isPrepare = true; handler.sendEmptyMessage(88); } else if (!isPrepare) { mBar_music_progress.setSecondaryProgress(percent); } } catch (Exception e) { e.printStackTrace(); } } }); }catch(Exception e){ e.printStackTrace(); return false; } return true; } /* * SD卡目录 */ public String getSDDirectory(){ return Environment.getExternalStorageDirectory()+"/"; } //得到小时 private String getTime(Integer time) { int hours = time/3600>0?time/3600/1000:0;// 小时 int minutes = (time / 1000 - hours * 3600) / 60; int seconds = time / 1000 % 60; return (minutes < 10 ? "0" + minutes : "" + minutes) +":"+ (seconds < 10 ? "0" + seconds : "" + seconds); } /* * 播放完毕监听 * @see android.media.MediaPlayer.OnCompletionListener#onCompletion(android.media.MediaPlayer) */ @Override public void onCompletion(MediaPlayer mp) { mBar_music_progress.setProgress(100);//音乐进度100% mMediaplayer.stop();//停止音乐 /*将显示时间设为最大*/ mMsg = handler.obtainMessage(); mMsg.what = 100; mMsg.arg1 = mInt_total_time; handler.sendMessage(mMsg); /*设置播放图标*/ mButton_play.setImageResource(finder.getDrawableId(this, "plugin_audio_play_selector")); } private Cursor getCursor(String filePath) { String path = null; Cursor c = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); if (c.moveToFirst()) { do { path = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); if (path.indexOf(filePath) != -1) { break; } } while (c.moveToNext()); } return c; } private String getAlbumArt(int album_id) { String mUriAlbums = "content://media/external/audio/albums"; String[] projection = new String[] { "album_art" }; Cursor cur = this.getContentResolver().query(Uri.parse(mUriAlbums + "/" + Integer.toString(album_id)), projection, null, null, null); String album_art = null; if (cur.getCount() > 0 && cur.getColumnCount() > 0) { cur.moveToNext(); album_art = cur.getString(0); } cur.close(); cur = null; return album_art; } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: finishActivity(); break; } return false; } @Override protected void onDestroy() { finishActivity(); super.onDestroy(); } /* * 出错提示 */ private void errorPrompt(){ AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle(finder.getStringId(this, "prompt")); alert.setMessage(finder.getStringId(this, "plugin_audio_info_nofile")); alert.setPositiveButton(finder.getStringId(this, "confirm"), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finishActivity(); } }); alert.show(); } /* * finish activity code */ private void finishActivity() { if (mMediaplayer != null) { if (mMediaplayer.isPlaying()) mMediaplayer.stop(); mMediaplayer.release(); } mMediaplayer = null; finish(); } }