Android(安卓)Studio 微信分享功能(包括可以分享到朋友圈,分享到朋友)
16lz
2021-01-26
第一步:配置sdk
在build.gradle文件中,添加如下依赖即可:
在Android Studio中新建你的工程,并保证网络设置可以成功从jcenter下载微信SDK即可。
dependencies { compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'}
或者是以下
dependencies { compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'}
AndroidManifest.xml 设置
添加必要的权限支持:
第二步:
WechatShareManager.java 完善
package com.jackie.umeng.share;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.util.Log;import android.widget.Toast;import com.tencent.mm.sdk.modelmsg.SendMessageToWX;import com.tencent.mm.sdk.modelmsg.WXImageObject;import com.tencent.mm.sdk.modelmsg.WXMediaMessage;import com.tencent.mm.sdk.modelmsg.WXTextObject;import com.tencent.mm.sdk.modelmsg.WXVideoObject;import com.tencent.mm.sdk.modelmsg.WXWebpageObject;import com.tencent.mm.sdk.openapi.IWXAPI;import com.tencent.mm.sdk.openapi.WXAPIFactory; /** * 实现微信分享功能的核心类 * @author chengcj1 * */public class WechatShareManager { private static final int THUMB_SIZE = 150; public static final int WECHAT_SHARE_WAY_TEXT = 1; //文字 public static final int WECHAT_SHARE_WAY_PICTURE = 2; //图片 public static final int WECHAT_SHARE_WAY_WEBPAGE = 3; //链接 public static final int WECHAT_SHARE_WAY_VIDEO = 4; //视频 public static final int WECHAT_SHARE_TYPE_TALK = SendMessageToWX.Req.WXSceneSession; //会话 public static final int WECHAT_SHARE_TYPE_FRENDS = SendMessageToWX.Req.WXSceneTimeline; //朋友圈 private static WechatShareManager mInstance; private ShareContent mShareContentText, mShareContentPicture, mShareContentWebpag, mShareContentVideo; private IWXAPI mWXApi; private Context mContext; private WechatShareManager(Context context){ this.mContext = context; //初始化数据 //初始化微信分享代码 initWechatShare(context); } /** * 获取WeixinShareManager实例 * 非线程安全,请在UI线程中操作 * @return */ public static WechatShareManager getInstance(Context context){ if(mInstance == null){ mInstance = new WechatShareManager(context); } return mInstance; } private void initWechatShare(Context context){ if (mWXApi == null) { mWXApi = WXAPIFactory.createWXAPI(context, WechatShareUtil.WECHAT_APP_ID, true); } mWXApi.registerApp(WechatShareUtil.WECHAT_APP_ID); } /** * 通过微信分享 * @param shareWay 分享的方式(文本、图片、链接) * @param shareType 分享的类型(朋友圈,会话) */ public void shareByWebchat(ShareContent shareContent, int shareType){ switch (shareContent.getShareWay()) { case WECHAT_SHARE_WAY_TEXT: shareText(shareContent, shareType); break; case WECHAT_SHARE_WAY_PICTURE: sharePicture(shareContent, shareType); break; case WECHAT_SHARE_WAY_WEBPAGE: shareWebPage(shareContent, shareType); break; case WECHAT_SHARE_WAY_VIDEO: shareVideo(shareContent, shareType); break; } } private abstract class ShareContent { protected abstract int getShareWay(); protected abstract String getContent(); protected abstract String getTitle(); protected abstract String getURL(); protected abstract int getPictureResource(); } /** * 设置分享文字的内容 * @author chengcj1 * */ public class ShareContentText extends ShareContent { private String content; /** * 构造分享文字类 * @param text 分享的文字内容 */ public ShareContentText(String content){ this.content = content; } @Override protected int getShareWay() { return WECHAT_SHARE_WAY_TEXT; } @Override protected String getContent() { return content; } @Override protected String getTitle() { return null; } @Override protected String getURL() { return null; } @Override protected int getPictureResource() { return -1; } } /* * 获取文本分享对象 */ public ShareContent getShareContentText(String content) { if (mShareContentText == null) { mShareContentText = new ShareContentText(content); } return (ShareContentText) mShareContentText; } /** * 设置分享图片的内容 * @author chengcj1 * */ public class ShareContentPicture extends ShareContent { private int pictureResource; public ShareContentPicture(int pictureResource){ this.pictureResource = pictureResource; } @Override protected int getShareWay() { return WECHAT_SHARE_WAY_PICTURE; } @Override protected int getPictureResource() { return pictureResource; } @Override protected String getContent() { return null; } @Override protected String getTitle() { return null; } @Override protected String getURL() { return null; } } /* * 获取图片分享对象 */ public ShareContent getShareContentPicture(int pictureResource) { if (mShareContentPicture == null) { mShareContentPicture = new ShareContentPicture(pictureResource); } return (ShareContentPicture) mShareContentPicture; } /** * 设置分享链接的内容 * @author chengcj1 * */ public class ShareContentWebpage extends ShareContent { private String title; private String content; private String url; private int pictureResource; public ShareContentWebpage(String title, String content, String url, int pictureResource){ this.title = title; this.content = content; this.url = url; this.pictureResource = pictureResource; } @Override protected int getShareWay() { return WECHAT_SHARE_WAY_WEBPAGE; } @Override protected String getContent() { return content; } @Override protected String getTitle() { return title; } @Override protected String getURL() { return url; } @Override protected int getPictureResource() { return pictureResource; } } /* * 获取网页分享对象 */ public ShareContent getShareContentWebpag(String title, String content, String url, int pictureResource) { if (mShareContentWebpag == null) { mShareContentWebpag = new ShareContentWebpage(title, content, url, pictureResource); } return (ShareContentWebpage) mShareContentWebpag; } /** * 设置分享视频的内容 * @author chengcj1 * */ public class ShareContentVideo extends ShareContent { private String url; public ShareContentVideo(String url) { this.url = url; } @Override protected int getShareWay() { return WECHAT_SHARE_WAY_VIDEO; } @Override protected String getContent() { return null; } @Override protected String getTitle() { return null; } @Override protected String getURL() { return url; } @Override protected int getPictureResource() { return -1; } } /* * 获取视频分享内容 */ public ShareContent getShareContentVideo(String url) { if (mShareContentVideo == null) { mShareContentVideo = new ShareContentVideo(url); } return (ShareContentVideo) mShareContentVideo; } /* * 分享文字 */ private void shareText(ShareContent shareContent, int shareType) { String text = shareContent.getContent(); //初始化一个WXTextObject对象 WXTextObject textObj = new WXTextObject(); textObj.text = text; //用WXTextObject对象初始化一个WXMediaMessage对象 WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = textObj; msg.description = text; //构造一个Req SendMessageToWX.Req req = new SendMessageToWX.Req(); //transaction字段用于唯一标识一个请求 req.transaction = buildTransaction("textshare"); req.message = msg; //发送的目标场景, 可以选择发送到会话 WXSceneSession 或者朋友圈 WXSceneTimeline。 默认发送到会话。 req.scene = shareType; mWXApi.sendReq(req); } /* * 分享图片 */ private void sharePicture(ShareContent shareContent, int shareType) { Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), shareContent.getPictureResource()); WXImageObject imgObj = new WXImageObject(bitmap); WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = imgObj; Bitmap thumbBitmap = Bitmap.createScaledBitmap(bitmap, THUMB_SIZE, THUMB_SIZE, true); bitmap.recycle(); msg.thumbData = Util.bmpToByteArray(thumbBitmap, true); //设置缩略图 SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("imgshareappdata"); req.message = msg; req.scene = shareType; mWXApi.sendReq(req); } /* * 分享链接 */ private void shareWebPage(ShareContent shareContent, int shareType) { WXWebpageObject webpage = new WXWebpageObject(); webpage.webpageUrl = shareContent.getURL(); WXMediaMessage msg = new WXMediaMessage(webpage); msg.title = shareContent.getTitle(); msg.description = shareContent.getContent(); Bitmap thumb = BitmapFactory.decodeResource(mContext.getResources(), shareContent.getPictureResource()); if(thumb == null) { Toast.makeText(mContext, "图片不能为空", Toast.LENGTH_SHORT).show(); } else { msg.thumbData = Util.bmpToByteArray(thumb, true); } SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("webpage"); req.message = msg; req.scene = shareType; mWXApi.sendReq(req); } /* * 分享视频 */ private void shareVideo(ShareContent shareContent, int shareType) { WXVideoObject video = new WXVideoObject(); video.videoUrl = shareContent.getURL(); WXMediaMessage msg = new WXMediaMessage(video); msg.title = shareContent.getTitle(); msg.description = shareContent.getContent(); Bitmap thumb = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.send_music_thumb); //BitmapFactory.decodeStream(new URL(video.videoUrl).openStream()); /** * 测试过程中会出现这种情况,会有个别手机会出现调不起微信客户端的情况。造成这种情况的原因是微信对缩略图的大小、title、description等参数的大小做了限制,所以有可能是大小超过了默认的范围。 * 一般情况下缩略图超出比较常见。Title、description都是文本,一般不会超过。 */ Bitmap thumbBitmap = Bitmap.createScaledBitmap(thumb, THUMB_SIZE, THUMB_SIZE, true); thumb.recycle(); msg.thumbData = Util.bmpToByteArray(thumbBitmap, true); SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("video"); req.message = msg; req.scene = shareType; mWXApi.sendReq(req); } private String buildTransaction(final String type) { return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis(); } }
MainActivity.java
package com.jackie.umeng.share;import com.jackie.umeng.share.WechatShareManager.ShareContentPicture;import com.jackie.umeng.share.WechatShareManager.ShareContentText;import com.jackie.umeng.share.WechatShareManager.ShareContentVideo;import android.app.Activity;import android.content.Context;import android.content.pm.PackageManager;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {private Button mShareText, mSharePicture, mShareVideo;private WechatShareManager mShareManager; private Context mContext;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mShareText = (Button) findViewById(R.id.share_text);mSharePicture = (Button) findViewById(R.id.share_picture);mShareVideo = (Button) findViewById(R.id.share_video);mShareText.setOnClickListener(this);mSharePicture.setOnClickListener(this);mShareVideo.setOnClickListener(this);mContext = this;mShareManager = WechatShareManager.getInstance(mContext);}@Overridepublic void onClick(View v) { if(isWeixinAvilible(mContext)) { }else { Toast.makeText(mContext, "您还没有安装微信,请先安装微信客户端", Toast.LENGTH_SHORT).show(); }switch (v.getId()) {case R.id.share_text:ShareContentText mShareContentText = (ShareContentText) mShareManager.getShareContentText("微信文本分享");mShareManager.shareByWebchat(mShareContentText, WechatShareManager.WECHAT_SHARE_TYPE_FRENDS);break;case R.id.share_picture:ShareContentPicture mShareContentPicture = (ShareContentPicture) mShareManager.getShareContentPicture(R.drawable.share);mShareManager.shareByWebchat(mShareContentPicture, WechatShareManager.WECHAT_SHARE_TYPE_FRENDS); break;case R.id.share_video:ShareContentVideo mShareContentVideo = (ShareContentVideo) mShareManager.getShareContentVideo("http://baidu.hz.letv.com/kan/agSlT?fr=v.baidu.com/");mShareManager.shareByWebchat(mShareContentVideo, WechatShareManager.WECHAT_SHARE_TYPE_FRENDS);break;default:break;}} /** * 判断 用户是否安装微信客户端 */public static boolean isWeixinAvilible(Context context) { final PackageManager packageManager = context.getPackageManager();// 获取packagemanager List pinfo = packageManager.getInstalledPackages(0);// 获取所有已安装程序的包信息 if (pinfo != null) { for (int i = 0; i < pinfo.size(); i++) { String pn = pinfo.get(i).packageName; if (pn.equals("com.tencent.mm")) { return true; } } } return false;}}
如果后台返给我们的数据是二进制流图片我们需要做一些改动如下:
二进制流转换成Bitmap类型的
第一步:
/** * base64转为bitmap * @return */ public static Bitmap base64ToBitmap(String picStrInMsg) { Bitmap bitmap = null; byte[] decode = Base64.decode(picStrInMsg, Base64.DEFAULT); bitmap = BitmapFactory.decodeByteArray(decode, 0, decode.length); return bitmap; }
第二步:
在调用微信分享的方法里面
Bitmap bitmap = base64ToBitmap(arg.split("base64,")[1]); try { WXImageObject imgObj = new WXImageObject(bitmap); WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = imgObj; Bitmap thumbBitmap = Bitmap.createScaledBitmap(bitmap, 150, 150, true); bitmap.recycle(); msg.thumbData = Util.bmpToByteArray(thumbBitmap, true); //设置缩略图 SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("imgshareappdata"); req.message = msg; req.scene = WechatShareManager.WECHAT_SHARE_TYPE_TALK; mShareManager.mWXApi.sendReq(req); } catch (ActivityNotFoundException e) {// TODO: handle exception Toast.makeText(mContext, "检查到您手机没有安装微信,请安装后使用该功能", Toast.LENGTH_LONG).show(); }
《-----------到这里就结束了以下的以下都是遇见问题的解决办法,希望对自己有帮助对大家有帮助---------》
最后如果出现以下问题isWebchatAvaliable()检查微信不好用请换成以下:
最后如果出现以下问题
做微信分享功能,遇到这个问题,在网上也没找到答案。最后发现问题解决了,我出现这个问题的原因是: APP_ID 的 错误,APP_ID一般以 wx 开头的18个字节长度的字符串。也就是说你的微信ID不对。
更多相关文章
- android 状态栏、标题栏、屏幕高度
- Android获取内存的不同方法总结
- Android(安卓)- 动态设置自定义View的id - setId
- Android(安卓)获取全国城市列表类似于联系人排序(二)
- CardView兼容处理
- Android中proguard的作用
- Android解决设置(background)属性的时候图片会被拉伸问题
- Android(安卓)开发有用代码积累
- android 物理键盘布局