当前位置:Gxlcms > mssql > 我也有微信朋友圈了Android实现

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

时间:2021-07-01 10:21:17 帮助过:53人阅读

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

FriendsListActivity  代码如下

  1. public class FriendsListActivity extends BaseActivity implements OnRefreshListener<ListView>, PostListener {
  2. private InteractionAdapter mAdapter;
  3. private PullToRefreshListView mRefreshListView;
  4. private View mFooter;
  5. private Context mContext;
  6. private Button btnToPost;
  7. protected int mPage = 0;
  8. private boolean isRefreshing = false;
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. // TODO Auto-generated method stub
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.friends_list);
  14. mContext=getApplicationContext();
  15. mAdapter = new InteractionAdapter(mContext);
  16. mAdapter.setListener(this);
  17. btnToPost=(Button) findViewById(R.id.btn_topost);
  18. mRefreshListView = (PullToRefreshListView) findViewById(R.id.friends_list);
  19. FriendsApi.getFriendsList(mContext, mCallBack);
  20. mRefreshListView.setOnRefreshListener(this);
  21. mFooter = LayoutInflater.from(mContext).inflate(R.layout.loading_footer, null);
  22. // mRefreshListView.getRefreshableView().addFooterView(mFooter);
  23. mRefreshListView.setAdapter(mAdapter);
  24. // mRefreshListView.setOnLastItemVisibleListener(mLastListener);
  25. // mRefreshListView.getRefreshableView().setDividerHeight(40);
  26. btnToPost.setOnClickListener(new OnClickListener() {
  27. @Override
  28. public void onClick(View v) {
  29. myPosts();
  30. }
  31. });
  32. }
  33. protected void myPosts() {
  34. new AlertDialog.Builder(this).setItems(new String[]{"图片","视频","文字"}, new DialogInterface.OnClickListener() {
  35. @Override
  36. public void onClick(DialogInterface dialog, int which) {
  37. Intent intent=new Intent();
  38. switch (which) {
  39. case 0:
  40. intent.setClass(FriendsListActivity.this, CreatePostActivity.class);
  41. break;
  42. case 1:
  43. intent.setClass(FriendsListActivity.this, RecorderActivity.class);
  44. break;
  45. case 2:
  46. intent.setClass(FriendsListActivity.this, RecorderActivity.class);
  47. break;
  48. default:
  49. break;
  50. }
  51. startActivity(intent);
  52. }
  53. }).show();
  54. }
  55. /**
  56. * 查看更多操作
  57. */
  58. @Override
  59. public void show(Interaction interaction) {
  60. }
  61. @Override
  62. public void delete(Interaction interaction) {
  63. // TODO Auto-generated method stub
  64. }
  65. @Override
  66. public void onRefresh(PullToRefreshBase<ListView> refreshView) {
  67. if (!isRefreshing) {
  68. isRefreshing = true;
  69. mPage = 0;
  70. FriendsApi.getFriendsList(mContext, mCallBack);
  71. }
  72. }
  73. protected NetCallBack mCallBack = new NetCallBack() {
  74. public void friendslist(ArrayList<Interaction> friends) {
  75. Log.i("friends size>>>>",friends.size()+"-------------");
  76. mAdapter.setInteractions(friends);
  77. // mRefreshListView.getLoadingLayoutProxy().setLastUpdatedLabel(null);
  78. mRefreshListView.onRefreshComplete();
  79. isRefreshing = false;
  80. dismissLoading();
  81. };
  82. public void start() {
  83. showLoading();
  84. };
  85. public void failed(String message) {
  86. loadFailed();
  87. };
  88. };
  89. @Override
  90. public void play(Interaction interaction) {
  91. Intent mIntent=new Intent();
  92. mIntent.setClass(FriendsListActivity.this, RecorderPlayActivity.class);
  93. Bundle data = new Bundle();
  94. data.putString("path", interaction.videoPath);
  95. mIntent.putExtras(data);
  96. startActivity(mIntent);
  97. }
  98. }

