最近写了一个简单的朋友圈程序,包含了朋友圈的列表实现,视频的录制、预览与上传,图片可选择拍照或者从相册选取,从相册选取可以一次选择多张照片,并且限制照片的张数,想拥有真正属于自己的朋友圈吗?快来围观
width="680" height="200" align="center,center" id="iframeu2261530_0" src="http://pos.baidu.com/ucvm?sz=680x200&rdid=2261530&dc=2&di=u2261530&dri=0&dis=0&dai=2&ps=0x0&coa=at%3D3%26rsi0%3D680%26rsi1%3D200%26pat%3D6%26tn%3DbaiduCustNativeAD%26rss1%3D%2523FFFFFF%26conBW%3D1%26adp%3D1%26ptt%3D0%26titFF%3D%2525E5%2525BE%2525AE%2525E8%2525BD%2525AF%2525E9%25259B%252585%2525E9%2525BB%252591%26titFS%3D14%26rss2%3D%2523000000%26titSU%3D0%26ptbg%3D90%26piw%3D0%26pih%3D0%26ptp%3D0&dcb=BAIDU_SSP_define&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1472836520219&ti=%E6%88%91%E4%B9%9F%E6%9C%89%E5%BE%AE%E4%BF%A1%E6%9C%8B%E5%8F%8B%E5%9C%88%E4%BA%86%20Android%E5%AE%9E%E7%8E%B0_MsSql_%E8%84%9A%E6%9C%AC%E4%B9%8B%E5%AE%B6&ari=2&dbv=2&drs=1&pcs=1268x602&pss=1268x19041&cfv=22&cpl=1&chi=1&cce=true&cec=gb2312&tlm=1466098396&rw=602&ltu=http%3A%2F%2Fwww.jb51.net%2Farticle%2F84073.htm&ltr=https%3A%2F%2Fwww.sogou.com%2Flink%3Furl%3DDSOYnZeCC_rk3y35VO6jB4g2sCglv2gn8sE6BG02MDScbhuZ6JGlRQ..%26query%3Dandroid%25E5%25AE%259E%25E7%258E%25B0%25E6%259C%258B%25E5%258F%258B%25E5%259C%2588&ecd=1&psr=1280x720&par=1280x680&pis=-1x-1&ccd=24&cja=true&cmi=2&col=zh-CN&cdo=-1&tcn=1472836520&qn=5bf64cc3f97b5291&tt=1472836520124.148.176.177" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" vspace="0" hspace="0" style="border:0; vertical-align:bottom;margin:0;" allowtransparency="true">

本文实例分享了一个简单的朋友圈程序,包含了朋友圈的列表实现,视频的录制、预览与上传,图片可选择拍照,供大家参考,具体内容如下

frameborder="0" scrolling="no" vspace="0" hspace="0" style="position:static;display:block;padding:0;margin:0;border:none;vertical-align:baseline;width: 100%; height: 112px;" allowtransparency="true">

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);
   }

frameborder="0" scrolling="no" vspace="0" hspace="0" style="position:static;display:block;padding:0;margin:0;border:none;vertical-align:baseline;width: 100%; height: 112px;" allowtransparency="true">

多图片选择实现代码

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软件编程有所帮助。

我也有微信朋友圈了 Android实现相关推荐

  1. APP分享多张图片和文字到微信朋友圈(android 7.0以上适配)

    1.微信平台没有提供分享多张图片的SDK,我们只能自己调用系统自带的分享功能实现. 2.实际分享的时候因为是调用系统本地的分享功能,所以分享的图片也就必须要存到本地,不然就会提示获取资源失败而导致分享 ...

  2. android微信朋友圈开发,Android微信、朋友圈分享

    [实例简介] Android调用微信包实现微信.朋友圈分享.并能够获取分享的结果.收到毁掉消息 [实例截图] [核心代码] WeChatShare └── TestWXShare ├── Androi ...

  3. android 微信朋友圈头像,android 实现类似微信缓存和即时更新好友头像

    引言 使用微信时我们会发现,首次进入微信的好友列表时,会加载好友头像,但是再次进入时,就不用重新加载了,而且其他页面都不用重新加载,说明微信的好友头像是缓存在本地的,然后好友修改头像后,又会及时的更新 ...

  4. Android 仿微信朋友圈添加图片

    github地址(欢迎下载Demo) https://github.com/zhouxu88/WXCircleAddPic 老习惯,先上图,着急用的朋友,直接带走Demo,先拿来用吧,毕竟老板催的紧, ...

  5. android 仿微信朋友圈 评论,2020年android 仿微信朋友圈 评论

    2020年android 仿微信朋友圈 评论 1.如果有人问我:那些艰难的岁月你是怎么熬过来的?我想我只有一句话回答:我有一种强大的精神力量支撑着我,这种力量名字叫"想死又不敢" ...

  6. android类似QQ空间,微信朋友圈,微博主页源码

    2019独角兽企业重金招聘Python工程师标准>>> 类似QQ空间,微信朋友圈,微博主页等,展示图片的九宫格控件,自动根据图片的数量确定图片大小和控件大小,使用Adapter模式设 ...

  7. 打造Android微信朋友圈下拉刷新控件

    打造Android微信朋友圈下拉刷新控件> 转载于:https://www.cnblogs.com/zhujiabin/p/5707789.html

  8. Android仿微信朋友圈7实现点赞功能

    前言: 之前一直有朋友问我点赞怎么实现?今天趁着休息时间整理出来,其实点赞的功能和用户评论差不多,都是显示一个用户列表,只不过评论有评论内容和回复评论功能.实现点赞的思路如下: 1.当用户点击点赞按钮 ...

  9. Android自定义弹窗模仿微信,Android 仿微信朋友圈点赞和评论弹出框功能

    本文简单模仿微信朋友圈的点赞和评论弹出框,布局等细节请忽略,着重实现弹出框.发评论,及弹出位置的控制. 1. 微信弹出框 微信朋友圈的点赞和评论功能,有2个组成部分: 点击左下角的"更多&q ...

最新文章

  1. 如何用Python实现iPhone X的人脸解锁功能?
  2. C#机房重构-datagridview控件的使用
  3. output怎么用_性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库
  4. Yii2.0 rules常用验证规则
  5. sql中的遇到的有问题的
  6. CodeForces - 627A
  7. 弹出无边框网页的Javscrpt代码
  8. javascript之调度:setTimeout 和 setInterval
  9. 如何利用docker 构建golang线上部署环境
  10. 了解SQL Server事务日志备份和完整备份的日志序列号
  11. java世博会_世博会申请由xcode修改
  12. Path.Combine 合并两个路径字符串,会出现的问题
  13. 服务器的ftp数据库信息,服务器ftp及数据库账号
  14. 化妆品行业组合解决方案
  15. J2EE的体系架构——J2EE
  16. js页面跳转并传值的常用方法
  17. 【转载】怎样编写CSS?
  18. SEO大神: 百度快速SEO之网站标题怎么取
  19. SAP770系统FI模块配置(配置会计科目表)
  20. 前端入门 1| HTML基本结构

热门文章

  1. LightningChart-3D图表特性
  2. win7下matlab 中安装 matconvnet
  3. 调试Basler相机遇到的绿屏显示问题解决方法
  4. 易语言对接免签码支付
  5. 进PE系统后看不到硬盘的原因及解决办法
  6. HDU 1252 : Hike on a Graph-
  7. 51单片机 LED 灯程序
  8. 我的共享软件开发日志
  9. ios之Xcode 快捷键大全/使开发更高效
  10. 【逗老师的小技巧】win10 l2tp ipsec 无法连接解决方案