第三方分享第一弹----微信分享
来源:互联网 发布:极客邦科技软件 编辑:程序博客网 时间:2024/05/20 03:37
第三方分享第一弹----微信分享
大家都知道,分享功能几乎是所有APP都需要的基础功能,为了让大家免于到处去找资料,我这里简单的做了一下总结,也算是自己学习的一个记录。
下面我们先来看下微信的分享功能。
官方资料
首先,想要微信的分享,需要我们去微信公众平台创建我们的应用,这个其实很简单啦,大家按照步骤一步一步来就可以啦,应用审核一般两到三天就可以了,待审核通过以后就可以开始安心的敲代码啦.
微信的分享支持文本,视频,音频,图片,网页甚至小程序,在这里我们来看下官方介绍的方法:
官方文档传送门
首先我们需要依赖微信的第三方库:
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.1.6'
分享之前需要创建api对象,如下:
IWXAPI api;// WXAPIFactory工厂,获取IWXAPI实例api = WXAPIFactory.createWXAPI(context, Constants.WeChat_APPID, false);// 注册应用boolean flag = api.registerApp(Constants.WeChat_APPID); // 你申请应用的APPID
1.文本分享
WXTextObject textObject = new WXTextObject();textObject.text = "hello";//你要分享出去的文本WXMediaMessage msg = new WXMediaMessage();msg.mediaObject = textObject;msg.description = "hello";SendMessageToWX.Req req = new SendMessageToWX.Req();req.transaction = buildTransaction("text");// 唯一标识一个请求req.message = msg;// 发送到聊天界面——WXSceneSession// 发送到朋友圈——WXSceneTimeline// 添加到微信收藏——WXSceneFavoritereq.scene = SendMessageToWX.Req.WXSceneSession;api.sendReq(req);
2.图片分享
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.share_pic); WXImageObject imageObject = new WXImageObject(bitmap); WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = imageObject; //设置缩略图 Bitmap bmp = Bitmap.createScaledBitmap(bitmap,80,80,true); bitmap.recycle(); msg.thumbData = BitmapUtils.Bitmap2Bytes(bmp); SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("text");// 唯一标识一个请求 req.message = msg; req.scene = SendMessageToWX.Req.WXSceneSession; api.sendReq(req);
3.音乐分享
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.share_pic); WXMusicObject musicObject = new WXMusicObject(); musicObject.musicUrl = "音乐url"; WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = musicObject; msg.title = "音乐标题"; msg.description = "音乐描述"; //设置缩略图 Bitmap bmp = Bitmap.createScaledBitmap(bitmap,80,80,true); bitmap.recycle(); msg.thumbData = BitmapUtils.Bitmap2Bytes(bmp); SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("music");// 唯一标识一个请求 req.message = msg; req.scene = SendMessageToWX.Req.WXSceneSession; api.sendReq(req);
4.视频分享
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.share_pic); WXMusicObject musicObject = new WXMusicObject(); musicObject.musicUrl = "视频url"; WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = musicObject; msg.title = "视频标题"; msg.description = "视频描述"; //设置缩略图 Bitmap bmp = Bitmap.createScaledBitmap(bitmap,80,80,true); bitmap.recycle(); msg.thumbData = BitmapUtils.Bitmap2Bytes(bmp); SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("video");// 唯一标识一个请求 req.message = msg; req.scene = SendMessageToWX.Req.WXSceneSession; api.sendReq(req);
5.网页分享
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.share_pic); WXMusicObject musicObject = new WXMusicObject(); musicObject.musicUrl = "网页url"; WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = musicObject; msg.title = "网页标题"; msg.description = "网页描述"; //设置缩略图 Bitmap bmp = Bitmap.createScaledBitmap(bitmap,80,80,true); bitmap.recycle(); msg.thumbData = BitmapUtils.Bitmap2Bytes(bmp); SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("webpage");// 唯一标识一个请求 req.message = msg; req.scene = SendMessageToWX.Req.WXSceneSession; api.sendReq(req);
小程序的我们暂时就不做分享了,但是从上面的官方案例中我们可以看出分享的代码高度一致,所以小编我就顺便优化了一下,代码如下,不喜勿喷:
经过优化封装后
public class WeChatShare { // 第三方APP和微信通信的openApi接口 private static IWXAPI iwxapi; private static Context mContext; private int share_to = WxShareTo.share_session; private int share_type = -1; private String url = ""; private String title = ""; private String description = ""; private String shareText = ""; private Bitmap imageBitmap = null; private String miniProgramId = ""; private String miniProgramPath = ""; public static WeChatShare regToWx(Context context) { mContext = context; // WXAPIFactory工厂,获取IWXAPI实例 iwxapi = WXAPIFactory.createWXAPI(context, Constants.WeChat_APPID, false); // 注册应用 boolean flag = iwxapi.registerApp(Constants.WeChat_APPID); Toast.makeText(context, "flag:" + flag, Toast.LENGTH_SHORT).show(); return new WeChatShare(); } public WeChatShare setWhere(@WxShareTo int shareTo) { share_to = shareTo; return this; } /** * 分享的类型 * * @param type * * @return */ public WeChatShare setType(@WxShareType int type) { share_type = type; return this; } /** * 分享的Url * * @param url * * @return */ public WeChatShare addUrl(String url) { this.url = url; return this; } /** * 分享的标题 * * @param title * * @return */ public WeChatShare addTitle(String title) { this.title = title; return this; } /** * 描述 * * @param description * * @return */ public WeChatShare addDescription(String description) { this.description = description; return this; } /** * 分享的图片url * * @param imageUrl * * @return */ public WeChatShare addImage(String imageUrl) { if (TextUtils.isEmpty(imageUrl)) { throw new NullPointerException("imageUrl is empty."); } addImage(BitmapUtils.getBitmap(imageUrl)); return this; } /** * 分享的图片资源ID * * @param imageResource * * @return */ public WeChatShare addImage(int imageResource) { addImage(BitmapFactory.decodeResource(mContext.getResources(), imageResource)); return this; } /** * 分享的图片bitmap * * @param imageBitmap * * @return */ public WeChatShare addImage(Bitmap imageBitmap) { this.imageBitmap = imageBitmap; return this; } /** * 分享的wenbennr * * @param shareText * * @return */ public WeChatShare addShareText(String shareText) { this.shareText = shareText; return this; } /** * 分享小程序的原始Id * * @param miniProgramId * * @return */ public WeChatShare addMiniProgramId(String miniProgramId) { this.miniProgramId = miniProgramId; return this; } /** * 分享小程序的path * * @param miniProgramPath * * @return */ public WeChatShare addMiniProgramPath(String miniProgramPath) { this.miniProgramPath = miniProgramPath; return this; } public void share() { WXMediaMessage msg = new WXMediaMessage(); if (share_type < 0) { throw new NullPointerException("you should set share type first."); } // 标题 if (!TextUtils.isEmpty(title)) { msg.title = title; } // 描述 if (!TextUtils.isEmpty(description)) { msg.description = description; } String transaction = ""; switch (share_type) { case WxShareType.type_text: // 分享文本 transaction = "text"; msg.description = shareText; WXTextObject textObject = new WXTextObject(); textObject.text = shareText; msg.mediaObject = textObject; break; case WxShareType.type_image: // 分享图片 transaction = "img"; if (null == imageBitmap) { throw new NullPointerException("bitmap is null."); } msg.mediaObject = new WXImageObject(imageBitmap); break; case WxShareType.type_video: // 分享视频 transaction = "video"; WXVideoObject videoObject; videoObject = new WXVideoObject(); videoObject.videoUrl = url; msg.mediaObject = videoObject; break; case WxShareType.type_music: // 分享音频 transaction = "music"; WXMusicObject musicObject = new WXMusicObject(); musicObject.musicUrl = url; msg.mediaObject = musicObject; break; case WxShareType.type_webPage: // 分享网页 transaction = "webpage"; WXWebpageObject webpageObject = new WXWebpageObject(); webpageObject.webpageUrl = url; msg.mediaObject = webpageObject; break; case WxShareType.type_miniProgram: /** * 注: 要求发起分享的App与小程序属于同一微信开放平台帐号。 * 小程序的原始ID获取方法:登录小程序后台-设置-基本设置-帐号信息 */ // 分享小程序 if (TextUtils.isEmpty(miniProgramId)) { throw new NullPointerException("miniProgramId is empty."); } if (TextUtils.isEmpty(miniProgramPath)) { throw new NullPointerException("miniProgramPath is empty."); } if (TextUtils.isEmpty(url)) { throw new NullPointerException("the url for lower WeChat to open is empty."); } transaction = "webpage"; WXMiniProgramObject miniProgramObject = new WXMiniProgramObject(); miniProgramObject.webpageUrl = url;// 低版本微信将打开的url miniProgramObject.userName = miniProgramId; // 跳转的小程序的原始ID miniProgramObject.path = miniProgramPath; // 小程序的path msg.mediaObject = miniProgramObject; break; } // 缩略图 if (null != imageBitmap) { Bitmap bmp = Bitmap.createScaledBitmap(imageBitmap, 80, 80, true); imageBitmap.recycle(); msg.thumbData = BitmapUtils.Bitmap2Bytes(bmp); } sendMsg(msg, transaction); } /** * 调起微信分享 * * @param mediaMessage */ private void sendMsg(WXMediaMessage mediaMessage, String transaction) { if (!AppUtils.getInstance(mContext).isAppAvilible(AppUtils.WX_PKGNAME)) { Toast.makeText(mContext, "您还未安装微信客户端,请先安装.", Toast.LENGTH_SHORT).show(); return; } if (TextUtils.isEmpty(transaction)) { throw new NullPointerException("you should set share type first."); } // 构造Req SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction(transaction); req.message = mediaMessage; req.scene = share_to; iwxapi.sendReq(req); } private String buildTransaction(String type) { return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis(); }}
分享位置的参数值:
@IntDef ({ share_session, share_timeline, share_favorite })// 枚举数据@Retention (RetentionPolicy.SOURCE) //告诉编译器在生成.class文件时不保留枚举注解数据public @interface WxShareTo { // 发送到聊天界面——WXSceneSession int share_session = SendMessageToWX.Req.WXSceneSession; // 发送到朋友圈——WXSceneTimeline int share_favorite = SendMessageToWX.Req.WXSceneFavorite; // 添加到微信收藏——WXSceneFavorite int share_timeline = SendMessageToWX.Req.WXSceneTimeline;}
分享类型的参数值:
@IntDef ({ type_text, type_image, type_video, type_music, type_webPage, type_miniProgram })//枚举类型@Retention (RetentionPolicy.SOURCE) //告诉编译器在生成.class文件时不保留枚举注解数据public @interface WxShareType { int type_text = 0; int type_image = 1; int type_video = 2; int type_music = 3; int type_webPage = 4; int type_miniProgram = 5;}
相关工具类:
AppUtils.class
public class AppUtils { public static AppUtils instance; public static Context mContext; public static final String QQ_PKGNAME = "com.tencent.mobileqq"; public static final String WX_PKGNAME = "com.tencent.mm"; public static AppUtils getInstance(Context context) { mContext = context; if (null == instance) { synchronized (AppUtils.class) { if (null == instance) { instance = new AppUtils(); } } } return instance; } public boolean isAppAvilible(String pkgName) { final PackageManager packageManager = mContext.getPackageManager();// 获取packagemanager List<PackageInfo> 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; }}
BitmapUtils.class
public class BitmapUtils { /** * 将图片内容解析成字节数组 * * @param inStream * * @return byte[] * * @throws Exception */ public static byte[] readStream(InputStream inStream) throws Exception { byte[] buffer = new byte[1024]; int len = -1; ByteArrayOutputStream outStream = new ByteArrayOutputStream(); while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } byte[] data = outStream.toByteArray(); outStream.close(); inStream.close(); return data; } /** * 将字节数组转换为ImageView可调用的Bitmap对象 * * @param bytes * @param opts * * @return Bitmap */ public static Bitmap getPicFromBytes(byte[] bytes, BitmapFactory.Options opts) { if (bytes != null) { if (opts != null) { return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts); } else { return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); } } return null; } /** * 图片缩放 * * @param bitmap 对象 * @param w 要缩放的宽度 * @param h 要缩放的高度 * * @return newBmp 新 Bitmap对象 */ public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); float scaleWidth = ((float) w / width); float scaleHeight = ((float) h / height); matrix.postScale(scaleWidth, scaleHeight); Bitmap newBmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); return newBmp; } /** * 把Bitmap转Byte */ public static byte[] Bitmap2Bytes(Bitmap bm) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); return baos.toByteArray(); } /** * 把字节数组保存为一个文件 */ public static File getFileFromBytes(byte[] b, String outputFile) { BufferedOutputStream stream = null; File file = null; try { file = new File(outputFile); FileOutputStream fstream = new FileOutputStream(file); stream = new BufferedOutputStream(fstream); stream.write(b); } catch (Exception e) { e.printStackTrace(); } finally { if (stream != null) { try { stream.close(); } catch (IOException e1) { e1.printStackTrace(); } } } return file; } public static Bitmap getBitmap(String url) { Bitmap bm = null; try { URL iconUrl = new URL(url); URLConnection conn = iconUrl.openConnection(); HttpURLConnection http = (HttpURLConnection) conn; int length = http.getContentLength(); conn.connect(); // 获得图像的字符流 InputStream is = conn.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is, length); bm = BitmapFactory.decodeStream(bis); bis.close(); is.close();// 关闭流 } catch (Exception e) { e.printStackTrace(); } return bm; }}
使用起来也很简单,如果你看过gilde或者picasso的源码,那么,一眼就能看出来该怎么使用了,在此,仅做一个文本分享的示例:
WeChatShare.regToWx(this)// 注册APP到微信 .setWhere(WxShareTo.share_session)// 设置分享到哪边 .setType(WxShareType.type_text) // 设置分享的类型 .addShareText("你好") // 文本分享添加要分享的文本 .share(); // 发起分享请求
当然有分享就该有回调,这里需要注意的是,微信规定了回调类的格式,首先你需要在包名文件夹下新建wxapi 文件夹,然后在创建 WXEntryActivity 类集成自Activity并实现微信的IWXAPIEventHandler接口,然后就可以在onReq和onResq中得到回调内容,如下:
public class WXEntryActivity extends Activity implements IWXAPIEventHandler { public static final String TAG = WXEntryActivity.class.getSimpleName().trim(); private IWXAPI api; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView currrentTextView = new TextView(this); setContentView(currrentTextView); api = WXAPIFactory.createWXAPI(this, Constants.WeChat_APPID, false); api.handleIntent(getIntent(), this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); api.handleIntent(intent, this); } @Override public void onReq(BaseReq baseReq) { Log.i(TAG, "onReq: "); } @Override public void onResp(BaseResp resp) { int errorCode = resp.errCode; Log.i(TAG, "onResp: " + errorCode); switch (errorCode) { case BaseResp.ErrCode.ERR_OK: //用户同意 //String code = ((SendAuth.Resp) resp).code; Log.i(TAG, "ERR_OK: "); break; case BaseResp.ErrCode.ERR_AUTH_DENIED: //用户拒绝 Log.i(TAG, "ERR_AUTH_DENIED: "); break; case BaseResp.ErrCode.ERR_USER_CANCEL: //用户取消 Log.i(TAG, "ERR_USER_CANCEL: "); break; default: break; } }}
自此,微信分享介绍完毕,不足之处,欢迎指正。
阅读全文
0 0
- 第三方分享第一弹----微信分享
- 微信第三方分享
- 微信第三方登陆 与分享
- QQ 微信 第三方登录 分享
- 第三方 ShareSdk QQ、微信分享
- 集成微信的第三方分享
- iOS 开发 第三方分享 微信朋友圈分享
- Android:QQ分享、微信分享、朋友圈分享(不使用第三方SDK)
- Android:QQ分享、微信分享、朋友圈分享(不使用第三方SDK)
- Android:QQ分享、微信分享、朋友圈分享(不使用第三方SDK)
- 第三方分享微信分享、朋友圈分享之iOS开发/Android开发
- Android 第三方QQ、微信、微博登录分享
- getting started 微信 第三方app分享到朋友圈
- Android调用第三方的微信分享功能
- 第三方应用之微信登录与分享!
- Android-studio原生微信第三方登录、分享
- 微信IOS SDK1.4.2第三方APP内容分享
- 不使用第三方分享到微信(安装微信)
- ButterKnife学习笔记【四】--- Fragment中的绑定
- 网络接口调试工具
- 并查集详解
- 微信小程序使用第三方库(第三方js)问题
- ButterKnife学习笔记【五】---Adapter中的绑定
- 第三方分享第一弹----微信分享
- 闭包
- JavaScript -- 事件
- Java 之 HTTP请求乱码解决,GZIP 返回值乱码解决
- nginx 核心应用和配置
- node mongoose
- 文件夹中图像生成txt文本 img2txt
- SIFT特征表达
- python篇3_函数