1 import java.text.SimpleDateFormat;
2 import java.util.Date;
3 import android.app.Activity;
4 import android.app.LoaderManager.LoaderCallbacks;
5 import android.content.BroadcastReceiver;
6 import android.content.Context;
7 import android.content.CursorLoader;
8 import android.content.Intent;
9 import android.content.IntentFilter;
10 import android.content.Loader;
11 import android.database.Cursor;
12 import android.net.Uri;
13 import android.os.Bundle;
14 import android.provider.MediaStore;
15 import android.support.v4.content.LocalBroadcastManager;
16 import android.util.Log;
17 import android.view.View;
18 import android.widget.AdapterView;
19 import android.widget.AdapterView.OnItemClickListener;
20 import android.widget.Button;
21 import android.widget.ListView;
22 import android.widget.SeekBar;
23 import android.widget.SimpleCursorAdapter;
24 import android.widget.TextView;
25
26 public class MainActivity extends Activity {
27
28 private Button stopBtn, playBtn;
29 private boolean isPlaying=false;
30
31 private Intent playerIntent; //播放服务组件的意图对象
32
33 private SeekBar seekBar; //可拖动的进度控件,用于显示播放的进度
34
35 private PrgReceiver prgReceiver;
36
37 private LocalBroadcastManager lbMgr;
38
39 private TextView msgTv; //格式化显示当前播放的时间与总时间
40
41 private Uri mp3Uri=MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; //获取扩展卡下的所有的音频文件接口
42 private String[] columns={MediaStore.Audio.Media._ID,
43 MediaStore.Audio.Media.DISPLAY_NAME, //文件名
44 MediaStore.Audio.Media.DATA,//文件路径
45 MediaStore.Audio.Media.DURATION}; //总时长
46 private ListView listView;
47 private SimpleCursorAdapter adapter;
48
49 @Override
50 protected void onCreate(Bundle savedInstanceState) {
51 super.onCreate(savedInstanceState);
52 setContentView(R.layout.activity_main);
53
54 playBtn = (Button) findViewById(R.id.btn1Id);
55 stopBtn = (Button) findViewById(R.id.btn2Id);
56
57 seekBar=(SeekBar) findViewById(R.id.seekBarId);
58 msgTv=(TextView) findViewById(R.id.msgId);
59
60 playerIntent=new Intent(getApplicationContext(),PlayerService.class);
61
62 lbMgr=LocalBroadcastManager.getInstance(getApplicationContext());
63
64 prgReceiver=new PrgReceiver();
65 lbMgr.registerReceiver(prgReceiver, new IntentFilter(Config.ACTION_PROGRESS));
66
67 event();
68
69 initMp3List(); //初始显示mp3列表相关的控件
70 }
71
72
73 private SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");
74 private void initMp3List() {
75 // TODO Auto-generated method stub
76 listView=(ListView) findViewById(R.id.listViewId);
77 adapter=new SimpleCursorAdapter(getApplicationContext()
78 ,R.layout.item_audio,null,
79 new String[]{columns[1],columns[3],columns[2]},
80 new int[]{R.id.nameId,R.id.timeId,R.id.pathId},
81 SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER){
82
83 @Override
84 public void setViewText(TextView v, String text) {//设置文本控件内容的方法
85 super.setViewText(v, text);
86
87 Log.i("info", "text:"+text);
88 if(v.getId()==R.id.timeId){
89 long time=Long.parseLong(text);
90 v.setText(sdf.format(new Date(time)));
91 }
92 }
93 };
94
95
96
97 listView.setAdapter(adapter);
98
99 //初始化启动Loader,加载扩展卡下所有音频文件
100 getLoaderManager().initLoader(1, null, new LoaderCallbacks<Cursor>() {
101
102 @Override
103 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
104
105 return new CursorLoader(getApplicationContext(),mp3Uri,columns,null,null,null);
106 }
107
108 @Override
109 public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
110 adapter.swapCursor(data);//适配器切换数据源
111 }
112
113 @Override
114 public void onLoaderReset(Loader<Cursor> loader) {
115 // TODO Auto-generated method stub
116
117 }
118 });
119
120 //设置ListView中item的点击事件
121 listView.setOnItemClickListener(new OnItemClickListener() {
122 @Override
123 public void onItemClick(AdapterView<?> parent, View view,
124 int position, long id) {
125 // TODO 点击某一文件的item事件,获取文件名和文件的路径
126 Cursor cursor=adapter.getCursor();
127 cursor.moveToPosition(position);
128
129 String name=cursor.getString(1);//获取第2列的信息,即文件名
130 String path=cursor.getString(2);//获取第3列的信息,即文件路径
131
132 Log.i("info", name+","+path);
133
134 playerIntent.putExtra(Config.EXTRA_CHANGE, true);
135 playerIntent.putExtra(Config.EXTRA_PATH, path);
136
137 startService(playerIntent);
138
139 playBtn.setText("暂停");
140
141 }
142 });
143
144 }
145
146 private void event() {
147 // TODO Auto-generated method stub
148 seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
149
150 @Override
151 public void onStopTrackingTouch(SeekBar seekBar) {
152 // TODO 拖动结束时的方法
153 //获取当前拖动的位置
154 int seekPosition=seekBar.getProgress();
155
156 //向播放组件组件发送广播
157 Intent intent=new Intent(Config.ACTION_SEEKTO);
158 intent.putExtra(Config.EXTRA_PROGREES_CUR, seekPosition);
159
160 lbMgr.sendBroadcast(intent);//发送广播(在Service组件内接收)
161 }
162
163 @Override
164 public void onStartTrackingTouch(SeekBar seekBar) {
165 // TODO Auto-generated method stub
166
167 }
168
169 @Override
170 public void onProgressChanged(SeekBar seekBar, int progress,
171 boolean fromUser) {
172 // TODO Auto-generated method stub
173
174 }
175 });
176 }
177
178 public void play(View v) { //播放或暂停
179
180 playerIntent.putExtra(Config.EXTRA_CHANGE, false);
181 startService(playerIntent);
182
183 isPlaying=!isPlaying;
184
185 if(isPlaying){
186 playBtn.setText("暂停");
187 }else{
188 playBtn.setText("播放");
189 }
190 }
191
192 public void stop(View v) { //停止
193 stopService(playerIntent);
194 seekBar.setProgress(0);
195 msgTv.setText("00:00/00:00");//=------------------------
196
197 playBtn.setText("播放");
198
199 }
200
201 @Override
202 protected void onDestroy() {
203 super.onDestroy();
204
205 lbMgr.unregisterReceiver(prgReceiver);//取消注册本地广播接收器
206 }
207
208 private String formatTime(int s){
209 StringBuilder builder=new StringBuilder();
210
211 int m=s/60; //获取分钟
212 s=s%60; //获取秒数
213
214 builder.append(m/10).append(m%10)
215 .append(":")
216 .append(s/10).append(s%10);
217
218 return builder.toString();
219 }
220
221 class PrgReceiver extends BroadcastReceiver{
222 @Override
223 public void onReceive(Context context, Intent intent) {
224 // TODO 接收播放服务组件中发送的进度广播
225 int max=intent.getIntExtra(Config.EXTRA_PROGREES_MAX,0);
226 int cur=intent.getIntExtra(Config.EXTRA_PROGREES_CUR,0);
227
228 seekBar.setMax(max);
229 seekBar.setProgress(cur);
230
231 msgTv.setText(formatTime(cur/1000)+"/"+formatTime(max/1000));
232 }
233 }
234
235 }
MainActivity.java
1 import java.text.SimpleDateFormat;
2 import java.util.Date;
3 import android.app.Activity;
4 import android.app.LoaderManager.LoaderCallbacks;
5 import android.content.BroadcastReceiver;
6 import android.content.Context;
7 import android.content.CursorLoader;
8 import android.content.Intent;
9 import android.content.IntentFilter;
10 import android.content.Loader;
11 import android.database.Cursor;
12 import android.net.Uri;
13 import android.os.Bundle;
14 import android.provider.MediaStore;
15 import android.support.v4.content.LocalBroadcastManager;
16 import android.util.Log;
17 import android.view.View;
18 import android.widget.AdapterView;
19 import android.widget.AdapterView.OnItemClickListener;
20 import android.widget.Button;
21 import android.widget.ListView;
22 import android.widget.SeekBar;
23 import android.widget.SimpleCursorAdapter;
24 import android.widget.TextView;
25
26 public class MainActivity extends Activity {
27
28 private Button stopBtn, playBtn;
29 private boolean isPlaying=false;
30
31 private Intent playerIntent; //播放服务组件的意图对象
32
33 private SeekBar seekBar; //可拖动的进度控件,用于显示播放的进度
34
35 private PrgReceiver prgReceiver;
36
37 private LocalBroadcastManager lbMgr;
38
39 private TextView msgTv; //格式化显示当前播放的时间与总时间
40
41 private Uri mp3Uri=MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; //获取扩展卡下的所有的音频文件接口
42 private String[] columns={MediaStore.Audio.Media._ID,
43 MediaStore.Audio.Media.DISPLAY_NAME, //文件名
44 MediaStore.Audio.Media.DATA,//文件路径
45 MediaStore.Audio.Media.DURATION}; //总时长
46 private ListView listView;
47 private SimpleCursorAdapter adapter;
48
49 @Override
50 protected void onCreate(Bundle savedInstanceState) {
51 super.onCreate(savedInstanceState);
52 setContentView(R.layout.activity_main);
53
54 playBtn = (Button) findViewById(R.id.btn1Id);
55 stopBtn = (Button) findViewById(R.id.btn2Id);
56
57 seekBar=(SeekBar) findViewById(R.id.seekBarId);
58 msgTv=(TextView) findViewById(R.id.msgId);
59
60 playerIntent=new Intent(getApplicationContext(),PlayerService.class);
61
62 lbMgr=LocalBroadcastManager.getInstance(getApplicationContext());
63
64 prgReceiver=new PrgReceiver();
65 lbMgr.registerReceiver(prgReceiver, new IntentFilter(Config.ACTION_PROGRESS));
66
67 event();
68
69 initMp3List(); //初始显示mp3列表相关的控件
70 }
71
72
73 private SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");
74 private void initMp3List() {
75 // TODO Auto-generated method stub
76 listView=(ListView) findViewById(R.id.listViewId);
77 adapter=new SimpleCursorAdapter(getApplicationContext()
78 ,R.layout.item_audio,null,
79 new String[]{columns[1],columns[3],columns[2]},
80 new int[]{R.id.nameId,R.id.timeId,R.id.pathId},
81 SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER){
82
83 @Override
84 public void setViewText(TextView v, String text) {//设置文本控件内容的方法
85 super.setViewText(v, text);
86
87 Log.i("info", "text:"+text);
88 if(v.getId()==R.id.timeId){
89 long time=Long.parseLong(text);
90 v.setText(sdf.format(new Date(time)));
91 }
92 }
93 };
94
95
96
97 listView.setAdapter(adapter);
98
99 //初始化启动Loader,加载扩展卡下所有音频文件
100 getLoaderManager().initLoader(1, null, new LoaderCallbacks<Cursor>() {
101
102 @Override
103 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
104
105 return new CursorLoader(getApplicationContext(),mp3Uri,columns,null,null,null);
106 }
107
108 @Override
109 public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
110 adapter.swapCursor(data);//适配器切换数据源
111 }
112
113 @Override
114 public void onLoaderReset(Loader<Cursor> loader) {
115 // TODO Auto-generated method stub
116
117 }
118 });
119
120 //设置ListView中item的点击事件
121 listView.setOnItemClickListener(new OnItemClickListener() {
122 @Override
123 public void onItemClick(AdapterView<?> parent, View view,
124 int position, long id) {
125 // TODO 点击某一文件的item事件,获取文件名和文件的路径
126 Cursor cursor=adapter.getCursor();
127 cursor.moveToPosition(position);
128
129 String name=cursor.getString(1);//获取第2列的信息,即文件名
130 String path=cursor.getString(2);//获取第3列的信息,即文件路径
131
132 Log.i("info", name+","+path);
133
134 playerIntent.putExtra(Config.EXTRA_CHANGE, true);
135 playerIntent.putExtra(Config.EXTRA_PATH, path);
136
137 startService(playerIntent);
138
139 playBtn.setText("暂停");
140
141 }
142 });
143
144 }
145
146 private void event() {
147 // TODO Auto-generated method stub
148 seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
149
150 @Override
151 public void onStopTrackingTouch(SeekBar seekBar) {
152 // TODO 拖动结束时的方法
153 //获取当前拖动的位置
154 int seekPosition=seekBar.getProgress();
155
156 //向播放组件组件发送广播
157 Intent intent=new Intent(Config.ACTION_SEEKTO);
158 intent.putExtra(Config.EXTRA_PROGREES_CUR, seekPosition);
159
160 lbMgr.sendBroadcast(intent);//发送广播(在Service组件内接收)
161 }
162
163 @Override
164 public void onStartTrackingTouch(SeekBar seekBar) {
165 // TODO Auto-generated method stub
166
167 }
168
169 @Override
170 public void onProgressChanged(SeekBar seekBar, int progress,
171 boolean fromUser) {
172 // TODO Auto-generated method stub
173
174 }
175 });
176 }
177
178 public void play(View v) { //播放或暂停
179
180 playerIntent.putExtra(Config.EXTRA_CHANGE, false);
181 startService(playerIntent);
182
183 isPlaying=!isPlaying;
184
185 if(isPlaying){
186 playBtn.setText("暂停");
187 }else{
188 playBtn.setText("播放");
189 }
190 }
191
192 public void stop(View v) { //停止
193 stopService(playerIntent);
194 seekBar.setProgress(0);
195 msgTv.setText("00:00/00:00");//=------------------------
196
197 playBtn.setText("播放");
198
199 }
200
201 @Override
202 protected void onDestroy() {
203 super.onDestroy();
204
205 lbMgr.unregisterReceiver(prgReceiver);//取消注册本地广播接收器
206 }
207
208 private String formatTime(int s){
209 StringBuilder builder=new StringBuilder();
210
211 int m=s/60; //获取分钟
212 s=s%60; //获取秒数
213
214 builder.append(m/10).append(m%10)
215 .append(":")
216 .append(s/10).append(s%10);
217
218 return builder.toString();
219 }
220
221 class PrgReceiver extends BroadcastReceiver{
222 @Override
223 public void onReceive(Context context, Intent intent) {
224 // TODO 接收播放服务组件中发送的进度广播
225 int max=intent.getIntExtra(Config.EXTRA_PROGREES_MAX,0);
226 int cur=intent.getIntExtra(Config.EXTRA_PROGREES_CUR,0);
227
228 seekBar.setMax(max);
229 seekBar.setProgress(cur);
230
231 msgTv.setText(formatTime(cur/1000)+"/"+formatTime(max/1000));
232 }
233 }
234
235 }
PlayerService.java