效果图:
源码:
比较懒直接贴些源码,图片啥就不贴,主要是做些指导性的。
package com.xuan.lx.xplayer.activity; import com.xuan.lx.xplayer.R; import android.app.TabActivity; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; import android.widget.TabHost; public class MainActivity extends TabActivity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Resources res = getResources(); TabHost tabHost = getTabHost(); Intent intent = new Intent().setClass(this, ListActivity.class); TabHost.TabSpec spec = tabHost.newTabSpec("音乐").setIndicator("音乐", res.getDrawable(R.drawable.item)) .setContent(intent); tabHost.addTab(spec); intent = new Intent().setClass(this, ArtistsActivity.class); spec = tabHost.newTabSpec("艺术家").setIndicator("艺术家", res.getDrawable(R.drawable.artist)) .setContent(intent); tabHost.addTab(spec); intent = new Intent().setClass(this, AlbumsActivity.class); spec = tabHost.newTabSpec("唱片").setIndicator("唱片", res.getDrawable(R.drawable.album)) .setContent(intent); tabHost.addTab(spec); intent = new Intent().setClass(this, LastedActivity.class); spec = tabHost.newTabSpec("最近播放").setIndicator("最近播放", res.getDrawable(R.drawable.album)) .setContent(intent); tabHost.addTab(spec); tabHost.setCurrentTab(0); } }
ListActivity.java
package com.xuan.lx.xplayer.activity; import java.util.List; import com.xuan.lx.xplayer.R; import com.xuan.lx.xplayer.R.drawable; import com.xuan.lx.xplayer.adapter.MusicAdapter; import com.xuan.lx.xplayer.util.Music; import com.xuan.lx.xplayer.util.MusicData; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.AdapterView.OnItemClickListener; /** * 初始化音乐列表 * @author xuan.lx * */ public class ListActivity extends BaseActivity{ private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); convertView = LayoutInflater.from(this).inflate(R.layout.listmusic, null); convertView.setBackgroundResource(drawable.player_bg2); setContentView(convertView); listView = (ListView) this.findViewById(R.id.listAllMusic); //获取媒体文件 List<Music> listMusic = MusicData.getMusicData(getApplicationContext()); if(listMusic != null && listMusic.size() > 0){ adapter = new MusicAdapter(this, listMusic); listView.setAdapter(adapter); listView.setOnItemClickListener(ItemClick); } } OnItemClickListener ItemClick = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { adapter.setSelectItem(position); adapter.notifyDataSetInvalidated(); Intent intent = new Intent(ListActivity.this, MusicActivity.class); intent.putExtra("id", position); startActivity(intent); } }; @Override protected void onStart(){ super.onStart(); BaseActivity.adapter.setSelectItem(MusicService.currentId); BaseActivity.adapter.notifyDataSetInvalidated(); } }
LastedActivity.java
package com.xuan.lx.xplayer.activity; import com.xuan.lx.xplayer.R; import com.xuan.lx.xplayer.R.drawable; import com.xuan.lx.xplayer.adapter.LastedAdapter; import com.xuan.lx.xplayer.util.MusicData; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; public class LastedActivity extends BaseActivity{ private ListView lastedListView; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); convertView = LayoutInflater.from(this).inflate(R.layout.songs, null); convertView.setBackgroundResource(drawable.xim); setContentView(convertView); lastedListView = (ListView) this.findViewById(R.id.lastedListView); LastedAdapter adapter = new LastedAdapter(this,MusicData.getMusicData(this)); lastedListView.setAdapter(adapter); lastedListView.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(LastedActivity.this,MusicActivity.class); intent.putExtra("id", position); startActivity(intent); } }); } }
package com.xuan.lx.xplayer.activity; import com.xuan.lx.xplayer.R; import com.xuan.lx.xplayer.R.drawable; import com.xuan.lx.xplayer.adapter.AlbumsAdapter; import com.xuan.lx.xplayer.util.MusicData; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; public class AlbumsActivity extends BaseActivity{ private ListView albumtListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); convertView = LayoutInflater.from(this).inflate(R.layout.albums, null); convertView.setBackgroundResource(drawable.yanshi); setContentView(convertView); albumtListView = (ListView) this.findViewById(R.id.albumListView); AlbumsAdapter adapter = new AlbumsAdapter(this,MusicData.getMusicData(this)); albumtListView.setAdapter(adapter); albumtListView.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(AlbumsActivity.this, MusicActivity.class); intent.putExtra("id", position); startActivity(intent); }}); } }
package com.xuan.lx.xplayer.activity; import com.xuan.lx.xplayer.R; import com.xuan.lx.xplayer.R.drawable; import com.xuan.lx.xplayer.adapter.AlbumsAdapter; import com.xuan.lx.xplayer.util.MusicData; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; public class AlbumsActivity extends BaseActivity{ private ListView albumtListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); convertView = LayoutInflater.from(this).inflate(R.layout.albums, null); convertView.setBackgroundResource(drawable.yanshi); setContentView(convertView); albumtListView = (ListView) this.findViewById(R.id.albumListView); AlbumsAdapter adapter = new AlbumsAdapter(this,MusicData.getMusicData(this)); albumtListView.setAdapter(adapter); albumtListView.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(AlbumsActivity.this, MusicActivity.class); intent.putExtra("id", position); startActivity(intent); }}); } }
package com.xuan.lx.xplayer.activity; import com.xuan.lx.xplayer.R; import com.xuan.lx.xplayer.R.drawable; import com.xuan.lx.xplayer.adapter.ArtistsAdapter; import com.xuan.lx.xplayer.util.MusicData; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.AdapterView.OnItemClickListener; public class ArtistsActivity extends BaseActivity{ private ListView artistListView; View convertView ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); convertView = LayoutInflater.from(this).inflate(R.layout.artist, null); convertView.setBackgroundResource(drawable.qianshou); setContentView(convertView); artistListView=(ListView) this.findViewById(R.id.artistListView); ArtistsAdapter adapter=new ArtistsAdapter(this, MusicData.getMusicData(this)); artistListView.setAdapter(adapter); artistListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { Intent intent = new Intent(ArtistsActivity.this, MusicActivity.class); intent.putExtra("id", arg2); startActivity(intent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item){ return super.onOptionsItemSelected(item); } }
package com.xuan.lx.xplayer.activity; import com.xuan.lx.xplayer.adapter.Menus; import com.xuan.lx.xplayer.adapter.MusicAdapter; import com.xuan.lx.xplayer.adapter.TabMenu; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class BaseActivity extends Activity { static MusicAdapter adapter = null; View convertView; TabMenu tabMenu; @Override public boolean onCreateOptionsMenu(Menu menu) { Menus.setAcitivty(this); Menus.setMenus(menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case (Constants.M_SCAN): break; case (Constants.M_SKIN): break; case (Constants.M_SET): Intent mIntent = new Intent(); mIntent.setClass(this, MyPreference.class); startActivity(mIntent); break; case (Constants.M_EXIT): Menus.closeApp(); break; } return super.onOptionsItemSelected(item); } }
package com.xuan.lx.xplayer.activity; import android.view.Menu; import com.xuan.lx.xplayer.R; /** * 定义相关播放状态 * @author xuan.lx * */ public class Constants { /** * 播放的状态 */ //接着播放 public static final int PLAYING = 0; //重新播放 public static final int REPLAYING = 1; //暂停 public static final int PUASE = 2; //下一首 public static final int NEXT = 3; //上一首 public static final int PREVIOUS = 4; //停止 public static final int STOP = 5; /** * 播放的方式 */ //循环播放 public static final int LOOP = 0; //单曲循环 public static final int CIRCLE = 1; //随机播放 public static final int RANDOM = 2; /** 菜单图片 **/ public static final int[] menu_image_array = { R.drawable.ic_menu_scan_default, R.drawable.ic_menu_skin_default,R.drawable.ic_menu_setting_default, R.drawable.ic_menu_exit_default}; /** 菜单文字 **/ public static final String[] menu_name_array = { "隐藏","背景", "设置", "退出" }; /* 独一无二的menu选项identifier,用以识别事件 */ public static final int M_SCAN = Menu.FIRST; public static final int M_SKIN = Menu.FIRST + 1; public static final int M_SET = Menu.FIRST + 2; public static final int M_EXIT = Menu.FIRST + 3; /* menu组ID */ public static final int idGroup1 = 0; /* menuItemID */ public static final int orderMenuItem1 = Menu.NONE; public static final int orderMenuItem2 = Menu.NONE + 1; public static final int orderMenuItem3 = Menu.NONE + 2; public static final int orderMenuItem4 = Menu.NONE + 3; // public static boolean isListenerSensor = true; }
package com.xuan.lx.xplayer.activity; import com.xuan.lx.xplayer.R; import com.xuan.lx.xplayer.R.drawable; import com.xuan.lx.xplayer.adapter.LastedAdapter; import com.xuan.lx.xplayer.util.MusicData; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; public class LastedActivity extends BaseActivity{ private ListView lastedListView; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); convertView = LayoutInflater.from(this).inflate(R.layout.songs, null); convertView.setBackgroundResource(drawable.xim); setContentView(convertView); lastedListView = (ListView) this.findViewById(R.id.lastedListView); LastedAdapter adapter = new LastedAdapter(this,MusicData.getMusicData(this)); lastedListView.setAdapter(adapter); lastedListView.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(LastedActivity.this,MusicActivity.class); intent.putExtra("id", position); startActivity(intent); } }); } }
package com.xuan.lx.xplayer.activity; import java.util.List; import com.xuan.lx.xplayer.R; import com.xuan.lx.xplayer.R.drawable; import com.xuan.lx.xplayer.adapter.MusicAdapter; import com.xuan.lx.xplayer.util.Music; import com.xuan.lx.xplayer.util.MusicData; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.AdapterView.OnItemClickListener; /** * 初始化音乐列表 * @author xuan.lx * */ public class ListActivity extends BaseActivity{ private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); convertView = LayoutInflater.from(this).inflate(R.layout.listmusic, null); convertView.setBackgroundResource(drawable.player_bg2); setContentView(convertView); listView = (ListView) this.findViewById(R.id.listAllMusic); //获取媒体文件 List<Music> listMusic = MusicData.getMusicData(getApplicationContext()); if(listMusic != null && listMusic.size() > 0){ adapter = new MusicAdapter(this, listMusic); listView.setAdapter(adapter); listView.setOnItemClickListener(ItemClick); } } OnItemClickListener ItemClick = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { adapter.setSelectItem(position); adapter.notifyDataSetInvalidated(); Intent intent = new Intent(ListActivity.this, MusicActivity.class); intent.putExtra("id", position); startActivity(intent); } }; @Override protected void onStart(){ super.onStart(); BaseActivity.adapter.setSelectItem(MusicService.currentId); BaseActivity.adapter.notifyDataSetInvalidated(); } }
package com.xuan.lx.xplayer.activity; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.Gravity; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import com.xuan.lx.xplayer.R; import com.xuan.lx.xplayer.adapter.TabMenu; public class MenuActivity extends Activity { View menuView; /** 菜单图片 **/ int[] menu_image_array = { R.drawable.menu_account, R.drawable.menu_settings, R.drawable.menu_quit }; /** 菜单文字 **/ String[] menu_name_array = { "隐藏", "设置", "退出" }; TabMenu tabMenu; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //menuView = View.inflate(this, R.layout.view_menu, null); this.setContentView(R.layout.view_menu); TabMenu.MenuBodyAdapter bodyAdapter = new TabMenu.MenuBodyAdapter(this, menu_image_array,menu_name_array); tabMenu = new TabMenu(this, new BodyClickEvent(),bodyAdapter);// 出现与消失的动画 tabMenu.update(); tabMenu.setBodyAdapter(bodyAdapter); } class BodyClickEvent implements OnItemClickListener { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { tabMenu.setBodySelect(arg2, Color.GRAY); } } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add("menu");// 必须创建一项 return super.onCreateOptionsMenu(menu); } /** * 拦截MENU事件,显示自己的菜单 */ @Override public boolean onMenuOpened(int featureId, Menu menu) { if (tabMenu != null) { if (tabMenu.isShowing()){ tabMenu.dismiss(); }else { tabMenu.showAtLocation(findViewById(R.id.LinearLayout01), Gravity.BOTTOM, 0, 0); } } // 返回为true 则显示系统menu return false; } }
package com.xuan.lx.xplayer.activity; import java.io.IOException; import java.util.List; import java.util.Random; import com.xuan.lx.xplayer.R; import com.xuan.lx.xplayer.util.LrcProcess; import com.xuan.lx.xplayer.util.LrcView; import com.xuan.lx.xplayer.util.Music; import com.xuan.lx.xplayer.util.MusicData; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnErrorListener; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; public class MusicService extends Service implements Runnable { private MediaPlayer player; private List<Music> lists; public static volatile int currentId = -1; // 当前正在播放的id public static volatile Boolean isRun = true; public LrcProcess mLrcProcess; public LrcView mLrcView; public static int playing_id = 0; public static Boolean playing = false;//是否还在播放 static Random random = new Random(10); public volatile static Boolean isPlay = false; public volatile static Boolean ringBeforState = false; public static int id = 1; public static Boolean replaying = false;//重新播放 public static int playWay = Constants.LOOP;//列表循环;单曲循环 ;随机播放 @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onCreate() { // TODO Auto-generated method stub lists = MusicData.getMusicData(getApplicationContext()); random = new Random(lists.size()-1); // 注册更新进度条广播事件 SeekBarBroadcastReceiver receiver = new SeekBarBroadcastReceiver(); IntentFilter filter = new IntentFilter("com.xuan.lx.xplayer.seekBar"); this.registerReceiver(receiver, filter); //启动歌曲进度线程 new Thread(this).start(); super.onCreate(); //电话状态监听 TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); telManager.listen(mobliePhoneStateListener,PhoneStateListener.LISTEN_CALL_STATE); } public PhoneStateListener mobliePhoneStateListener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_IDLE: // 无任何状态时 if( MusicService.ringBeforState ){ MusicActivity.imageBtnPlay.setImageResource(R.drawable.pause1); MusicService.isPlay = true; Intent intent = new Intent(); // 设置service 参数 intent.putExtra("play", Constants.PLAYING); intent.putExtra("id", MusicService.currentId); onStart(intent,0); } break; case TelephonyManager.CALL_STATE_OFFHOOK: // 接起电话时 break; case TelephonyManager.CALL_STATE_RINGING: // 电话进来时 if(MusicService.isPlay){ MusicService.ringBeforState = true; MusicActivity.imageBtnPlay.setImageResource(R.drawable.play1); MusicService.isPlay = false; Intent intent = new Intent(); // 设置service 参数 intent.putExtra("play", Constants.PUASE); intent.putExtra("id", MusicService.currentId); onStart(intent,0); } break; default: break; } } }; /** * 拖动进度条更新到此时播放的位置 broadcastReceiver * @author xuan.lx * */ private class SeekBarBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int seekBarPosition = intent.getIntExtra("seekBarPosition", 0); player.seekTo(seekBarPosition * player.getDuration() / 100); if(null == player) player.start(); } } @Override public void run() { // TODO Auto-generated method stub while ( true ) { try { Thread.sleep(200); } catch (InterruptedException e) { } if (null != player) { if( isRun ){ try { //获取当前进度 int position = player.getCurrentPosition(); //获取总时间 int total = player.getDuration(); Intent intent = new Intent("com.xuan.lx.xplayer.progress"); intent.putExtra("position", position); intent.putExtra("total", total); //发送广播消息 sendBroadcast(intent); } catch (Exception e) { e.printStackTrace(); } } } } } /** * @author xuan.lx * 重写onStart 启动播放 */ @Override public void onStart(Intent intent, int startId) { int play = intent.getIntExtra("play", Constants.PLAYING); currentId = intent.getIntExtra("id", 1); isRun = true; switch(play){ case Constants.PLAYING: if (player != null) { player.start(); } else { playMusic(currentId); } break; case Constants.PUASE: if (null != player) { player.pause(); } break; case Constants.STOP: if (null != player) { isRun = false; player.stop(); } break; case Constants.NEXT: playMusic(currentId); break; case Constants.PREVIOUS: playMusic(currentId); break; case Constants.REPLAYING: playMusic(currentId); break; } BaseActivity.adapter.setSelectItem(MusicService.currentId); BaseActivity.adapter.notifyDataSetInvalidated(); } private void playMusic(int id) { //如果存在则释放,重新开始播放 if (null != player) { try { isRun = false; Thread.sleep(200); player.reset(); player.release(); player = null; } catch (InterruptedException e) { e.printStackTrace(); } } if (id >= lists.size()) { currentId = lists.size() - 1; } else if (id < 0) { currentId = 0; } Music m = lists.get(currentId); String url = m.getUrl(); player = new MediaPlayer(); player.reset(); player.setAudioStreamType(AudioManager.STREAM_MUSIC); try { player.setDataSource(url); player.prepare(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } player.start(); isRun = true; //当一首播放完后 player.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { Intent intent = new Intent("com.xuan.lx.xplayer.completion"); switch(MusicService.playWay){ case Constants.LOOP: currentId ++; if (currentId >= lists.size()) { currentId = 0; } else if ( currentId < 0 ) { currentId = lists.size() -1; } playMusic(currentId); sendBroadcast(intent); break; case Constants.CIRCLE: playMusic(currentId); sendBroadcast(intent); break; case Constants.RANDOM: currentId = random.nextInt(lists.size()); playMusic(currentId); sendBroadcast(intent); break; } } }); //当出现错误的时候 player.setOnErrorListener(new OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { if (null != player) { player.release(); player = null; } Music m = lists.get(currentId); String url = m.getUrl(); player = new MediaPlayer(); player.reset(); player.setAudioStreamType(AudioManager.STREAM_MUSIC); try { player.setDataSource(url); player.prepare(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } player.start(); return false; } }); } /** * 当服务销毁时 * @author xuan.lx */ public void onDestroy() { isRun = false; if (null != player) { player.reset(); player.release(); player = null; } } }
package com.xuan.lx.xplayer.activity; import com.xuan.lx.xplayer.R; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceScreen; import android.widget.Toast; public class MyPreference extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.prefs_fragment); } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { SharedPreferences sf = preference.getSharedPreferences(); if(preference.getKey().equals("fling")){ Constants.isListenerSensor = sf.getBoolean("fling", false); } return super.onPreferenceTreeClick(preferenceScreen, preference); } }