Android应用接入微信分享

作者: fengmlo | 来源:发表于2017-07-05 17:04 被阅读5732次

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

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

    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);
        }
    }
    

    相关文章

      网友评论

      • 痴迷_d6b5:可以分享朋友圈吗大佬?
      • coolzpw:有源码吗= =
        fengmlo:@coolzpw 不谢,希望能帮到你
        coolzpw:@fengmlo 好的 谢谢你拉
        fengmlo:文章里的代码拷出来能用,没有专门整理成Demo
      • 夜幕流星雨:写的很好,工具类日没有分享图片,地址的方法

      本文标题:Android应用接入微信分享

      本文链接:https://www.haomeiwen.com/subject/fsyqhxtx.html