本文實例分享了一個簡單的朋友圈程序,包含了朋友圈的列表實現,視頻的錄制、預覽與上傳,圖片可選擇拍照,供大家參考,具體內容如下
FriendsListActivity 代碼如下
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
|
public class FriendsListActivity extends BaseActivity implements OnRefreshListener<ListView>, PostListener { private InteractionAdapter mAdapter; private PullToRefreshListView mRefreshListView; private View mFooter; private Context mContext; private Button btnToPost; protected int mPage = 0 ; private boolean isRefreshing = false ; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super .onCreate(savedInstanceState); setContentView(R.layout.friends_list); mContext=getApplicationContext(); mAdapter = new InteractionAdapter(mContext); mAdapter.setListener( this ); btnToPost=(Button) findViewById(R.id.btn_topost); mRefreshListView = (PullToRefreshListView) findViewById(R.id.friends_list); FriendsApi.getFriendsList(mContext, mCallBack); mRefreshListView.setOnRefreshListener( this ); mFooter = LayoutInflater.from(mContext).inflate(R.layout.loading_footer, null ); // mRefreshListView.getRefreshableView().addFooterView(mFooter); mRefreshListView.setAdapter(mAdapter); // mRefreshListView.setOnLastItemVisibleListener(mLastListener); // mRefreshListView.getRefreshableView().setDividerHeight(40); btnToPost.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { myPosts(); } }); } protected void myPosts() { new AlertDialog.Builder( this ).setItems( new String[]{ "圖片" , "視頻" , "文字" }, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent= new Intent(); switch (which) { case 0 : intent.setClass(FriendsListActivity. this , CreatePostActivity. class ); break ; case 1 : intent.setClass(FriendsListActivity. this , RecorderActivity. class ); break ; case 2 : intent.setClass(FriendsListActivity. this , RecorderActivity. class ); break ; default : break ; } startActivity(intent); } }).show(); } /** * 查看更多操作 */ @Override public void show(Interaction interaction) { } @Override public void delete(Interaction interaction) { // TODO Auto-generated method stub } @Override public void onRefresh(PullToRefreshBase<ListView> refreshView) { if (!isRefreshing) { isRefreshing = true ; mPage = 0 ; FriendsApi.getFriendsList(mContext, mCallBack); } } protected NetCallBack mCallBack = new NetCallBack() { public void friendslist(ArrayList<Interaction> friends) { Log.i( "friends size>>>>" ,friends.size()+ "-------------" ); mAdapter.setInteractions(friends); // mRefreshListView.getLoadingLayoutProxy().setLastUpdatedLabel(null); mRefreshListView.onRefreshComplete(); isRefreshing = false ; dismissLoading(); }; public void start() { showLoading(); }; public void failed(String message) { loadFailed(); }; }; @Override public void play(Interaction interaction) { Intent mIntent= new Intent(); mIntent.setClass(FriendsListActivity. this , RecorderPlayActivity. class ); Bundle data = new Bundle(); data.putString( "path" , interaction.videoPath); mIntent.putExtras(data); startActivity(mIntent); } } |
布局文件 friends_list.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<? xml version = "1.0" encoding = "utf-8" ?> < RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "match_parent" android:layout_height = "match_parent" android:background = "@color/backgroud_color" > < include android:id = "@+id/list_title" android:layout_alignParentTop = "true" layout = "@layout/list_title" /> < com.yzl.xyb.friends.refresh.view.PullToRefreshListView xmlns:app = "http://schemas.android.com/apk/res-auto" android:id = "@+id/friends_list" android:layout_width = "match_parent" android:layout_height = "match_parent" android:layout_margin = "@dimen/padding_left" android:divider = "@android:color/transparent" android:layout_below = "@+id/list_title" app:ptrOverScroll = "false" app:ptrHeaderTextColor = "#ff666666" app:ptrHeaderTextAppearance = "@android:style/TextAppearance.Small" app:ptrShowIndicator = "false" /> < include layout = "@layout/loading" /> </ RelativeLayout > |
適配器 InteractionAdapter 對朋友圈列表進行數據填充
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
|
public class InteractionAdapter extends BaseAdapter implements OnClickListener { private ArrayList<Interaction> interactions; private Context mContext; private FinalBitmap mFinal; private BitmapDisplayConfig config; private BitmapDisplayConfig imageConfig; private PostListener listener; public InteractionAdapter(Context context) { mContext = context; mFinal = FinalBitmap.create(mContext); Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.user_avatar); config = new BitmapDisplayConfig(); config.setAnimationType(BitmapDisplayConfig.AnimationType.fadeIn); config.setLoadfailBitmap(bitmap); config.setLoadfailBitmap(bitmap); bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.image_failed); imageConfig = new BitmapDisplayConfig(); imageConfig.setAnimationType(BitmapDisplayConfig.AnimationType.fadeIn); imageConfig.setLoadfailBitmap(bitmap); imageConfig.setLoadfailBitmap(bitmap); } public void setListener(PostListener listener) { this .listener = listener; } public void setInteractions(ArrayList<Interaction> interactions) { this .interactions = interactions; notifyDataSetChanged(); } @Override public int getCount() { // TODO Auto-generated method stub return interactions == null ? 0 : interactions.size(); } @Override public Object getItem( int position) { // TODO Auto-generated method stub return interactions.get(position); } @Override public long getItemId( int position) { // TODO Auto-generated method stub return position; } @Override public View getView( int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder holder = null ; if (convertView == null ) { convertView = LayoutInflater.from(mContext).inflate(R.layout.friend_list_item, null ); holder = new ViewHolder(); holder.avatar = (CircleImageView) convertView.findViewById(R.id.avatar); holder.content = (TextView) convertView.findViewById(R.id.content); holder.title = (TextView) convertView.findViewById(R.id.title); holder.subtitle = (TextView) convertView.findViewById(R.id.subtitle); holder.image = convertView.findViewById(R.id.image_layout); holder.image0 = (ImageView) convertView.findViewById(R.id.image0); holder.image1 = (ImageView) convertView.findViewById(R.id.image1); holder.image2 = (ImageView) convertView.findViewById(R.id.image2); holder.conments = (TextView) convertView.findViewById(R.id.conment_count); holder.praises = (TextView) convertView.findViewById(R.id.parise_count); holder.praised = (ImageView) convertView.findViewById(R.id.praise_icon); holder.more = (TextView) convertView.findViewById(R.id.more); holder.viewLayout=(LinearLayout) convertView.findViewById(R.id.view_layout); holder.surfaceView=(SurfaceView) convertView.findViewById(R.id.surface_view_result); holder.playButton=(ImageButton) convertView.findViewById(R.id.btn_play_result); holder.audioLayout=(FrameLayout) convertView.findViewById(R.id.audio_layout); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } Interaction interaction = interactions.get(position); if (TextUtils.isEmpty(interaction.avatar)) { holder.avatar.setImageBitmap(config.getLoadfailBitmap()); } else { mFinal.display(holder.avatar, interaction.avatar, config); } holder.title.setText(interaction.name); holder.subtitle.setText(interaction.subtitle); holder.content.setText(interaction.content); holder.conments.setText(String.valueOf(interaction.commentCount)); holder.praises.setText(String.valueOf(interaction.praiseCount)); int images = interaction.images == null ? 0 : interaction.images.size(); if (images > 0 ) { holder.image.setVisibility(View.VISIBLE); holder.audioLayout.setVisibility(View.GONE); holder.image.setOnClickListener( this ); holder.image.setTag(interaction); if (images <= 1 ) { mFinal.display(holder.image0, interaction.images.get( 0 ), imageConfig); holder.image1.setImageBitmap( null ); holder.image2.setImageBitmap( null ); } else if (images <= 2 ) { mFinal.display(holder.image0, interaction.images.get( 0 ), imageConfig); mFinal.display(holder.image1, interaction.images.get( 1 ), imageConfig); holder.image2.setImageBitmap( null ); } else { mFinal.display(holder.image0, interaction.images.get( 0 ), imageConfig); mFinal.display(holder.image1, interaction.images.get( 1 ), imageConfig); mFinal.display(holder.image2, interaction.images.get( 2 ), imageConfig); } } else if (interaction.videoPath!= null ) { holder.image.setVisibility(View.GONE); holder.playButton.setBackgroundResource(R.drawable.play1pressed); holder.audioLayout.setVisibility(View.VISIBLE); holder.playButton.setTag(interaction); holder.playButton.setOnClickListener( this ); holder.surfaceView.setTag(interaction); holder.surfaceView.setOnClickListener( this ); } else { holder.viewLayout.setVisibility(View.GONE); } holder.more.setTag(interaction); holder.more.setOnClickListener( this ); return convertView; } private class ViewHolder { CircleImageView avatar; TextView title; TextView subtitle; TextView content; View image; ImageView image0; ImageView image1; ImageView image2; TextView conments; TextView praises; ImageView praised; View delete; TextView more; SurfaceView surfaceView; ImageButton playButton; FrameLayout audioLayout; LinearLayout viewLayout; } @Override public void onClick(View v) { int id = v.getId(); if (id == R.id.btn_play_result) { Interaction interaction = (Interaction) v.getTag(); } else if (id == R.id.surface_view_result) { if ( this .listener != null ) { this .listener.play((Interaction) v.getTag()); } } else if (id == R.id.more) { if ( this .listener != null ) { this .listener.show((Interaction) v.getTag()); } } else if (id == R.id.image_layout) { Intent intent = new Intent(mContext, MainActivity. class ); Bundle data = new Bundle(); Interaction interaction = (Interaction) v.getTag(); data.putStringArrayList( "images" , interaction.images); intent.putExtras(data); mContext.startActivity(intent); } } public interface PostListener { void show(Interaction interaction); void delete(Interaction interaction); void play(Interaction interaction); } |
多圖片選擇實現代碼
MultipleActivity
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
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
|
package com.yzl.xyb.friends; import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.provider.MediaStore; import android.util.DisplayMetrics; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.view.WindowManager; import android.widget.GridView; import android.widget.PopupWindow.OnDismissListener; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.yzl.xyb.friends.adapter.MyAdapter; import com.yzl.xyb.friends.adapter.MyAdapter.SetCountListener; import com.yzl.xyb.friends.picture.ListImageDirPopupWindow; import com.yzl.xyb.friends.picture.ListImageDirPopupWindow.OnImageDirSelected; import com.yzl.xyb.friends.util.ImageFloder; /** * 從相冊選取圖片 * 可以選擇多張,最多可選9張 * 獲取所有相冊 * 確定:返回已選圖片的路徑 * @author hou * */ public class MultipleActivity extends Activity implements OnImageDirSelected, SetCountListener{ private TextView selectCount; private TextView selectPicture; private TextView mChooseDir; private ProgressDialog mProgressDialog; public static final int KITKAT_LESS = 2 ; /** * 存儲文件夾中的圖片數量 */ private int mPicsSize; /** * 圖片數量最多的文件夾 */ private File mImgDir; /** * 所有的圖片 */ private List<String> mImgs; private ArrayList<String> pictures; private GridView mGirdView; private MyAdapter mAdapter; /** * 臨時的輔助類,用于防止同一個文件夾的多次掃描 */ private HashSet<String> mDirPaths = new HashSet<String>(); /** * 掃描拿到所有的圖片文件夾 */ private List<ImageFloder> mImageFloders = new ArrayList<ImageFloder>(); private RelativeLayout mBottomLy; int totalCount = 0 ; private int mScreenHeight; private ListImageDirPopupWindow mListImageDirPopupWindow; private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { mProgressDialog.dismiss(); // 為View綁定數據 data2View(); // 初始化展示文件夾的popupWindw initListDirPopupWindw(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.picture_selector); getIntent().getExtras(); DisplayMetrics outMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(outMetrics); mScreenHeight = outMetrics.heightPixels; initView(); getImages(); initEvent(); } /** * 初始化View */ private void initView() { mGirdView = (GridView) findViewById(R.id.id_gridView); mChooseDir = (TextView) findViewById(R.id.id_choose_dir); selectCount = (TextView) findViewById(R.id.tv_select_count); // allPhotoAlum = (TextView) findViewById(R.id.tv_photoAlum); selectPicture= (TextView) findViewById(R.id.tv_sure); mBottomLy = (RelativeLayout) findViewById(R.id.id_bottom_ly); } private void initEvent() { /** * 為底部的布局設置點擊事件,彈出popupWindow */ mBottomLy.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { mListImageDirPopupWindow .setAnimationStyle(R.style.anim_popup_dir); mListImageDirPopupWindow.showAsDropDown(mBottomLy, 0 , 0 ); // 設置背景顏色變暗 WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.alpha = .3f; getWindow().setAttributes(lp); } }); selectPicture.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { pictures=mAdapter.getSelectPath(); Log.i( "選中的圖片1>>>>>>" ,pictures.size()+ "----------" ); Intent intent= new Intent(); // intent.setClass(MultipleActivity.this, CreatePostActivity.class); Bundle bundle= new Bundle(); bundle.putStringArrayList( "PICTURES" , pictures); intent.putExtras(bundle); // startActivityForResult(intent, KITKAT_LESS); setResult(KITKAT_LESS, intent); finish(); } }); } /** * 為View綁定數據 */ private void data2View() { if (mImgDir == null ) { Toast.makeText(getApplicationContext(), "擦,一張圖片沒掃描到" , Toast.LENGTH_SHORT).show(); return ; } mImgs = Arrays.asList(mImgDir.list()); /** * 可以看到文件夾的路徑和圖片的路徑分開保存,極大的減少了內存的消耗; */ mAdapter = new MyAdapter(getApplicationContext(), mImgs, R.layout.grid_item, mImgDir.getAbsolutePath()); mAdapter.setCountListener( this ); mGirdView.setAdapter(mAdapter); // allPictureCount.setText("共"+totalCount + "張"); }; /** * 初始化展示文件夾的popupWindw */ private void initListDirPopupWindw() { mListImageDirPopupWindow = new ListImageDirPopupWindow( LayoutParams.MATCH_PARENT, ( int ) (mScreenHeight * 1 ), mImageFloders, LayoutInflater.from(getApplicationContext()) .inflate(R.layout.list_dir, null )); mListImageDirPopupWindow.setOnDismissListener( new OnDismissListener() { @Override public void onDismiss() { // 設置背景顏色變暗 WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.alpha = 1 .0f; getWindow().setAttributes(lp); } }); // 設置選擇文件夾的回調 mListImageDirPopupWindow.setOnImageDirSelected( this ); } /** * 利用ContentProvider掃描手機中的圖片,此方法在運行在子線程中 完成圖片的掃描,最終獲得jpg最多的那個文件夾 */ private void getImages() { if (!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { Toast.makeText( this , "暫無外部存儲" , Toast.LENGTH_SHORT).show(); return ; } // 顯示進度條 mProgressDialog = ProgressDialog.show( this , null , "正在加載..." ); new Thread( new Runnable() { @Override public void run() { String firstImage = null ; Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; ContentResolver mContentResolver = MultipleActivity. this .getContentResolver(); // 只查詢jpeg和png的圖片 Cursor mCursor = mContentResolver.query(mImageUri, null , MediaStore.Images.Media.MIME_TYPE + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=?" , new String[] { "image/jpeg" , "image/png" }, MediaStore.Images.Media.DATE_MODIFIED); Log.e( "TAG" , mCursor.getCount() + "" ); while (mCursor.moveToNext()) { // 獲取圖片的路徑 String path = mCursor.getString(mCursor .getColumnIndex(MediaStore.Images.Media.DATA)); Log.e( "TAG" , path); // 拿到第一張圖片的路徑 if (firstImage == null ) firstImage = path; // 獲取該圖片的父路徑名 File parentFile = new File(path).getParentFile(); if (parentFile == null ) continue ; String dirPath = parentFile.getAbsolutePath(); ImageFloder imageFloder = null ; // 利用一個HashSet防止多次掃描同一個文件夾(不加這個判斷,圖片多起來還是相當恐怖的~~) if (mDirPaths.contains(dirPath)) { continue ; } else { mDirPaths.add(dirPath); // 初始化imageFloder imageFloder = new ImageFloder(); imageFloder.setDir(dirPath); imageFloder.setFirstImagePath(path); } int picSize = parentFile.list( new FilenameFilter() { @Override public boolean accept(File dir, String filename) { if (filename.endsWith( ".jpg" ) || filename.endsWith( ".png" ) || filename.endsWith( ".jpeg" )) return true ; return false ; } }).length; totalCount += picSize; imageFloder.setCount(picSize); mImageFloders.add(imageFloder); if (picSize > mPicsSize) { mPicsSize = picSize; mImgDir = parentFile; } } mCursor.close(); // 掃描完成,輔助的HashSet也就可以釋放內存了 mDirPaths = null ; // 通知Handler掃描圖片完成 mHandler.sendEmptyMessage( 0x110 ); } }).start(); } @Override public void selected(ImageFloder floder) { mImgDir = new File(floder.getDir()); mImgs = Arrays.asList(mImgDir.list( new FilenameFilter() { @Override public boolean accept(File dir, String filename) { if (filename.endsWith( ".jpg" ) || filename.endsWith( ".png" ) || filename.endsWith( ".jpeg" )) return true ; return false ; } })); /** * 可以看到文件夾的路徑和圖片的路徑分開保存,極大的減少了內存的消耗; */ mAdapter = new MyAdapter(getApplicationContext(), mImgs, R.layout.grid_item, mImgDir.getAbsolutePath()); mAdapter.setCountListener( this ); mGirdView.setAdapter(mAdapter); // mAdapter.notifyDataSetChanged(); // mImageCount.setText(floder.getCount() + "張"); mChooseDir.setText(floder.getName()); selectCount.setText( "/9" ); mListImageDirPopupWindow.dismiss(); } @Override public void doCount( int a) { selectCount.setText(a+ "/9" ); } } |
視頻的錄制與預覽
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
|
package com.yzl.xyb.friends; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.Toast; import com.yzl.xyb.friends.view.MovieRecorderView; import com.yzl.xyb.friends.view.MovieRecorderView.OnRecordFinishListener; /** * 錄制視頻 * @author hou * */ public class RecorderActivity extends Activity { private MovieRecorderView mRecorderView; private Button mShootBtn; private boolean isFinish = true ; private String userId = "" ; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super .onCreate(savedInstanceState); setContentView(R.layout.record_activity); // userId=getIntent().getParcelableExtra("userId"); mRecorderView = (MovieRecorderView) findViewById(R.id.movieRecorderView); mShootBtn = (Button) findViewById(R.id.shoot_button); mShootBtn.setOnTouchListener( new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { mRecorderView.record( new OnRecordFinishListener() { @Override public void onRecordFinish() { Log.i( "MotionEvent>>>" , "ACTION_DOWN" ); handler.sendEmptyMessage( 1 ); } }); } else if (event.getAction() == MotionEvent.ACTION_UP) { Log.i( "MotionEvent>>>" , "ACTION_UP" ); if (mRecorderView.getTimeCount() > 1 ) handler.sendEmptyMessage( 1 ); else { if (mRecorderView.getmVecordFile() != null ) mRecorderView.getmVecordFile().delete(); mRecorderView.stop(); Toast.makeText(RecorderActivity. this , "時間太短,錄制失敗" , Toast.LENGTH_SHORT).show(); } } return true ; } }); } @Override public void onResume() { super .onResume(); isFinish = true ; } @Override public void onSaveInstanceState(Bundle outState) { super .onSaveInstanceState(outState); isFinish = false ; mRecorderView.stop(); } @Override public void onPause() { super .onPause(); } @Override public void onDestroy() { super .onDestroy(); } @SuppressLint ( "HandlerLeak" ) private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { finishActivity(); Log.i( "isFinish>>>" ,isFinish+ "" ); } }; private void finishActivity() { if (isFinish) { mRecorderView.stop(); Intent intent = new Intent(RecorderActivity. this , TopicActivity. class ); Bundle mBundle = new Bundle(); mBundle.putString( "path" , mRecorderView.getmVecordFile().toString()); mBundle.putString( "userId" , userId); intent.putExtras(mBundle); startActivity(intent); } } public interface OnShootCompletionListener { public void OnShootSuccess(String path, int second); public void OnShootFailure(); } } |
視頻的預覽
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
|
package com.yzl.xyb.friends; import android.app.Activity; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; import android.widget.ImageView; public class RecorderPlayActivity extends Activity implements SurfaceHolder.Callback, OnClickListener { private ImageView ivBack; private ImageButton btnPlay; private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; private String path= null ; private MediaPlayer player; private boolean play= false ; @SuppressWarnings ( "deprecation" ) @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super .onCreate(savedInstanceState); setContentView(R.layout.recorder_play); ivBack=(ImageView) findViewById(R.id.iv_back); btnPlay=(ImageButton) findViewById(R.id.ib_play); surfaceView=(SurfaceView) findViewById(R.id.play_view); btnPlay.setBackground(getResources().getDrawable(R.drawable.play1pressed)); path= this .getIntent().getStringExtra( "path" ); System.out.println( "surface created>>>> path= " +path); surfaceHolder=surfaceView.getHolder(); surfaceHolder.addCallback( this ); surfaceHolder.setFixedSize( 320 , 220 ); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); System.out.println( "oncreate--------------" ); ivBack.setOnClickListener( this ); btnPlay.setOnClickListener( this ); surfaceView.setOnClickListener( this ); } @Override public void surfaceCreated(SurfaceHolder holder) { player= new MediaPlayer(); player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.setDisplay(surfaceHolder); try { System.out.println( "surface created>>>> path= " +path); player.setDataSource(path); player.prepare(); } catch (Exception e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } @Override public void onClick(View v) { switch (v.getId()) { case R.id.iv_back: this .finish(); break ; case R.id.ib_play: player.start(); btnPlay.setVisibility(View.GONE); break ; case R.id.play_view: player.pause(); /*if(play){ player.start(); }else { player.pause(); }*/ btnPlay.setVisibility(View.VISIBLE); break ; default : break ; } } @Override protected void onDestroy() { // TODO Auto-generated method stub super .onDestroy(); if (player.isPlaying()) { player.stop(); } player.release(); } } |
擁有一個屬于自己的朋友圈是不是很開新,可以和好朋友隨時隨地分享,是不是很開心!
以上就是本文的全部內容,希望對大家學習Android軟件編程有所幫助。