类十一MusicActivity

package com.alex.media;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.util.Iterator;import java.util.TreeMap;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.database.Cursor;import android.media.AudioManager;import android.media.MediaPlayer;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.provider.MediaStore;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.ImageButton;import android.widget.SeekBar;import android.widget.TextView;import android.widget.SeekBar.OnSeekBarChangeListener;public class MusicActivity extends Activity {private int[] _ids;private int position;private String _titles[] = null;private Uri uri;private ImageButton playBtn = null;//播放、暂停//private Button stopBtn = null;//停止private ImageButton latestBtn = null;//上一首private ImageButton nextBtn = null;//下一首private ImageButton forwardBtn = null;//快进private ImageButton rewindBtn = null;//快退private TextView lrcText = null;//歌词文本private TextView playtime = null;//已播放时间private TextView durationTime = null;//歌曲时间private SeekBar seekbar = null;//歌曲进度private SeekBar soundBar = null;//音量调节private Handler handler = null;//用于进度条private Handler fHandler = null;//用于快进private int currentPosition;//当前播放位置private int duration;private DBHelper dbHelper = null;private TextView name = null;private TreeMap<Integer, LRCbean> lrc_map = new TreeMap<Integer, LRCbean>();private Cursor myCur;private static final String MUSIC_CURRENT = "com.alex.currentTime";private static final String MUSIC_DURATION = "com.alex.duration";private static final String MUSIC_NEXT = "com.alex.next";private static final String MUSIC_UPDATE = "com.alex.update";private static final int MUSIC_PLAY = 1;private static final int MUSIC_PAUSE = 2;private static final int MUSIC_STOP = 3;private static final int PROGRESS_CHANGE = 4;private static final int MUSIC_REWIND = 5;private static final int MUSIC_FORWARD = 6;private static final int STATE_PLAY = 1;private static final int STATE_PAUSE = 2;private int flag;//关于音量的变量private AudioManager mAudioManager = null;private int maxVolume;//最大音量private int currentVolume;//当前音量@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.main1);Intent intent = this.getIntent();Bundle bundle = intent.getExtras();_ids = bundle.getIntArray("_ids");position = bundle.getInt("position");_titles = bundle.getStringArray("_titles");lrcText = (TextView)findViewById(R.id.lrc);name = (TextView)findViewById(R.id.name);playtime = (TextView)findViewById(R.id.playtime);//已经播放的时间durationTime = (TextView)findViewById(R.id.duration);mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);//获得最大音量  currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);//获得当前音量 playBtn = (ImageButton)findViewById(R.id.playBtn);playBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {switch (flag) {case STATE_PLAY:pause();break;case STATE_PAUSE:play();break;}}});seekbar = (SeekBar)findViewById(R.id.seekbar);seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {play();}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {pause();}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {if (fromUser){seekbar_change(progress);}}});rewindBtn = (ImageButton)findViewById(R.id.rewindBtn);rewindBtn.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:pause();rewind();break;case MotionEvent.ACTION_UP:play();break;}return true;}});forwardBtn = (ImageButton)findViewById(R.id.forwardBtn);forwardBtn.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()){case MotionEvent.ACTION_DOWN:pause();forward();break;case MotionEvent.ACTION_UP:play();break;}return true;}});latestBtn = (ImageButton)findViewById(R.id.latestBtn);latestBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {latestOne();}});nextBtn = (ImageButton)findViewById(R.id.nextBtn);nextBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {nextOne();}});}@Overrideprotected void onStart() {super.onStart();setup();play();}private void loadClip(){seekbar.setProgress(0);//int pos = _ids[position];name.setText(_titles[position]);//设置歌曲名Intent intent = new Intent();intent.putExtra("_ids", _ids);intent.putExtra("position", position);intent.setAction("com.alex.media.MUSIC_SERVICE");startService(intent);}private void init(){IntentFilter filter = new IntentFilter();filter.addAction(MUSIC_CURRENT);filter.addAction(MUSIC_DURATION);filter.addAction(MUSIC_NEXT);filter.addAction(MUSIC_UPDATE);registerReceiver(musicReceiver, filter);}private void setup(){refreshView();loadClip();init();}/** * 音乐播放 */private void play(){flag = STATE_PLAY;playBtn.setBackgroundResource(R.drawable.pause_selecor);Intent intent = new Intent();intent.setAction("com.alex.media.MUSIC_SERVICE");intent.putExtra("op",MUSIC_PLAY);startService(intent);}/** * 音乐暂停 */private void pause(){flag = STATE_PAUSE;playBtn.setBackgroundResource(R.drawable.play_selecor);Intent intent = new Intent();intent.setAction("com.alex.media.MUSIC_SERVICE");intent.putExtra("op",MUSIC_PAUSE);startService(intent);}/** * 音乐停止 */private void stop(){unregisterReceiver(musicReceiver);Intent intent = new Intent();intent.setAction("com.alex.media.MUSIC_SERVICE");intent.putExtra("op", MUSIC_STOP);startService(intent);}/** * 用户拖动进度条 */private void seekbar_change(int progress){Intent intent = new Intent();intent.setAction("com.alex.media.MUSIC_SERVICE");intent.putExtra("op", PROGRESS_CHANGE);intent.putExtra("progress", progress);startService(intent);}/** * 快退 */private void rewind(){Intent intent = new Intent();intent.setAction("com.alex.media.MUSIC_SERVICE");intent.putExtra("op", MUSIC_REWIND);startService(intent);}/** * 快进 */private void forward(){Intent intent = new Intent();intent.setAction("com.alex.media.MUSIC_SERVICE");intent.putExtra("op", MUSIC_FORWARD);startService(intent);}/** * 上一首 */private void latestOne(){if (position==0){position = _ids.length-1;} else if (position>0){position--;}stop();setup();play();}/** * 下一首 */private void nextOne(){if (_ids.length==1){position = position;Intent intent = new Intent();intent.setAction("com.alex.media.MUSIC_SERVICE");intent.putExtra("length", 1);startService(intent);play();return;} else if (position == _ids.length-1){position = 0;} else if (position < _ids.length-1){position++;}stop();setup();play();}/** * 定义musicReceiver,接收MusicService发送的广播 */protected BroadcastReceiver musicReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(MUSIC_CURRENT)){currentPosition =  intent.getExtras().getInt("currentTime");//获得当前播放位置playtime.setText(toTime(currentPosition));seekbar.setProgress(currentPosition);//设置进度条Iterator<Integer> iterator=lrc_map.keySet().iterator();while(iterator.hasNext()){Object o = iterator.next();        LRCbean val = lrc_map.get(o);        if (val!=null){                if (currentPosition>val.getBeginTime()        &&currentPosition<val.getBeginTime()+val.getLineTime()){        lrcText.setText(val.getLrcBody());        break;        }        }}} else if (action.equals(MUSIC_DURATION)){duration = intent.getExtras().getInt("duration");seekbar.setMax(duration);durationTime.setText(toTime(duration));} else if (action.equals(MUSIC_NEXT)){nextOne();} else if (action.equals(MUSIC_UPDATE)){position = intent.getExtras().getInt("position");//refreshView();//name.setText(_titles[position]);setup();}}};@Overrideprotected void onStop() {super.onStop();unregisterReceiver(musicReceiver);}public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == event.KEYCODE_BACK) {Intent intent = new Intent();intent.setClass(this, ListActivity.class);startActivity(intent);finish();}return true;    }/** * 音量控制 */public boolean dispatchKeyEvent(KeyEvent event) { int action = event.getAction(); int keyCode = event.getKeyCode(); switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: if (action == KeyEvent.ACTION_UP) {if (currentVolume<maxVolume){currentVolume = currentVolume + 1;mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0);} else {mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0);}} return false; case KeyEvent.KEYCODE_VOLUME_DOWN: if (action == KeyEvent.ACTION_UP) { if (currentVolume>0){currentVolume = currentVolume - 1;mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume , 0);} else {mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0);}} return false; default: return super.dispatchKeyEvent(event); } }/** * 解析歌词 * @param path */private void read(String path){lrc_map.clear();    TreeMap<Integer, LRCbean> lrc_read = new TreeMap<Integer, LRCbean>();    String data = "";    BufferedReader br = null;    File file = new File(path);    if (!file.exists()){    lrcText.setText("歌词文件不存在...");    return;    }    FileInputStream stream = null;try {stream = new FileInputStream(file);            br = new BufferedReader(new InputStreamReader(stream, "GB2312"));} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}try {while((data=br.readLine())!=null){if (data.length()>6){if (data.charAt(3)==':'&&data.charAt(6)=='.'){//从歌词正文开始data = data.replace("[", "");data = data.replace("]", "@");data = data.replace(".", ":");String lrc[] = data.split("@");String lrcContent= null;if (lrc.length==2){lrcContent = lrc[lrc.length-1];//歌词}else{lrcContent = "";}String lrcTime[] = lrc[0].split(":");int m = Integer.parseInt(lrcTime[0]);//分int s = Integer.parseInt(lrcTime[1]);//秒int ms = Integer.parseInt(lrcTime[2]);//毫秒int begintime = (m*60 + s) * 1000 + ms;//转换成毫秒LRCbean lrcbean = new LRCbean();lrcbean.setBeginTime(begintime);//设置歌词开始时间lrcbean.setLrcBody(lrcContent);//设置歌词的主体lrc_read.put(begintime,lrcbean);}}}stream.close();} catch (IOException e) {e.printStackTrace();}//计算每句歌词需要的时间lrc_map.clear();data = "";Iterator<Integer> iterator = lrc_read.keySet().iterator();LRCbean oldval = null;int i = 0;while (iterator.hasNext()){Object ob = iterator.next();LRCbean val = lrc_read.get(ob);if (oldval==null){oldval = val;} else{LRCbean item1 = new LRCbean();item1 = oldval;item1.setLineTime(val.getBeginTime()-oldval.getBeginTime());lrc_map.put(new Integer(i), item1);i++;oldval = val;}}    }/** * 读取sd卡歌词 */public void refreshView() {myCur = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,new String[] { MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.ALBUM,MediaStore.Audio.Media.DISPLAY_NAME }, "_id=?",new String[] { _ids[position] + "" }, null);myCur.moveToFirst();String name = myCur.getString(4).substring(0,myCur.getString(4).lastIndexOf("."));read("/sdcard/" + name + ".lrc");}/** * 时间格式转换函数 * @param time * @return */public String toTime(int time) {time /= 1000;int minute = time / 60;int hour = minute / 60;int second = time % 60;minute %= 60;return String.format("%02d:%02d", minute, second);}}



类12 MusicListAdapter
package com.alex.media;import android.content.Context;import android.database.Cursor;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;public class MusicListAdapter extends BaseAdapter {private Context myCon;private Cursor myCur;private int pos=-1;public MusicListAdapter(Context con, Cursor cur) {myCon = con;myCur = cur;}@Overridepublic int getCount() {return myCur.getCount();}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {convertView = LayoutInflater.from(myCon).inflate(R.layout.musiclist,null);myCur.moveToPosition(position);TextView tv_music = (TextView) convertView.findViewById(R.id.music);if (myCur.getString(0).length()>24){try {String musicTitle = bSubstring(myCur.getString(0).trim(),24);tv_music.setText(musicTitle);} catch (Exception e) {e.printStackTrace();}}else {tv_music.setText(myCur.getString(0).trim());}TextView tv_singer = (TextView) convertView.findViewById(R.id.singer);if (myCur.getString(2).equals("<unknown>")){tv_singer.setText("未知艺术家");}else{tv_singer.setText(myCur.getString(2));}TextView tv_time = (TextView) convertView.findViewById(R.id.time);tv_time.setText(toTime(myCur.getInt(1)));ImageView img = (ImageView)convertView.findViewById(R.id.listitem);if (position == pos){img.setImageResource(R.drawable.isplaying);}else{img.setImageResource(R.drawable.item);}return convertView;}public void setItemIcon(int position){pos = position;}/** * 时间格式转换 * @param time * @return */public String toTime(int time) {time /= 1000;int minute = time / 60;int hour = minute / 60;int second = time % 60;minute %= 60;return String.format("%02d:%02d", minute, second);}/** * 字符串裁剪 * @param s * @param length * @return * @throws Exception */public static String bSubstring(String s, int length) throws Exception  {       byte[] bytes = s.getBytes("Unicode");      int n = 0; // 表示当前的字节数      int i = 2; // 要截取的字节数,从第3个字节开始      for (; i < bytes.length && n < length; i++)      {          // 奇数位置,如3、5、7等,为UCS2编码中两个字节的第二个字节          if (i % 2 == 1)          {              n++; // 在UCS2第二个字节时n加1          }          else         {              // 当UCS2编码的第一个字节不等于0时,该UCS2字符为汉字,一个汉字算两个字节              if (bytes[i] != 0)              {                  n++;              }          }      }      // 如果i为奇数时,处理成偶数      if (i % 2 == 1)       {          // 该UCS2字符是汉字时,去掉这个截一半的汉字          if (bytes[i - 1] != 0)              i = i - 1;          // 该UCS2字符是字母或数字,则保留该字符          else             i = i + 1;      }       return new String(bytes, 0, i, "Unicode");  }  }



类13 MusicService

package com.alex.media;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import android.app.Service;import android.content.BroadcastReceiver;import android.content.ContentValues;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.database.Cursor;import android.media.MediaPlayer;import android.media.MediaPlayer.OnPreparedListener;import android.net.Uri;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.provider.MediaStore;import android.telephony.TelephonyManager;public class MusicService extends Service implements MediaPlayer.OnCompletionListener{private static final String MUSIC_CURRENT = "com.alex.currentTime";private static final String MUSIC_DURATION = "com.alex.duration";private static final String MUSIC_NEXT = "com.alex.next";private static final String MUSIC_UPDATE = "com.alex.update";private static final String MUSIC_LIST = "com.alex.list";private static final int MUSIC_PLAY = 1;private static final int MUSIC_PAUSE = 2;private static final int MUSIC_STOP = 3;private static final int PROGRESS_CHANGE = 4;private static final int MUSIC_REWIND = 5;private static final int MUSIC_FORWARD = 6;private MediaPlayer mp = null;int progress;private Uri uri = null;private int id=10000;private Handler handler=null;private Handler rHandler = null;private Handler fHandler = null;private int currentTime;private int duration;private DBHelper dbHelper = null;private int flag;private int position;private int _ids[];private int _id;@Overridepublic void onCreate() {super.onCreate();if (mp != null) {mp.reset();mp.release();mp = null;}mp = new MediaPlayer();mp.setOnCompletionListener(this);/** * 注册来电接收器 */IntentFilter filter = new IntentFilter();filter.addAction("android.intent.action.ANSWER");registerReceiver(InComingSMSReceiver, filter);rHandler = new Handler();fHandler = new Handler();rHandler.removeCallbacks(rewind);fHandler.removeCallbacks(forward);}@Overridepublic void onDestroy() {super.onDestroy();if (mp!=null){stop();mp = null;}if (dbHelper!=null){dbHelper.close();dbHelper = null;}if (handler!=null){handler=null;}}@Overridepublic void onStart(Intent intent, int startId) {super.onStart(intent, startId);/** * 初始化mp */if ((flag==0)&&(intent.getExtras().getInt("list")==1)){return;}if (intent.getIntArrayExtra("_ids")!=null){_ids = intent.getIntArrayExtra("_ids");}int position1 = intent.getIntExtra("position", -1);if (position1!=-1){position = position1;_id = _ids[position];}int length = intent.getIntExtra("length", -1);if (_id!=-1){if (id!=_id){id=_id;uri = Uri.withAppendedPath(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,"" + _id);DBOperate(_id);try {mp.reset();mp.setDataSource(this, uri);} catch (Exception e) {e.printStackTrace();}} else if (length==1){try {mp.reset();mp.setDataSource(this, uri);} catch(Exception e){e.printStackTrace();}}}setup();init();if (position!=-1){Intent intent1 = new Intent();intent1.setAction(MUSIC_LIST);intent1.putExtra("position", position);sendBroadcast(intent1);}/** * 开始、暂停、停止 */int op = intent.getIntExtra("op", -1);if (op!=-1){switch (op) {case MUSIC_PLAY://播放if(!mp.isPlaying()){play();}break;case MUSIC_PAUSE://暂停if (mp.isPlaying()){pause();}break;case MUSIC_STOP://停止stop();break;case PROGRESS_CHANGE://改变歌曲进度    currentTime = intent.getExtras().getInt("progress");    mp.seekTo(currentTime);    break;case MUSIC_REWIND://快退rewind();break;case MUSIC_FORWARD://快进forward();break;} }}@Overridepublic IBinder onBind(Intent intent) {return null;}private void play(){if (mp!=null){mp.start();}flag = 1;rHandler.removeCallbacks(rewind);fHandler.removeCallbacks(forward);}private void pause(){if (mp!=null){mp.pause();}flag = 1;}private void stop(){if (mp!=null){mp.stop();try {mp.prepare();mp.seekTo(0);} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}handler.removeMessages(1);rHandler.removeCallbacks(rewind);fHandler.removeCallbacks(forward);}}private void init(){final Intent intent = new Intent();intent.setAction(MUSIC_CURRENT);if (handler==null){handler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what==1){if(flag==1){currentTime = mp.getCurrentPosition();intent.putExtra("currentTime", currentTime);sendBroadcast(intent);}handler.sendEmptyMessageDelayed(1, 600);}}};}}private void setup(){final Intent intent = new Intent();intent.setAction(MUSIC_DURATION);try {if (!mp.isPlaying()){mp.prepare();}mp.setOnPreparedListener(new OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {handler.sendEmptyMessage(1);}});} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}duration = mp.getDuration();intent.putExtra("duration", duration);sendBroadcast(intent);}private void rewind(){//快进rHandler.post(rewind);}private void forward(){fHandler.post(forward);}Runnable rewind = new Runnable() {@Overridepublic void run() {if (currentTime>=0){currentTime = currentTime - 5000;mp.seekTo(currentTime);rHandler.postDelayed(rewind, 500);}}};Runnable forward = new Runnable() {@Overridepublic void run() {if (currentTime<=duration){currentTime = currentTime + 5000;mp.seekTo(currentTime);fHandler.postDelayed(forward, 500);}}};@Overridepublic void onCompletion(MediaPlayer mp) {/*Intent intent = new Intent();intent.setAction(MUSIC_NEXT);sendBroadcast(intent);System.out.println("onCompletion...");*/if (_ids.length==1){position = position;} else if (position == _ids.length-1){position = 0;} else if (position < _ids.length-1){position++;}uri = Uri.withAppendedPath(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,"" + _ids[position]);DBOperate(_ids[position]);id=_ids[position];try {mp.reset();mp.setDataSource(this, uri);} catch (Exception e) {e.printStackTrace();}setup();init();stop();play();//通知音乐列表更新Intent intent = new Intent();intent.setAction(MUSIC_LIST);intent.putExtra("position", position);sendBroadcast(intent);//通知播放界面更新Intent intent1 = new Intent();intent1.setAction(MUSIC_UPDATE);intent1.putExtra("position", position);sendBroadcast(intent1);}/** * 数据库操作 * @param pos */private void DBOperate(int pos){dbHelper = new DBHelper(this, "music.db", null, 2);Cursor c = dbHelper.query(pos);Date currentTime = new Date();   SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");   String dateString = formatter.format(currentTime); if (c==null||c.getCount()==0){//如果查询结果为空ContentValues values = new ContentValues();values.put("music_id", pos);values.put("clicks", 1);values.put("latest", dateString);dbHelper.insert(values);} else{c.moveToNext();int clicks = c.getInt(2);clicks++;ContentValues values = new ContentValues();values.put("clicks", clicks);values.put("latest", dateString);dbHelper.update(values, pos);}if (c!=null){c.close();c = null;}if (dbHelper!=null){dbHelper.close();dbHelper = null;}}/** * 来电广播接收器 */protected BroadcastReceiver InComingSMSReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {System.out.println("android.intent.action.ANSWER");if (intent.getAction().equals(Intent.ACTION_ANSWER)){TelephonyManager telephonymanager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);switch (telephonymanager.getCallState()) {case TelephonyManager.CALL_STATE_RINGING:pause();break;case TelephonyManager.CALL_STATE_OFFHOOK:play();break; default: break;}}}};}


类14 RecentlyActivity

package com.alex.media;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.database.Cursor;import android.media.AudioManager;import android.os.Bundle;import android.provider.MediaStore;import android.view.KeyEvent;import android.view.View;import android.widget.AdapterView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.AdapterView.OnItemClickListener;import android.widget.LinearLayout.LayoutParams;import com.alex.media.ClicksActivity.ListItemClickListener;public class RecentlyActivity extends Activity {private DBHelper dbHelper = null;private ListView listview;private int[] _ids;private String[]_titles;Cursor cursor = null;int[] music_id;//关于音量的变量private AudioManager mAudioManager = null;private int maxVolume;//最大音量private int currentVolume;//当前音量@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);dbHelper = new DBHelper(this, "music.db", null, 2);cursor = dbHelper.queryRecently();cursor.moveToFirst();int num;if (cursor!=null){num = cursor.getCount();System.out.println("clicks:" + num);} else{return;}String idString ="";if (num>=10){for(int i=0;i<10;i++){music_id = new int[10];music_id[i]=cursor.getInt(cursor.getColumnIndex("music_id"));if (i<9){idString = idString+music_id[i]+",";} else{idString = idString+music_id[i];}cursor.moveToNext();} }else if(num>0){for(int i=0;i<num;i++){music_id = new int[num];music_id[i]=cursor.getInt(cursor.getColumnIndex("music_id"));if (i<num-1){idString = idString+music_id[i]+",";} else{idString = idString+music_id[i];}cursor.moveToNext();}}if (cursor!=null){cursor.close();cursor=null;}listview = new ListView(this);Cursor c = this.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,        new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DISPLAY_NAME} , MediaStore.Audio.Media._ID + " in ("+ idString + ")", null,null);  c.moveToFirst();        _ids = new int[c.getCount()];        _titles = new String[c.getCount()];        for(int i=0;i<c.getCount();i++){        _ids[i] = c.getInt(3);        _titles[i] = c.getString(0);                c.moveToNext();        }        listview.setAdapter(new MusicListAdapter(this, c));        listview.setOnItemClickListener(new ListItemClickListener());        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);//获得最大音量  currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);//获得当前音量 LinearLayout list = new LinearLayout(this);list.setBackgroundResource(R.drawable.listbg);        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(        LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);        list.addView(listview,params);        setContentView(list);    }       class ListItemClickListener implements OnItemClickListener{    @Override    public void onItemClick(AdapterView<?> arg0, View view, int position, long id) {    // TODO Auto-generated method stub    Intent intent = new Intent(RecentlyActivity.this,MusicActivity.class);    intent.putExtra("_ids", _ids);    intent.putExtra("_titles", _titles);    intent.putExtra("position", position);    startActivity(intent);    finish();    }        }    public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == event.KEYCODE_BACK) {Intent intent = new Intent();intent.setClass(this, MainActivity.class);startActivity(intent);finish();}return true;    }    public boolean dispatchKeyEvent(KeyEvent event) { int action = event.getAction(); int keyCode = event.getKeyCode(); switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: if (action == KeyEvent.ACTION_UP) {if (currentVolume<maxVolume){currentVolume = currentVolume + 1;mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0);} else {mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0);}} return false; case KeyEvent.KEYCODE_VOLUME_DOWN: if (action == KeyEvent.ACTION_UP) { if (currentVolume>0){currentVolume = currentVolume - 1;mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume , 0);} else {mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0);}} return false; default: return super.dispatchKeyEvent(event); } }}



类15 ScanSdReceiver
package com.alex.media;import android.app.AlertDialog;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.database.Cursor;import android.provider.MediaStore;import android.widget.Toast;public class ScanSdReceiver extends BroadcastReceiver {private AlertDialog.Builder  builder = null;private AlertDialog ad = null;private int count1;private int count2;private int count;@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (Intent.ACTION_MEDIA_SCANNER_STARTED.equals(action)){Cursor c1 = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DISPLAY_NAME },null, null, null);count1 = c1.getCount();System.out.println("count:"+count);builder = new AlertDialog.Builder(context);builder.setMessage("正在扫描存储卡...");ad = builder.create();ad.show();}else if(Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action)){Cursor c2 = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DISPLAY_NAME },null, null, null);count2 = c2.getCount();count = count2-count1;ad.cancel();if (count>=0){Toast.makeText(context, "共增加" + count + "首歌曲", Toast.LENGTH_LONG).show();} else {Toast.makeText(context, "共减少" + count + "首歌曲", Toast.LENGTH_LONG).show();}}}}


类16 TestMain


package com.alex.media;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import android.app.AlertDialog;import android.app.TabActivity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.database.Cursor;import android.media.AudioManager;import android.os.Bundle;import android.provider.MediaStore;import android.view.KeyEvent;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.TabHost;import android.widget.AdapterView.OnItemClickListener;import android.widget.LinearLayout.LayoutParams;public class TestMain extends TabActivity implements TabHost.TabContentFactory{@Overrideprotected void onStart() {IntentFilter filter = new IntentFilter();        filter.addAction(MUSIC_LIST);registerReceiver(changeItem, filter);super.onStart();}private static final String MUSIC_LIST = "com.alex.list";private ListView listview;private int[] _ids;private String[]_titles;private int pos;private  MusicListAdapter adapter;private ScanSdReceiver scanSdReceiver = null;private AlertDialog ad = null;private AlertDialog.Builder  builder = null;private Cursor c;private String[] albums;private String[] artists;//关于音量的变量private AudioManager mAudioManager = null;private int maxVolume;//最大音量private int currentVolume;//当前音量@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TabHost th = getTabHost();th.addTab(th.newTabSpec("list").setIndicator("音乐列表").setContent(this));th.addTab(th.newTabSpec("artists").setIndicator("艺术家").setContent(this));th.addTab(th.newTabSpec("albums").setIndicator("专辑").setContent(this));                //测试是否有音乐在播放        Intent intent = new Intent();        intent.setAction("com.alex.media.MUSIC_SERVICE");        intent.putExtra("list", 1);        startService(intent);        }@Overridepublic View createTabContent(String tag) {if (tag.equals("list")){c = this.getContentResolver()    .query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,    new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DISPLAY_NAME },    null, null, null);    if (c==null || c.getCount()==0){    builder = new AlertDialog.Builder(this);builder.setMessage("存储列表为空...").setPositiveButton("确定", null);ad = builder.create();ad.show();    }    c.moveToFirst();    _ids = new int[c.getCount()];    _titles = new String[c.getCount()];    for(int i=0;i<c.getCount();i++){    _ids[i] = c.getInt(3);    _titles[i] = c.getString(0);    c.moveToNext();    }    listview = new ListView(this);    listview.setOnItemClickListener(new ListItemClickListener());    adapter = new MusicListAdapter(this, c);        listview.setAdapter(adapter);} else if (tag.equals("artists")){c = this.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DISPLAY_NAME}, null, null,null);c.moveToFirst();int num = c.getCount();HashSet set = new HashSet();for (int i = 0; i < num; i++){if (c.getString(2).equals("<unknown>")){set.add("未知艺术家");}else{set.add(c.getString(2));c.moveToNext();}}num = set.size();Iterator it = set.iterator();artists = new String[num];int i = 0;while(it.hasNext()){artists[i] = it.next().toString();i++;}listview = new ListView(this);listview.setAdapter(new ArtistListAdapter(this, artists));listview.setOnItemClickListener(new ArtistsItemClickListener());} else if (tag.equals("albums")){Cursor c = this.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.ALBUM,MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DISPLAY_NAME}, null, null,MediaStore.Audio.Media.ALBUM);c.moveToFirst();int num = c.getCount();HashSet set = new HashSet();for (int i = 0; i < num; i++){set.add(c.getString(3));c.moveToNext();}num = set.size();Iterator it = set.iterator();albums = new String[num];int i = 0;while(it.hasNext()){albums[i] = it.next().toString();i++;}String album="";for (int j=0;j<num; j++){if (j<num-1){album = album + "'" + albums[j] + "',"; } else{album = album + "'" + albums[j] + "'";}}Cursor c1 = this.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.ALBUM,MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DISPLAY_NAME}, null,null,MediaStore.Audio.Media.ALBUM);c1.moveToFirst();HashMap<String, String> map = new HashMap<String, String>();int num1 = c1.getCount();for (int j=0;j<num1;j++){map.put(c1.getString(3), c1.getString(2));c1.moveToNext();}listview = new ListView(this);listview.setAdapter(new AlbumListAdapter(this, albums,map));listview.setOnItemClickListener(new AlbumsItemClickListener());}                mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);//获得最大音量  currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);//获得当前音量 LinearLayout list = new LinearLayout(this);list.setBackgroundResource(R.drawable.listbg);        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(        LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);        list.removeAllViews();        list.addView(listview,params);return list;}class ListItemClickListener implements OnItemClickListener{    @Override    public void onItemClick(AdapterView<?> arg0, View view, int position, long id) {    // TODO Auto-generated method stub    Intent intent = new Intent(TestMain.this,MusicActivity.class);    intent.putExtra("_ids", _ids);    intent.putExtra("_titles", _titles);    intent.putExtra("position", position);    startActivity(intent);    finish();    }        }class ArtistsItemClickListener implements OnItemClickListener{    @Override    public void onItemClick(AdapterView<?> arg0, View view, int position, long id) {    Intent intent = new Intent();    intent.setClass(TestMain.this, ArtistActivity.class);    intent.putExtra("artist", artists[position]);    startActivity(intent);    }    }class AlbumsItemClickListener implements OnItemClickListener{    @Override    public void onItemClick(AdapterView<?> arg0, View view, int position, long id) {    Intent intent = new Intent();    intent.setClass(TestMain.this, AlbumActivity.class);    intent.putExtra("albums", albums[position]);    startActivity(intent);    }    }               public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == event.KEYCODE_BACK) {if (scanSdReceiver!=null)      unregisterReceiver(scanSdReceiver);Intent intent = new Intent();intent.setClass(this, MainActivity.class);startActivity(intent);finish();}return true;    }    public boolean dispatchKeyEvent(KeyEvent event) { int action = event.getAction(); int keyCode = event.getKeyCode(); switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: if (action == KeyEvent.ACTION_UP) {if (currentVolume<maxVolume){currentVolume = currentVolume + 1;mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0);} else {mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0);}} return false; case KeyEvent.KEYCODE_VOLUME_DOWN: if (action == KeyEvent.ACTION_UP) { if (currentVolume>0){currentVolume = currentVolume - 1;mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume , 0);} else {mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0);}} return false; default: return super.dispatchKeyEvent(event); } }    private BroadcastReceiver changeItem = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(MUSIC_LIST)){pos = intent.getExtras().getInt("position");adapter.setItemIcon(pos);//改变列表项图标adapter.notifyDataSetChanged();//通知UI更新}}};@Overrideprotected void onStop() {super.onStop();unregisterReceiver(changeItem);}}

更多相关文章

  1. android上文本框输入限制最大字节数
  2. MTK平台修改音量默认值需要改动的位置
  3. Android 录音获取麦克风实时音量
  4. android应用市场、社区客户端、漫画App、TensorFlow Demo、歌词
  5. android4.4调整音量调节速度
  6. Android 录音获取麦克风实时音量--资料
  7. android 调节媒体音量
  8. Android录音时,根据PCM数据获取音量值(单位分贝)
  9. android中流的理解。(字节流读写与字符流的读写)

随机推荐

  1. Eclipse中跟踪调试Android源代码
  2. 继续推荐Android12个自测源码
  3. andrid系统的架构
  4. Android编译时出现"Unable to execute de
  5. Android启动Activity之后阻止EditText自
  6. EClipse 项目导入 Android(安卓)Studio
  7. android 通知 和 通知的声音 (附源码)
  8. android有序广播和无序广播的区别
  9. Android自定义上下文菜单
  10. android生命周期测试