微信登录和分享
2016-05-16 16:46
429 查看
公司中的项目需要用到微信的登录和分享功能,自己最开始通过官方的接入文档实现,但是总会有些奇怪的问题出现,然后就各种百度,跪求大神最终实现了登录和分享功能。这里简单分享下自己的接入过程:
程序的接入申请和SDK导入项目的过程这里就不做过多的介绍,主要介绍代码的实现部分
1.微信接受Activity在清单界面的注册
如果想成功接收到微信的结果回调我们需要注册并实现微信提供的WXEntryActivity。这一步应该比较简单,但是无语的是必须按照在申请账号是上传的包名放置该Activity。这有时会破坏我们的目录结构。我们可以通过为Activity设置别名activity-alias属性来解决这个问题。
2.在WXEntryActivity中处理微信的结果的回调
我这里使用了EventBus来进行结果的传递,如果项目中没有引入EventBus也可以通过广播来实现。
3.登录功能的实现核心代码
在调用微信登录界面的onCreate()方法中初始化IWXAPI微信的API接口
调用登录的方法拉起登录界面
成功拉起登录界面必须是签名包
4.分享功能实现的核心代码
微信分享时图片转字节数组的方法
程序的接入申请和SDK导入项目的过程这里就不做过多的介绍,主要介绍代码的实现部分
1.微信接受Activity在清单界面的注册
如果想成功接收到微信的结果回调我们需要注册并实现微信提供的WXEntryActivity。这一步应该比较简单,但是无语的是必须按照在申请账号是上传的包名放置该Activity。这有时会破坏我们的目录结构。我们可以通过为Activity设置别名activity-alias属性来解决这个问题。
<activity //按照你实际放置在项目中的位置进行注册 android:name=".personal.wxapi.WXEntryActivity" android:exported="true" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> //为Activity设置别名,设置目标Activity <activity-alias android:name="你的包名.WXEntryActivity" android:enabled="true" android:exported="true" android:targetActivity=".personal.wxapi.WXEntryActivity" />
2.在WXEntryActivity中处理微信的结果的回调
我这里使用了EventBus来进行结果的传递,如果项目中没有引入EventBus也可以通过广播来实现。
public class WXEntryActivity extends Activity implements IWXAPIEventHandler { private IWXAPI api; public static final String APP_ID = "你申请的AppId"; /** * 微信的回调类型,分享,登录,失败 */ public enum Type { SHARE, LOGIN, FAIL } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); api = WXAPIFactory.createWXAPI(this, APP_ID, true); api.handleIntent(getIntent(), this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this); } @Override public void onReq(BaseReq arg0) { } @Override public void onResp(BaseResp resp) { switch (resp.errCode) { case BaseResp.ErrCode.ERR_OK: // 登录成功的回调 登录成功后resp的返回类型为 SendAuth.Resp if (resp instanceof SendAuth.Resp) { SendAuth.Resp sResp = (SendAuth.Resp) resp; EventBus.getDefault().post(sResp); } else { // 分享成功的回调 EventBus.getDefault().post(Type.SHARE); } break; case BaseResp.ErrCode.ERR_USER_CANCEL: case BaseResp.ErrCode.ERR_AUTH_DENIED: Toast.makeText(this, "取消操作", Toast.LENGTH_SHORT).show(); EventBus.getDefault().post(Type.FAIL); break; default: Toast.makeText(this, "操作失败", Toast.LENGTH_SHORT).show(); EventBus.getDefault().post(Type.FAIL); break; } //在结果成功回调后接受当前的Activity this.finish(); } }
3.登录功能的实现核心代码
在调用微信登录界面的onCreate()方法中初始化IWXAPI微信的API接口
iwxapi = WXAPIFactory.createWXAPI(getContext(), WXEntryActivity.APP_ID); // 将微信注册到应用程序上。 iwxapi.registerApp(WXEntryActivity.APP_ID);
调用登录的方法拉起登录界面
成功拉起登录界面必须是签名包
//微信登录 private void weChatLogin() { SendAuth.Req req = new SendAuth.Req(); //设置登录后所获取的权限 req.scope = "snsapi_userinfo"; //用户客户端的信息验证 req.state = getContext().getPackageName(); if (!iwxapi.isWXAppInstalled()) { Toast.makeText(getContext(), "请先安装微信客户端", Toast.LENGTH_SHORT).show(); return; } if (!iwxapi.isWXAppSupportAPI()) { Toast.makeText(getContext(), "请先更新微信客户端", Toast.LENGTH_SHORT).show(); return; } //调用该方法拉起微信的登录界面 iwxapi.sendReq(req); }
4.分享功能实现的核心代码
/** * 微信分享 */ private void shareToWeChat(boolean isTimeLine) { if (!iwxapi.isWXAppInstalled()) { Toast.makeText(getContext(), "请先安装微信客户端", Toast.LENGTH_SHORT).show(); return; } if (!iwxapi.isWXAppSupportAPI() 4000 ) { Toast.makeText(getContext(), "请先更新微信客户端", Toast.LENGTH_SHORT).show(); return; } WXWebpageObject webpage = new WXWebpageObject(); webpage.webpageUrl = GFAN_DOWNLOAD_URL; WXMediaMessage msg = new WXMediaMessage(webpage); //分享内容的标题 msg.title = SHARE_TEXT; //分享内容的图片 Bitmap thumb = BitmapFactory.decodeResource(getResources(), R.mipmap.gm3_logo); msg.thumbData = Util.getBitmapBytes(thumb, false); SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = System.currentTimeMillis() + ""; req.message = msg; req.scene = isTimeLine ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession; iwxapi.sendReq(req); }
微信分享时图片转字节数组的方法
/** * bitmap 转换为字节数组 */ // 需要对图片进行处理,否则微信会在log中输出thumbData检查错误 public static byte[] getBitmapBytes(Bitmap bitmap, boolean paramBoolean) { Bitmap localBitmap = Bitmap.createBitmap(80, 80, Bitmap.Config.RGB_565); Canvas localCanvas = new Canvas(localBitmap); int i; int j; if (bitmap.getHeight() > bitmap.getWidth()) { i = bitmap.getWidth(); j = bitmap.getWidth(); } else { i = bitmap.getHeight(); j = bitmap.getHeight(); } while (true) { localCanvas.drawBitmap(bitmap, new Rect(0, 0, i, j), new Rect(0, 0, 80, 80), null); if (paramBoolean) bitmap.recycle(); ByteArrayOutputStream localByteArrayOutputStream = new ByteArrayOutputStream(); localBitmap.compress(Bitmap.CompressFormat.JPEG, 100, localByteArrayOutputStream); localBitmap.recycle(); byte[] arrayOfByte = localByteArrayOutputStream.toByteArray(); try { localByteArrayOutputStream.close(); return arrayOfByte; } catch (Exception e) { // F.out(e); } i = bitmap.getHeight(); j = bitmap.getHeight(); } }
相关文章推荐
- 社交巨头三国杀:微信、WhatsApp、Line到底有啥区别?
- 【CF 应用开发大赛】IT Share(IT分享网)
- 微信悄悄升级群聊功能:个人微信营销号的福音
- 突击部队拼多多
- 我是运营,我没有假期
- 如何做到日消息量100万的微信公众号?
- 论微信取消推送功能的可能性(原创)
- 微信的成功,靠的是QQ导流吗?
- 「Linux 中国」2018 微信文章排行榜
- 马化腾亲自“站台” 企业微信和个人微信互通能带来什么?
- 一个微信群的兴亡
- 微信服务号推送模板消息接口
- 我也有微信朋友圈了 Android实现
- 新版本susymenu树形菜单,请大家指教、分享
- PHP限制页面只能在微信自带浏览器访问的代码
- javascript实现类似百度分享功能的方法
- HTML5实现微信拍摄上传照片功能