布局文件 friends_list.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:background="@color/backgroud_color" >
  6. <include
  7. android:id="@+id/list_title"
  8. android:layout_alignParentTop="true"
  9. layout="@layout/list_title"/>
  10. <com.yzl.xyb.friends.refresh.view.PullToRefreshListView
  11. xmlns:app="http://schemas.android.com/apk/res-auto"
  12. android:id="@+id/friends_list"
  13. android:layout_width="match_parent"
  14. android:layout_height="match_parent"
  15. android:layout_margin="@dimen/padding_left"
  16. android:divider="@android:color/transparent"
  17. android:layout_below="@+id/list_title"
  18. app:ptrOverScroll="false"
  19. app:ptrHeaderTextColor="#ff666666"
  20. app:ptrHeaderTextAppearance="@android:style/TextAppearance.Small"
  21. app:ptrShowIndicator="false"/>
  22. <include layout="@layout/loading"/>
  23. </RelativeLayout>

适配器 InteractionAdapter 对朋友圈列表进行数据填充

  1. public class InteractionAdapter extends BaseAdapter implements OnClickListener {
  2. private ArrayList<Interaction> interactions;
  3. private Context mContext;
  4. private FinalBitmap mFinal;
  5. private BitmapDisplayConfig config;
  6. private BitmapDisplayConfig imageConfig;
  7. private PostListener listener;
  8. public InteractionAdapter(Context context) {
  9. mContext = context;
  10. mFinal = FinalBitmap.create(mContext);
  11. Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.user_avatar);
  12. config = new BitmapDisplayConfig();
  13. config.setAnimationType(BitmapDisplayConfig.AnimationType.fadeIn);
  14. config.setLoadfailBitmap(bitmap);
  15. config.setLoadfailBitmap(bitmap);
  16. bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.image_failed);
  17. imageConfig = new BitmapDisplayConfig();
  18. imageConfig.setAnimationType(BitmapDisplayConfig.AnimationType.fadeIn);
  19. imageConfig.setLoadfailBitmap(bitmap);
  20. imageConfig.setLoadfailBitmap(bitmap);
  21. }
  22. public void setListener(PostListener listener) {
  23. this.listener = listener;
  24. }
  25. public void setInteractions(ArrayList<Interaction> interactions) {
  26. this.interactions = interactions;
  27. notifyDataSetChanged();
  28. }
  29. @Override
  30. public int getCount() {
  31. // TODO Auto-generated method stub
  32. return interactions == null ? 0 : interactions.size();
  33. }
  34. @Override
  35. public Object getItem(int position) {
  36. // TODO Auto-generated method stub
  37. return interactions.get(position);
  38. }
  39. @Override
  40. public long getItemId(int position) {
  41. // TODO Auto-generated method stub
  42. return position;
  43. }
  44. @Override
  45. public View getView(int position, View convertView, ViewGroup parent) {
  46. // TODO Auto-generated method stub
  47. ViewHolder holder = null;
  48. if (convertView == null) {
  49. convertView = LayoutInflater.from(mContext).inflate(R.layout.friend_list_item, null);
  50. holder = new ViewHolder();
  51. holder.avatar = (CircleImageView) convertView.findViewById(R.id.avatar);
  52. holder.content = (TextView) convertView.findViewById(R.id.content);
  53. holder.title = (TextView) convertView.findViewById(R.id.title);
  54. holder.subtitle = (TextView) convertView.findViewById(R.id.subtitle);
  55. holder.image = convertView.findViewById(R.id.image_layout);
  56. holder.image0 = (ImageView) convertView.findViewById(R.id.image0);
  57. holder.image1 = (ImageView) convertView.findViewById(R.id.image1);
  58. holder.image2 = (ImageView) convertView.findViewById(R.id.image2);
  59. holder.conments = (TextView) convertView.findViewById(R.id.conment_count);
  60. holder.praises = (TextView) convertView.findViewById(R.id.parise_count);
  61. holder.praised = (ImageView) convertView.findViewById(R.id.praise_icon);
  62. holder.more = (TextView) convertView.findViewById(R.id.more);
  63. holder.viewLayout=(LinearLayout) convertView.findViewById(R.id.view_layout);
  64. holder.surfaceView=(SurfaceView) convertView.findViewById(R.id.surface_view_result);
  65. holder.playButton=(ImageButton) convertView.findViewById(R.id.btn_play_result);
  66. holder.audioLayout=(FrameLayout) convertView.findViewById(R.id.audio_layout);
  67. convertView.setTag(holder);
  68. } else {
  69. holder = (ViewHolder) convertView.getTag();
  70. }
  71. Interaction interaction = interactions.get(position);
  72. if (TextUtils.isEmpty(interaction.avatar)) {
  73. holder.avatar.setImageBitmap(config.getLoadfailBitmap());
  74. } else {
  75. mFinal.display(holder.avatar, interaction.avatar, config);
  76. }
  77. holder.title.setText(interaction.name);
  78. holder.subtitle.setText(interaction.subtitle);
  79. holder.content.setText(interaction.content);
  80. holder.conments.setText(String.valueOf(interaction.commentCount));
  81. holder.praises.setText(String.valueOf(interaction.praiseCount));
  82. int images = interaction.images == null ? 0 : interaction.images.size();
  83. if (images > 0) {
  84. holder.image.setVisibility(View.VISIBLE);
  85. holder.audioLayout.setVisibility(View.GONE);
  86. holder.image.setOnClickListener(this);
  87. holder.image.setTag(interaction);
  88. if (images <= 1) {
  89. mFinal.display(holder.image0, interaction.images.get(0), imageConfig);
  90. holder.image1.setImageBitmap(null);
  91. holder.image2.setImageBitmap(null);
  92. } else if (images <= 2) {
  93. mFinal.display(holder.image0, interaction.images.get(0), imageConfig);
  94. mFinal.display(holder.image1, interaction.images.get(1), imageConfig);
  95. holder.image2.setImageBitmap(null);
  96. } else {
  97. mFinal.display(holder.image0, interaction.images.get(0), imageConfig);
  98. mFinal.display(holder.image1, interaction.images.get(1), imageConfig);
  99. mFinal.display(holder.image2, interaction.images.get(2), imageConfig);
  100. }
  101. } else if(interaction.videoPath!=null)
  102. {
  103. holder.image.setVisibility(View.GONE);
  104. holder.playButton.setBackgroundResource(R.drawable.play1pressed);
  105. holder.audioLayout.setVisibility(View.VISIBLE);
  106. holder.playButton.setTag(interaction);
  107. holder.playButton.setOnClickListener(this);
  108. holder.surfaceView.setTag(interaction);
  109. holder.surfaceView.setOnClickListener(this);
  110. }else{
  111. holder.viewLayout.setVisibility(View.GONE);
  112. }
  113. holder.more.setTag(interaction);
  114. holder.more.setOnClickListener(this);
  115. return convertView;
  116. }
  117. private class ViewHolder {
  118. CircleImageView avatar;
  119. TextView title;
  120. TextView subtitle;
  121. TextView content;
  122. View image;
  123. ImageView image0;
  124. ImageView image1;
  125. ImageView image2;
  126. TextView conments;
  127. TextView praises;
  128. ImageView praised;
  129. View delete;
  130. TextView more;
  131. SurfaceView surfaceView;
  132. ImageButton playButton;
  133. FrameLayout audioLayout;
  134. LinearLayout viewLayout;
  135. }
  136. @Override
  137. public void onClick(View v) {
  138. int id = v.getId();
  139. if (id == R.id.btn_play_result) {
  140. Interaction interaction = (Interaction) v.getTag();
  141. }else if (id == R.id.surface_view_result) {
  142. if (this.listener != null) {
  143. this.listener.play((Interaction) v.getTag());
  144. }
  145. }else if (id == R.id.more) {
  146. if (this.listener != null) {
  147. this.listener.show((Interaction) v.getTag());
  148. }
  149. } else if (id == R.id.image_layout) {
  150. Intent intent = new Intent(mContext, MainActivity.class);
  151. Bundle data = new Bundle();
  152. Interaction interaction = (Interaction) v.getTag();
  153. data.putStringArrayList("images", interaction.images);
  154. intent.putExtras(data);
  155. mContext.startActivity(intent);
  156. }
  157. }
  158. public interface PostListener {
  159. void show(Interaction interaction);
  160. void delete(Interaction interaction);
  161. void play(Interaction interaction);
  162. }

          

