记事本涉及到的仅仅是对string 的存储,而且在读取上并不存在什么难点,直接用textview显示便可以了。需要做的主要是使用sqlite对数据进行一个整理。
而录音笔需要考虑的就相对较多了:比如录音时中断,录音时用户点击播放按钮;未录音,用户点击停止按钮;在录音或者播放时关闭activity;listview的item中需要为button设置不同的点击效果等等。
为了便于新手学习,在此还是罗列一下涉及的主要知识点:
- 1、baseadapter
- 2、java的file
- 3、mediarecorder
- 4、较多的alertdialog
- 5、mediaplayer
遇到的问题:
在listview item中的button控件可以获得焦点时,直接为listview设置item长按事件的监听。出现了listview的item长按事件无效的情况。
解决方法:
直接在baseadapter中对该item的布局进行长按事件的监听(在笔者demo中是linearlayout),也就是说对item中button的父布局进行长按事件的监听。
效果:
mainactivity:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
|
package com.example.recorder; import android.app.activity; import android.app.alertdialog; import android.app.alertdialog.builder; import android.content.dialoginterface; import android.media.mediaplayer; import android.media.mediarecorder; import android.os.bundle; import android.os.environment; import android.view.layoutinflater; import android.view.view; import android.view.view.onclicklistener; import android.view.viewgroup; import android.widget.adapterview; import android.widget.baseadapter; import android.widget.button; import android.widget.edittext; import android.widget.linearlayout; import android.widget.listview; import android.widget.textview; import android.widget.toast; import java.io.file; import java.io.ioexception; public class mainactivity extends activity implements onclicklistener { private button start; private button stop; private listview listview; showrecorderadpter showrecord; // 录音文件播放 // 录音 // 音频文件保存地址 private mediaplayer myplayer; private mediarecorder myrecorder = null ; private string path; private file savefilepath; // 所录音的文件名 string[] listfile = null ; @override protected void oncreate(bundle savedinstancestate) { super .oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //初始化控件 initview(); } private void initview() { start = (button) findviewbyid(r.id.start); stop = (button) findviewbyid(r.id.stop); listview = (listview) findviewbyid(r.id.list); myplayer = new mediaplayer(); showrecord = new showrecorderadpter(); //如果手机有sd卡 if (environment.getexternalstoragestate().equals( environment.media_mounted)) { try { path = environment.getexternalstoragedirectory() .getcanonicalpath().tostring() + "/myrecorders" ; file files = new file(path); if (!files.exists()) { //如果有没有文件夹就创建文件夹 files.mkdir(); } listfile = files.list(); } catch (ioexception e) { e.printstacktrace(); } } start.setonclicklistener( this ); stop.setonclicklistener( this ); listview.setadapter(showrecord); } //由于在item中涉及到了控件的点击效果,所以采用baseadapter class showrecorderadpter extends baseadapter { @override public int getcount() { return listfile.length; } @override public object getitem( int arg0) { return arg0; } @override public long getitemid( int arg0) { return arg0; } @override public view getview( final int postion, view arg1, viewgroup arg2) { view views = layoutinflater.from(mainactivity. this ).inflate( r.layout.list_item, null ); linearlayout parent = (linearlayout) views.findviewbyid(r.id.list_parent); textview filename = (textview) views.findviewbyid(r.id.show_file_name); button plays = (button) views.findviewbyid(r.id.bt_list_play); button stop = (button) views.findviewbyid(r.id.bt_list_stop); //在textview中显示的时候把“.amr”去掉 filename.settext(listfile[postion].substring( 0 , listfile[postion].length() - 4 )); parent.setonlongclicklistener( new view.onlongclicklistener() { @override public boolean onlongclick(view view) { alertdialog aler = new alertdialog.builder(mainactivity. this ) .settitle( "确定删除该录音?" ) .setpositivebutton( "确定" , new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog , int which) { file file = new file(path + "/" + listfile[postion]); file.delete(); // 在删除文件后刷新文件名列表 file files = new file(path); listfile = files.list(); // 当文件被删除刷新listview showrecord.notifydatasetchanged(); } }) .setnegativebutton( "取消" , null ) .create(); //设置不允许点击提示框之外的区域 aler.setcanceledontouchoutside( false ); aler.show(); return false ; } }); // 播放录音 plays.setonclicklistener( new onclicklistener() { @override public void onclick(view arg0) { //确认不是在录音的过程中播放 if (myrecorder == null ) { try { myplayer.reset(); myplayer.setdatasource(path + "/" + listfile[postion]); if (!myplayer.isplaying()) { myplayer.prepare(); myplayer.start(); } else { myplayer.pause(); } } catch (ioexception e) { e.printstacktrace(); } } else { toast.maketext(mainactivity. this , "请不要再录音的过程中播放!" , toast.length_short).show(); } } }); // 停止播放 stop.setonclicklistener( new onclicklistener() { @override public void onclick(view arg0) { if (myrecorder == null && myplayer.isplaying()) { myplayer.stop(); } } }); return views; } } @override public void onclick(view v) { switch (v.getid()) { case r.id.start: final edittext filename = new edittext( this ); alertdialog aler = new builder( this ) .settitle( "请输入要保存的文件名" ) .setview(filename) .setpositivebutton( "确定" , new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { string text = filename.gettext().tostring(); //如果文件名为空则跳出提示信息 if (text.equals( "" )) { toast.maketext(mainactivity. this , "请不要输入空的文件名!" , toast.length_short).show(); } else { //开启录音 recorderstart(text); start.settext( "正在录音中。。" ); start.setenabled( false ); stop.setenabled( true ); // 在增添文件后刷新文件名列表 file files = new file(path); listfile = files.list(); // 当文件增加刷新listview showrecord.notifydatasetchanged(); } } }) .setnegativebutton( "取消" , null ) .create(); //设置不允许点击提示框之外的区域 aler.setcanceledontouchoutside( false ); aler.show(); break ; case r.id.stop: myrecorder.stop(); myrecorder.release(); myrecorder = null ; // 判断是否保存 如果不保存则删除 aler = new alertdialog.builder( this ) .settitle( "是否保存该录音" ) .setpositivebutton( "确定" , null ) .setnegativebutton( "取消" , new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { savefilepath.delete(); // 在删除文件后刷新文件名列表 file files = new file(path); listfile = files.list(); // 当文件被删除刷新listview showrecord.notifydatasetchanged(); } }).create(); //设置不允许点击提示框之外的区域 aler.setcanceledontouchoutside( false ); aler.show(); start.settext( "录音" ); start.setenabled( true ); stop.setenabled( false ); default : break ; } } private void recorderstart(string text) { try { myrecorder = new mediarecorder(); // 从麦克风源进行录音 myrecorder.setaudiosource(mediarecorder.audiosource. default ); // 设置输出格式 myrecorder.setoutputformat(mediarecorder.outputformat. default ); // 设置编码格式 myrecorder.setaudioencoder(mediarecorder.audioencoder. default ); string paths = path + "/" + text + ".amr" ; savefilepath = new file(paths); myrecorder.setoutputfile(savefilepath.getabsolutepath()); myrecorder.prepare(); // 开始录音 myrecorder.start(); } catch (exception e) { e.printstacktrace(); } } @override protected void ondestroy() { super .ondestroy(); // 如果myplayer正在播放,那么就停止播放,并且释放资源 if (myplayer.isplaying()) { myplayer.stop(); myplayer.release(); } //如果myrecorder有内容(代表正在录音),那么就直接释放资源 if (myrecorder!= null ) { myrecorder.release(); myplayer.release(); } } } |
activity_main:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
<linearlayout xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:tools= "http://schemas.android.com/tools" android:layout_width= "match_parent" android:layout_height= "match_parent" android:orientation= "vertical" tools:context= ".mainactivity" > <textview android:layout_width= "match_parent" android:layout_height= "wrap_content" android:background= "#000" android:padding= "13dp" android:text= "语音笔" android:textcolor= "#fff" android:textsize= "22sp" android:textstyle= "bold" /> <listview android:id= "@+id/list" android:layout_width= "match_parent" android:layout_height= "0dp" android:layout_weight= "1" android:padding= "10dp" ></listview> <linearlayout android:id= "@+id/li1" android:padding= "10dp" android:layout_width= "match_parent" android:layout_height= "wrap_content" android:orientation= "horizontal" > <button android:id= "@+id/start" android:layout_width= "0dp" android:layout_height= "wrap_content" android:layout_weight= "1" android:textsize= "20sp" android:text= "开始录音" /> <button android:id= "@+id/stop" android:layout_width= "0dp" android:layout_height= "wrap_content" android:layout_weight= "1" android:enabled= "false" android:textsize= "20sp" android:text= "停止录音" /> </linearlayout> </linearlayout> |
list_item:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<?xml version= "1.0" encoding= "utf-8" ?> <linearlayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "match_parent" android:padding= "10dp" android:id= "@+id/list_parent" android:orientation= "horizontal" > <textview android:id= "@+id/show_file_name" android:layout_width= "0dp" android:layout_weight= "1" android:layout_height= "wrap_content" android:text= "文件名" android:textcolor= "#000" android:textsize= "20sp" /> <button android:id= "@+id/bt_list_play" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:textsize= "18sp" android:text= "播放" /> <button android:id= "@+id/bt_list_stop" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:textsize= "18sp" android:text= "停止" /> </linearlayout> |
以上就是本文的全部内容,希望对大家实现android软件编程有所帮助。