我也有微信朋友圈了 Android实现
程序员文章站
2022-03-25 10:14:58
本文实例分享了一个简单的朋友圈程序,包含了朋友圈的列表实现,视频的录制、预览与上传,图片可选择拍照,供大家参考,具体内容如下
friendslistactivity&...
本文实例分享了一个简单的朋友圈程序,包含了朋友圈的列表实现,视频的录制、预览与上传,图片可选择拍照,供大家参考,具体内容如下
friendslistactivity 代码如下
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
<?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 对朋友圈列表进行数据填充
public class interactionadapter extends baseadapter implements onclicklistener { private arraylist<interaction> interactions; private context mcontext; private finalbitmap mfinal; private bitmapdisplayconfig config; private bitmapdisplayconfig imageconfig; private postlistener listener; public interactionadapter(context context) { mcontext = context; mfinal = finalbitmap.create(mcontext); bitmap bitmap = bitmapfactory.decoderesource(mcontext.getresources(), r.drawable.user_avatar); config = new bitmapdisplayconfig(); config.setanimationtype(bitmapdisplayconfig.animationtype.fadein); config.setloadfailbitmap(bitmap); config.setloadfailbitmap(bitmap); bitmap = bitmapfactory.decoderesource(mcontext.getresources(), r.drawable.image_failed); imageconfig = new bitmapdisplayconfig(); imageconfig.setanimationtype(bitmapdisplayconfig.animationtype.fadein); imageconfig.setloadfailbitmap(bitmap); imageconfig.setloadfailbitmap(bitmap); } public void setlistener(postlistener listener) { this.listener = listener; } public void setinteractions(arraylist<interaction> interactions) { this.interactions = interactions; notifydatasetchanged(); } @override public int getcount() { // todo auto-generated method stub return interactions == null ? 0 : interactions.size(); } @override public object getitem(int position) { // todo auto-generated method stub return interactions.get(position); } @override public long getitemid(int position) { // todo auto-generated method stub return position; } @override public view getview(int position, view convertview, viewgroup parent) { // todo auto-generated method stub viewholder holder = null; if (convertview == null) { convertview = layoutinflater.from(mcontext).inflate(r.layout.friend_list_item, null); holder = new viewholder(); holder.avatar = (circleimageview) convertview.findviewbyid(r.id.avatar); holder.content = (textview) convertview.findviewbyid(r.id.content); holder.title = (textview) convertview.findviewbyid(r.id.title); holder.subtitle = (textview) convertview.findviewbyid(r.id.subtitle); holder.image = convertview.findviewbyid(r.id.image_layout); holder.image0 = (imageview) convertview.findviewbyid(r.id.image0); holder.image1 = (imageview) convertview.findviewbyid(r.id.image1); holder.image2 = (imageview) convertview.findviewbyid(r.id.image2); holder.conments = (textview) convertview.findviewbyid(r.id.conment_count); holder.praises = (textview) convertview.findviewbyid(r.id.parise_count); holder.praised = (imageview) convertview.findviewbyid(r.id.praise_icon); holder.more = (textview) convertview.findviewbyid(r.id.more); holder.viewlayout=(linearlayout) convertview.findviewbyid(r.id.view_layout); holder.surfaceview=(surfaceview) convertview.findviewbyid(r.id.surface_view_result); holder.playbutton=(imagebutton) convertview.findviewbyid(r.id.btn_play_result); holder.audiolayout=(framelayout) convertview.findviewbyid(r.id.audio_layout); convertview.settag(holder); } else { holder = (viewholder) convertview.gettag(); } interaction interaction = interactions.get(position); if (textutils.isempty(interaction.avatar)) { holder.avatar.setimagebitmap(config.getloadfailbitmap()); } else { mfinal.display(holder.avatar, interaction.avatar, config); } holder.title.settext(interaction.name); holder.subtitle.settext(interaction.subtitle); holder.content.settext(interaction.content); holder.conments.settext(string.valueof(interaction.commentcount)); holder.praises.settext(string.valueof(interaction.praisecount)); int images = interaction.images == null ? 0 : interaction.images.size(); if (images > 0) { holder.image.setvisibility(view.visible); holder.audiolayout.setvisibility(view.gone); holder.image.setonclicklistener(this); holder.image.settag(interaction); if (images <= 1) { mfinal.display(holder.image0, interaction.images.get(0), imageconfig); holder.image1.setimagebitmap(null); holder.image2.setimagebitmap(null); } else if (images <= 2) { mfinal.display(holder.image0, interaction.images.get(0), imageconfig); mfinal.display(holder.image1, interaction.images.get(1), imageconfig); holder.image2.setimagebitmap(null); } else { mfinal.display(holder.image0, interaction.images.get(0), imageconfig); mfinal.display(holder.image1, interaction.images.get(1), imageconfig); mfinal.display(holder.image2, interaction.images.get(2), imageconfig); } } else if(interaction.videopath!=null) { holder.image.setvisibility(view.gone); holder.playbutton.setbackgroundresource(r.drawable.play1pressed); holder.audiolayout.setvisibility(view.visible); holder.playbutton.settag(interaction); holder.playbutton.setonclicklistener(this); holder.surfaceview.settag(interaction); holder.surfaceview.setonclicklistener(this); }else{ holder.viewlayout.setvisibility(view.gone); } holder.more.settag(interaction); holder.more.setonclicklistener(this); return convertview; } private class viewholder { circleimageview avatar; textview title; textview subtitle; textview content; view image; imageview image0; imageview image1; imageview image2; textview conments; textview praises; imageview praised; view delete; textview more; surfaceview surfaceview; imagebutton playbutton; framelayout audiolayout; linearlayout viewlayout; } @override public void onclick(view v) { int id = v.getid(); if (id == r.id.btn_play_result) { interaction interaction = (interaction) v.gettag(); }else if (id == r.id.surface_view_result) { if (this.listener != null) { this.listener.play((interaction) v.gettag()); } }else if (id == r.id.more) { if (this.listener != null) { this.listener.show((interaction) v.gettag()); } } else if (id == r.id.image_layout) { intent intent = new intent(mcontext, mainactivity.class); bundle data = new bundle(); interaction interaction = (interaction) v.gettag(); data.putstringarraylist("images", interaction.images); intent.putextras(data); mcontext.startactivity(intent); } } public interface postlistener { void show(interaction interaction); void delete(interaction interaction); void play(interaction interaction); }
多图片选择实现代码
multipleactivity
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"); } }
视频的录制与预览
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(); } }
视频的预览
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软件编程有所帮助。
上一篇: Go语言七篇入门教程六网络编程
推荐阅读
-
关于Android实现简单的微信朋友圈分享功能
-
Android实现微信朋友圈评论EditText效果
-
Android实现微信朋友圈图片和视频播放
-
android实现微信分享、朋友圈分享功能
-
(仿微信Android)聊天+红包+直播+朋友圈源码发布了 AndroidiOSSDK
-
(仿微信Android)聊天+红包+直播+朋友圈源码发布了 AndroidiOSSDK
-
Android实现微信朋友圈评论EditText效果
-
微信公众平台现在还能实现一键关注么?我试了很多都不行,据说都被tx屏蔽了?
-
Android实现微信朋友圈图片和视频播放
-
微信公众平台现在还能实现一键关注么?我试了很多都不行,据说都被tx屏蔽了?