Android应用接入微信分享

最近项目中要接入微信分享,记录下接入流程

注册应用信息并下载必要工具

  1. 微信开放平台注册应用信息

注意:由于一般调试签名和正式签名不一致,测试时可填入测试包的签名,上线时需要改为正式包的签名

接入

build.gradle中,添加如下依赖:

dependencies {
    compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}

或:

dependencies {
    compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}

其中,前者包含统计功能

AndroidManifest.xml中添加权限和微信回调Activity

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<!-- for mta statistics -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<activity
    android:name=".WXEntryActivity"
    android:exported="true"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme.Fullscreen.Translucent"/>

这里使用了一个透明的Activity来处理微信分享结果回调

  • 主题
<style name="AppTheme.Fullscreen" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowTranslucentNavigation" tools:targetApi="kitkat">true</item>
</style>

<style name="AppTheme.Fullscreen.Translucent">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
</style>
  • Activity
    当微信分享成功,点击返回App时,微信会主动调用WXEntryActivity,并将结果通过Intent传给WXEntryActivity,此时调用api.handleIntent(getIntent(), this)对结果进行处理,handleIntent第二个参数为IWXAPIEventHandler,分享结果会在onResp方法中处理,在这里我们发送一个广播,并在WXShare对象中对该广播进行监听
public class WXEntryActivity extends BaseActivity implements IWXAPIEventHandler {

        private IWXAPI api;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Logger.i("WXEntryActivity");
            WXShare share = new WXShare(this);
            api = share
    //                .register()
                    .getApi();

            //注意:
            //第三方开发者如果使用透明界面来实现WXEntryActivity,需要判断handleIntent的返回值,如果返回值为false,则说明入参不合法未被SDK处理,应finish当前透明界面,避免外部通过传递非法参数的Intent导致停留在透明界面,引起用户的疑惑
            try {
                if (!api.handleIntent(getIntent(), this)) {
                    finish();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);

            Logger.i("onNewIntent");
            setIntent(intent);
            if (!api.handleIntent(intent, this)) {
                finish();
            }
        }

        @Override
        public void onReq(BaseReq baseReq) {
        }

        @Override
        public void onResp(BaseResp baseResp) {
            Intent intent = new Intent(WXShare.ACTION_SHARE_RESPONSE);
            intent.putExtra(WXShare.EXTRA_RESULT, new WXShare.Response(baseResp));
            sendBroadcast(intent);
            finish();
        }

    }
  • 工具类
public class WXShare {

        public static final String APP_ID = "wx0123456789";
        public static final String ACTION_SHARE_RESPONSE = "action_wx_share_response";
        public static final String EXTRA_RESULT = "result";

        private final Context context;
        private final IWXAPI api;
        private OnResponseListener listener;
        private ResponseReceiver receiver;

        public WXShare(Context context) {
            api = WXAPIFactory.createWXAPI(context, APP_ID);
            this.context = context;
        }

        public WXShare register() {
            // 微信分享
            api.registerApp(APP_ID);
            receiver = new ResponseReceiver();
            IntentFilter filter = new IntentFilter(ACTION_SHARE_RESPONSE);
            context.registerReceiver(receiver, filter);
            return this;
        }