多图片选择实现代码

MultipleActivity

  1. package com.yzl.xyb.friends;
  2. import java.io.File;
  3. import java.io.FilenameFilter;
  4. import java.util.ArrayList;
  5. import java.util.Arrays;
  6. import java.util.HashSet;
  7. import java.util.List;
  8. import android.app.Activity;
  9. import android.app.ProgressDialog;
  10. import android.content.ContentResolver;
  11. import android.content.Intent;
  12. import android.database.Cursor;
  13. import android.net.Uri;
  14. import android.os.Bundle;
  15. import android.os.Environment;
  16. import android.os.Handler;
  17. import android.provider.MediaStore;
  18. import android.util.DisplayMetrics;
  19. import android.util.Log;
  20. import android.view.LayoutInflater;
  21. import android.view.View;
  22. import android.view.View.OnClickListener;
  23. import android.view.ViewGroup.LayoutParams;
  24. import android.view.WindowManager;
  25. import android.widget.GridView;
  26. import android.widget.PopupWindow.OnDismissListener;
  27. import android.widget.RelativeLayout;
  28. import android.widget.TextView;
  29. import android.widget.Toast;
  30. import com.yzl.xyb.friends.adapter.MyAdapter;
  31. import com.yzl.xyb.friends.adapter.MyAdapter.SetCountListener;
  32. import com.yzl.xyb.friends.picture.ListImageDirPopupWindow;
  33. import com.yzl.xyb.friends.picture.ListImageDirPopupWindow.OnImageDirSelected;
  34. import com.yzl.xyb.friends.util.ImageFloder;
  35. /**
  36. * 从相册选取图片
  37. * 可以选择多张,最多可选9张
  38. * 获取所有相册
  39. * 确定:返回已选图片的路径
  40. * @author hou
  41. *
  42. */
  43. public class MultipleActivity extends Activity implements OnImageDirSelected, SetCountListener{
  44. private TextView selectCount;
  45. private TextView selectPicture;
  46. private TextView mChooseDir;
  47. private ProgressDialog mProgressDialog;
  48. public static final int KITKAT_LESS = 2;
  49. /**
  50. * 存储文件夹中的图片数量
  51. */
  52. private int mPicsSize;
  53. /**
  54. * 图片数量最多的文件夹
  55. */
  56. private File mImgDir;
  57. /**
  58. * 所有的图片
  59. */
  60. private List<String> mImgs;
  61. private ArrayList<String> pictures;
  62. private GridView mGirdView;
  63. private MyAdapter mAdapter;
  64. /**
  65. * 临时的辅助类,用于防止同一个文件夹的多次扫描
  66. */
  67. private HashSet<String> mDirPaths = new HashSet<String>();
  68. /**
  69. * 扫描拿到所有的图片文件夹
  70. */
  71. private List<ImageFloder> mImageFloders = new ArrayList<ImageFloder>();
  72. private RelativeLayout mBottomLy;
  73. int totalCount = 0;
  74. private int mScreenHeight;
  75. private ListImageDirPopupWindow mListImageDirPopupWindow;
  76. private Handler mHandler = new Handler()
  77. {
  78. public void handleMessage(android.os.Message msg)
  79. {
  80. mProgressDialog.dismiss();
  81. // 为View绑定数据
  82. data2View();
  83. // 初始化展示文件夹的popupWindw
  84. initListDirPopupWindw();
  85. }
  86. };
  87. @Override
  88. protected void onCreate(Bundle savedInstanceState)
  89. {
  90. super.onCreate(savedInstanceState);
  91. setContentView(R.layout.picture_selector);
  92. getIntent().getExtras();
  93. DisplayMetrics outMetrics = new DisplayMetrics();
  94. getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
  95. mScreenHeight = outMetrics.heightPixels;
  96. initView();
  97. getImages();
  98. initEvent();
  99. }
  100. /**
  101. * 初始化View
  102. */
  103. private void initView()
  104. {
  105. mGirdView = (GridView) findViewById(R.id.id_gridView);
  106. mChooseDir = (TextView) findViewById(R.id.id_choose_dir);
  107. selectCount = (TextView) findViewById(R.id.tv_select_count);
  108. // allPhotoAlum = (TextView) findViewById(R.id.tv_photoAlum);
  109. selectPicture= (TextView) findViewById(R.id.tv_sure);
  110. mBottomLy = (RelativeLayout) findViewById(R.id.id_bottom_ly);
  111. }
  112. private void initEvent()
  113. {
  114. /**
  115. * 为底部的布局设置点击事件,弹出popupWindow
  116. */
  117. mBottomLy.setOnClickListener(new OnClickListener()
  118. {
  119. @Override
  120. public void onClick(View v)
  121. {
  122. mListImageDirPopupWindow
  123. .setAnimationStyle(R.style.anim_popup_dir);
  124. mListImageDirPopupWindow.showAsDropDown(mBottomLy, 0, 0);
  125. // 设置背景颜色变暗
  126. WindowManager.LayoutParams lp = getWindow().getAttributes();
  127. lp.alpha = .3f;
  128. getWindow().setAttributes(lp);
  129. }
  130. });
  131. selectPicture.setOnClickListener(new OnClickListener() {
  132. @Override
  133. public void onClick(View v) {
  134. pictures=mAdapter.getSelectPath();
  135. Log.i("选中的图片1>>>>>>",pictures.size()+"----------");
  136. Intent intent=new Intent();
  137. // intent.setClass(MultipleActivity.this, CreatePostActivity.class);
  138. Bundle bundle=new Bundle();
  139. bundle.putStringArrayList("PICTURES", pictures);
  140. intent.putExtras(bundle);
  141. // startActivityForResult(intent, KITKAT_LESS);
  142. setResult(KITKAT_LESS, intent);
  143. finish();
  144. }
  145. });
  146. }
  147. /**
  148. * 为View绑定数据
  149. */
  150. private void data2View()
  151. {
  152. if (mImgDir == null)
  153. {
  154. Toast.makeText(getApplicationContext(), "擦,一张图片没扫描到",
  155. Toast.LENGTH_SHORT).show();
  156. return;
  157. }
  158. mImgs = Arrays.asList(mImgDir.list());
  159. /**
  160. * 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗;
  161. */
  162. mAdapter = new MyAdapter(getApplicationContext(), mImgs,
  163. R.layout.grid_item, mImgDir.getAbsolutePath());
  164. mAdapter.setCountListener(this);
  165. mGirdView.setAdapter(mAdapter);
  166. // allPictureCount.setText("共"+totalCount + "张");
  167. };
  168. /**
  169. * 初始化展示文件夹的popupWindw
  170. */
  171. private void initListDirPopupWindw()
  172. {
  173. mListImageDirPopupWindow = new ListImageDirPopupWindow(
  174. LayoutParams.MATCH_PARENT, (int) (mScreenHeight * 1),
  175. mImageFloders, LayoutInflater.from(getApplicationContext())
  176. .inflate(R.layout.list_dir, null));
  177. mListImageDirPopupWindow.setOnDismissListener(new OnDismissListener()
  178. {
  179. @Override
  180. public void onDismiss()
  181. {
  182. // 设置背景颜色变暗
  183. WindowManager.LayoutParams lp = getWindow().getAttributes();
  184. lp.alpha = 1.0f;
  185. getWindow().setAttributes(lp);
  186. }
  187. });
  188. // 设置选择文件夹的回调
  189. mListImageDirPopupWindow.setOnImageDirSelected(this);
  190. }
  191. /**
  192. * 利用ContentProvider扫描手机中的图片,此方法在运行在子线程中 完成图片的扫描,最终获得jpg最多的那个文件夹
  193. */
  194. private void getImages()
  195. {
  196. if (!Environment.getExternalStorageState().equals(
  197. Environment.MEDIA_MOUNTED))
  198. {
  199. Toast.makeText(this, "暂无外部存储", Toast.LENGTH_SHORT).show();
  200. return;
  201. }
  202. // 显示进度条
  203. mProgressDialog = ProgressDialog.show(this, null, "正在加载...");
  204. new Thread(new Runnable()
  205. {
  206. @Override
  207. public void run()
  208. {
  209. String firstImage = null;
  210. Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
  211. ContentResolver mContentResolver = MultipleActivity.this
  212. .getContentResolver();
  213. // 只查询jpeg和png的图片
  214. Cursor mCursor = mContentResolver.query(mImageUri, null,
  215. MediaStore.Images.Media.MIME_TYPE + "=? or "
  216. + MediaStore.Images.Media.MIME_TYPE + "=?",
  217. new String[] { "image/jpeg", "image/png" },
  218. MediaStore.Images.Media.DATE_MODIFIED);
  219. Log.e("TAG", mCursor.getCount() + "");
  220. while (mCursor.moveToNext())
  221. {
  222. // 获取图片的路径
  223. String path = mCursor.getString(mCursor
  224. .getColumnIndex(MediaStore.Images.Media.DATA));
  225. Log.e("TAG", path);
  226. // 拿到第一张图片的路径
  227. if (firstImage == null)
  228. firstImage = path;
  229. // 获取该图片的父路径名
  230. File parentFile = new File(path).getParentFile();
  231. if (parentFile == null)
  232. continue;
  233. String dirPath = parentFile.getAbsolutePath();
  234. ImageFloder imageFloder = null;
  235. // 利用一个HashSet防止多次扫描同一个文件夹(不加这个判断,图片多起来还是相当恐怖的~~)
  236. if (mDirPaths.contains(dirPath))
  237. {
  238. continue;
  239. } else
  240. {
  241. mDirPaths.add(dirPath);
  242. // 初始化imageFloder
  243. imageFloder = new ImageFloder();
  244. imageFloder.setDir(dirPath);
  245. imageFloder.setFirstImagePath(path);
  246. }
  247. int picSize = parentFile.list(new FilenameFilter()
  248. {
  249. @Override
  250. public boolean accept(File dir, String filename)
  251. {
  252. if (filename.endsWith(".jpg")
  253. || filename.endsWith(".png")
  254. || filename.endsWith(".jpeg"))
  255. return true;
  256. return false;
  257. }
  258. }).length;
  259. totalCount += picSize;
  260. imageFloder.setCount(picSize);
  261. mImageFloders.add(imageFloder);
  262. if (picSize > mPicsSize)
  263. {
  264. mPicsSize = picSize;
  265. mImgDir = parentFile;
  266. }
  267. }
  268. mCursor.close();
  269. // 扫描完成,辅助的HashSet也就可以释放内存了
  270. mDirPaths = null;
  271. // 通知Handler扫描图片完成
  272. mHandler.sendEmptyMessage(0x110);
  273. }
  274. }).start();
  275. }
  276. @Override
  277. public void selected(ImageFloder floder)
  278. {
  279. mImgDir = new File(floder.getDir());
  280. mImgs = Arrays.asList(mImgDir.list(new FilenameFilter()
  281. {
  282. @Override
  283. public boolean accept(File dir, String filename)
  284. {
  285. if (filename.endsWith(".jpg") || filename.endsWith(".png")
  286. || filename.endsWith(".jpeg"))
  287. return true;
  288. return false;
  289. }
  290. }));
  291. /**
  292. * 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗;
  293. */
  294. mAdapter = new MyAdapter(getApplicationContext(), mImgs,
  295. R.layout.grid_item, mImgDir.getAbsolutePath());
  296. mAdapter.setCountListener(this);
  297. mGirdView.setAdapter(mAdapter);
  298. // mAdapter.notifyDataSetChanged();
  299. // mImageCount.setText(floder.getCount() + "张");
  300. mChooseDir.setText(floder.getName());
  301. selectCount.setText("/9");
  302. mListImageDirPopupWindow.dismiss();
  303. }
  304. @Override
  305. public void doCount(int a) {
  306. selectCount.setText(a+"/9");
  307. }
  308. }

                  

