您的位置:首页 > 移动开发 > 微信开发

微信登录和分享

2016-05-16 16:46 429 查看
公司中的项目需要用到微信的登录和分享功能,自己最开始通过官方的接入文档实现,但是总会有些奇怪的问题出现,然后就各种百度,跪求大神最终实现了登录和分享功能。这里简单分享下自己的接入过程:

程序的接入申请和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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息