微信登录和分享

公司中的项目需要用到微信的登录和分享功能,自己最开始通过官方的接入文档实现,但是总会有些奇怪的问题出现,然后就各种百度,跪求大神最终实现了登录和分享功能。这里简单分享下自己的接入过程:
程序的接入申请和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()) {
            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();
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值