服务器之家

服务器之家 > 正文

我也有微信朋友圈了 Android实现

时间:2020-05-05 16:19     来源/作者:遗世孤独

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

我也有微信朋友圈了 Android实现

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

我也有微信朋友圈了 Android实现

多图片选择实现代码

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

我也有微信朋友圈了 Android实现

视频的录制与预览

 

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

标签:

相关文章

热门资讯

沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
返回顶部