视频的录制与预览

  1. package com.yzl.xyb.friends;
  2. import android.annotation.SuppressLint;
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.os.Handler;
  7. import android.os.Message;
  8. import android.util.Log;
  9. import android.view.MotionEvent;
  10. import android.view.View;
  11. import android.view.View.OnTouchListener;
  12. import android.widget.Button;
  13. import android.widget.Toast;
  14. import com.yzl.xyb.friends.view.MovieRecorderView;
  15. import com.yzl.xyb.friends.view.MovieRecorderView.OnRecordFinishListener;
  16. /**
  17. * 录制视频
  18. * @author hou
  19. *
  20. */
  21. public class RecorderActivity extends Activity {
  22. private MovieRecorderView mRecorderView;
  23. private Button mShootBtn;
  24. private boolean isFinish = true;
  25. private String userId = "";
  26. @Override
  27. protected void onCreate(Bundle savedInstanceState) {
  28. // TODO Auto-generated method stub
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.record_activity);
  31. // userId=getIntent().getParcelableExtra("userId");
  32. mRecorderView = (MovieRecorderView) findViewById(R.id.movieRecorderView);
  33. mShootBtn = (Button) findViewById(R.id.shoot_button);
  34. mShootBtn.setOnTouchListener(new OnTouchListener() {
  35. @Override
  36. public boolean onTouch(View v, MotionEvent event) {
  37. if (event.getAction() == MotionEvent.ACTION_DOWN) {
  38. mRecorderView.record(new OnRecordFinishListener() {
  39. @Override
  40. public void onRecordFinish() {
  41. Log.i("MotionEvent>>>","ACTION_DOWN");
  42. handler.sendEmptyMessage(1);
  43. }
  44. });
  45. } else if (event.getAction() == MotionEvent.ACTION_UP) {
  46. Log.i("MotionEvent>>>","ACTION_UP");
  47. if (mRecorderView.getTimeCount() > 1)
  48. handler.sendEmptyMessage(1);
  49. else {
  50. if (mRecorderView.getmVecordFile() != null)
  51. mRecorderView.getmVecordFile().delete();
  52. mRecorderView.stop();
  53. Toast.makeText(RecorderActivity.this, "时间太短,录制失败", Toast.LENGTH_SHORT).show();
  54. }
  55. }
  56. return true;
  57. }
  58. });
  59. }
  60. @Override
  61. public void onResume() {
  62. super.onResume();
  63. isFinish = true;
  64. }
  65. @Override
  66. public void onSaveInstanceState(Bundle outState) {
  67. super.onSaveInstanceState(outState);
  68. isFinish = false;
  69. mRecorderView.stop();
  70. }
  71. @Override
  72. public void onPause() {
  73. super.onPause();
  74. }
  75. @Override
  76. public void onDestroy() {
  77. super.onDestroy();
  78. }
  79. @SuppressLint("HandlerLeak")
  80. private Handler handler = new Handler() {
  81. @Override
  82. public void handleMessage(Message msg) {
  83. finishActivity();
  84. Log.i("isFinish>>>",isFinish+"");
  85. }
  86. };
  87. private void finishActivity() {
  88. if (isFinish) {
  89. mRecorderView.stop();
  90. Intent intent = new Intent(RecorderActivity.this, TopicActivity.class);
  91. Bundle mBundle = new Bundle();
  92. mBundle.putString("path", mRecorderView.getmVecordFile().toString());
  93. mBundle.putString("userId", userId);
  94. intent.putExtras(mBundle);
  95. startActivity(intent);
  96. }
  97. }
  98. public interface OnShootCompletionListener {
  99. public void OnShootSuccess(String path, int second);
  100. public void OnShootFailure();
  101. }
  102. }