        public void unregister() {
            try {
                api.unregisterApp();
                context.unregisterReceiver(receiver);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        public WXShare share(String text) {
            WXTextObject textObj = new WXTextObject();
            textObj.text = text;

            WXMediaMessage msg = new WXMediaMessage();
            msg.mediaObject = textObj;
    //        msg.title = "Will be ignored";
            msg.description = text;

            SendMessageToWX.Req req = new SendMessageToWX.Req();
            req.transaction = buildTransaction("text");
            req.message = msg;
            req.scene = SendMessageToWX.Req.WXSceneSession;

            boolean result = api.sendReq(req);
            Logger.i("text shared: " + result);
            return this;
        }

        public IWXAPI getApi() {
            return api;
        }

        public void setListener(OnResponseListener listener) {
            this.listener = listener;
        }

        private String buildTransaction(final String type) {
            return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
        }

        private class ResponseReceiver extends BroadcastReceiver {

            @Override
            public void onReceive(Context context, Intent intent) {
                Response response = intent.getParcelableExtra(EXTRA_RESULT);
                Logger.d("type: " + response.getType());
                Logger.d("errCode: " + response.errCode);
                String result;
                if (listener != null) {
                    if (response.errCode == BaseResp.ErrCode.ERR_OK) {
                        listener.onSuccess();
                    } else if (response.errCode == BaseResp.ErrCode.ERR_USER_CANCEL) {
                        listener.onCancel();
                    } else {
                        switch (response.errCode) {
                            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                                result = "发送被拒绝";
                                break;
                            case BaseResp.ErrCode.ERR_UNSUPPORT:
                                result = "不支持错误";
                                break;
                            default:
                                result = "发送返回";
                                break;
                        }
                        listener.onFail(result);
                    }
                }
            }
        }

        public static class Response extends BaseResp implements Parcelable {

            public int errCode;
            public String errStr;
            public String transaction;
            public String openId;

            private int type;
            private boolean checkResult;

            public Response(BaseResp baseResp) {
                errCode = baseResp.errCode;
                errStr = baseResp.errStr;
                transaction = baseResp.transaction;
                openId = baseResp.openId;
                type = baseResp.getType();
                checkResult = baseResp.checkArgs();
            }

            @Override
            public int getType() {
                return type;
            }

            @Override
            public boolean checkArgs() {
                return checkResult;
            }


            @Override
            public int describeContents() {
                return 0;
            }

            @Override
            public void writeToParcel(Parcel dest, int flags) {
                dest.writeInt(this.errCode);
                dest.writeString(this.errStr);
                dest.writeString(this.transaction);
                dest.writeString(this.openId);
                dest.writeInt(this.type);
                dest.writeByte(this.checkResult ? (byte) 1 : (byte) 0);
            }

            protected Response(Parcel in) {
                this.errCode = in.readInt();
                this.errStr = in.readString();
                this.transaction = in.readString();
                this.openId = in.readString();
                this.type = in.readInt();
                this.checkResult = in.readByte() != 0;
            }

            public static final Creator<Response> CREATOR = new Creator<Response>() {
                @Override
                public Response createFromParcel(Parcel source) {
                    return new Response(source);
                }

                @Override
                public Response[] newArray(int size) {
                    return new Response[size];
                }
            };
        }

    }
  • 接口
public interface OnResponseListener {
    void onSuccess();

    void onCancel();

    void onFail(String message);
}

使用

在需要使用微信分享的Activity中:

@Override
protected void onCreate(Bundle savedInstanceState) {
    wxShare = new WXShare(this);
    wxShare.setListener(new OnResponseListener() {
        @Override
        public void onSuccess() {
            // 分享成功
        }

        @Override
        public void onCancel() {
            // 分享取消
        }

        @Override
        public void onFail(String message) {
            // 分享失败
        }
    });
}

@Override
protected void onStart() {
    super.onStart();
    wxShare.register();
}

@Override
protected void onDestroy() {
    wxShare.unregister();
    super.onDestroy();
}

启动分享

wxShare.share("这是要分享的文字");

到这里微信分享就完成啦!

另外,在微信官方例程中,有个定时刷新应用注册信息的receiver
AndroidManifest.xml中添加:

<receiver
    android:name=".AppRegister"
    android:permission="com.tencent.mm.plugin.permission.SEND">
    <intent-filter>
        <action android:name="com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP"/>
    </intent-filter>
</receiver>

代码:

public class AppRegister extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        final IWXAPI api = WXAPIFactory.createWXAPI(context, null);

        // 将该app注册到微信
        api.registerApp(WXShare.APP_ID);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,364评论 25 707
  • 转载需要著名出处: 之前写过微信登录分享支付第一版: 前言 大部分的app都有接入第三方sdk的需求。例如第三方登...
    Android开发666阅读 6,432评论 3 38
  • 社交红利阅读笔记 书名:社交红利(修订升级版) 作者:徐志斌 出版社:中信出版社 正文前笔记: 推荐序1摘要 社交...
    凫水阅读 8,894评论 4 26
  • 文 | 马十三 爱情故事05 执一人之手,与一人偕老。不知是现在节奏太快,还是我们早已在追寻爱情的路上,迷失了自我...
    马十三阅读 978评论 26 20
  • 毕业中期答辩快要来了。怕怕的。想到导师的脸,我就心里难受。厚厚的嘴唇,扁平的大脸,大而宽的鼻子。骂骂咧咧的样子。。...
    1bb89670b82f阅读 187评论 0 0