视频的预览

  1. package com.yzl.xyb.friends;
  2. import android.app.Activity;
  3. import android.media.AudioManager;
  4. import android.media.MediaPlayer;
  5. import android.os.Bundle;
  6. import android.view.SurfaceHolder;
  7. import android.view.SurfaceView;
  8. import android.view.View;
  9. import android.view.View.OnClickListener;
  10. import android.widget.ImageButton;
  11. import android.widget.ImageView;
  12. public class RecorderPlayActivity extends Activity implements SurfaceHolder.Callback, OnClickListener {
  13. private ImageView ivBack;
  14. private ImageButton btnPlay;
  15. private SurfaceView surfaceView;
  16. private SurfaceHolder surfaceHolder;
  17. private String path=null;
  18. private MediaPlayer player;
  19. private boolean play=false;
  20. @SuppressWarnings("deprecation")
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. // TODO Auto-generated method stub
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.recorder_play);
  26. ivBack=(ImageView) findViewById(R.id.iv_back);
  27. btnPlay=(ImageButton) findViewById(R.id.ib_play);
  28. surfaceView=(SurfaceView) findViewById(R.id.play_view);
  29. btnPlay.setBackground(getResources().getDrawable(R.drawable.play1pressed));
  30. path=this.getIntent().getStringExtra("path");
  31. System.out.println("surface created>>>> path= "+path);
  32. surfaceHolder=surfaceView.getHolder();
  33. surfaceHolder.addCallback(this);
  34. surfaceHolder.setFixedSize(320, 220);
  35. surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  36. System.out.println("oncreate--------------");
  37. ivBack.setOnClickListener(this);
  38. btnPlay.setOnClickListener(this);
  39. surfaceView.setOnClickListener(this);
  40. }
  41. @Override
  42. public void surfaceCreated(SurfaceHolder holder) {
  43. player=new MediaPlayer();
  44. player.setAudioStreamType(AudioManager.STREAM_MUSIC);
  45. player.setDisplay(surfaceHolder);
  46. try {
  47. System.out.println("surface created>>>> path= "+path);
  48. player.setDataSource(path);
  49. player.prepare();
  50. } catch (Exception e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. @Override
  55. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  56. int height) {
  57. // TODO Auto-generated method stub
  58. }
  59. @Override
  60. public void surfaceDestroyed(SurfaceHolder holder) {
  61. // TODO Auto-generated method stub
  62. }
  63. @Override
  64. public void onClick(View v) {
  65. switch (v.getId()) {
  66. case R.id.iv_back:
  67. this.finish();
  68. break;
  69. case R.id.ib_play:
  70. player.start();
  71. btnPlay.setVisibility(View.GONE);
  72. break;
  73. case R.id.play_view:
  74. player.pause();
  75. /*if(play){
  76. player.start();
  77. }else {
  78. player.pause();
  79. }*/
  80. btnPlay.setVisibility(View.VISIBLE);
  81. break;
  82. default:
  83. break;
  84. }
  85. }
  86. @Override
  87. protected void onDestroy() {
  88. // TODO Auto-generated method stub
  89. super.onDestroy();
  90. if(player.isPlaying())
  91. {
  92. player.stop();
  93. }
  94. player.release();
  95. }
  96. }

拥有一个属于自己的朋友圈是不是很开新,可以和好朋友随时随地分享,是不是很开心!

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

您可能感兴趣的文章:

  • java开发微信分享到朋友圈功能
  • Android仿微信发朋友圈浏览图片效果
  • Android GridView仿微信朋友圈显示图片
  • 基于js实现微信发送好友如何分享到朋友圈、微博
  • Android实现微信朋友圈发本地视频功能

人气教程排行