Android-接入微信分享

本文介绍了OS X系统上,Android接入微信分享的流程。

注册账户

首先,需要到微信开放平台上注册账号,并创建应用,这里主要需要注意两点:

packageName:应用包名
sign:签名,一个32位的MD5值

签名这个,需要用到一个签名工具,将其安装到手机上,输入应用的包名即可。

待审核过后,可以拿到应用的两个值:

APP_ID:关键的值,用于微信校验
APP_SECRET:密钥,分享的时候不需要用

导入SDK

下载微信开放平台SDK,并将其中的:

libammssdk.jar

放到libs目录下,并将其添加到Build Path中。

配置AndroidManifest.xml

在AndroidManifest.xml中添加权限:
<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"/>
创建鉴权Receiver:
<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>
创建微信分享的Activity
<activity    
    android:name=".SendToWXActivity"
    android:label="@string/app_name"
    android:theme="@style/MMTheme.Basic"/>
创建微信回调的Activity
<activity
    android:name=".wxapi.WXEntryActivity"
    android:label="@string/app_name"
    android:exported="true"
    android:launchMode="singleTop">
</activity>

这里,注意exported属性必须为true

实现鉴权Receiver

public class AppRegister extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        final IWXAPI api = WXAPIFactory.createWXAPI(context, null);
        // 将该app注册到微信
        api.registerApp(Constants.APP_ID);
    }
}

实现微信分享Activity

public class SendToWXActivity extends Activity {
    private Button myButton = null;
    private IWXAPI api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.send_to_wx);

        api = WXAPIFactory.createWXAPI(this, Enum.APP_ID, false);

        myButton = (Button)findViewById(R.id.button1);
        myButton.setOnClickListener(new View.OnClickListener() {
           @Override
            public void onClick(View v) {
                // 初始化一个WXTextObject对象
                WXTextObject textObj = new WXTextObject();
                String text = "kobe";
                textObj.text = text;

                // 用WXTextObject对象初始化一个WXMediaMessage对象
                WXMediaMessage msg = new WXMediaMessage();
                msg.mediaObject = textObj;
                msg.description = text;

                // 构造一个Req
                SendMessageToWX.Req req = new SendMessageToWX.Req();
                req.transaction = buildTransaction("text");
                req.message = msg;
                req.scene = SendMessageToWX.Req.WXSceneSession;

                // 调用api接口发送数据到微信
                api.sendReq(req);
                finish();
            }
        });
    }

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

实现微信回调Activity

注意,需要在项目包下创建一个子包,并命名为wxapi,在该包中创建WXEntryActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, Enum.APP_ID, false);
api.handleIntent(getIntent(), this);
}

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}

public void onReq(BaseReq arg0) {
Log.e("微信", "BaseReq:" + arg0.getType());
switch (arg0.getType()) {
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
Log.e("", "ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX");
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
Log.e("", "ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX");
break;
default:
break;
}
finish();
}

public void onResp(BaseResp arg0) {
Log.e("微信", "BaseResp:" + arg0.errCode);
String result = "";
switch (arg0.errCode) {
case BaseResp.ErrCode.ERR_OK:
result = "分享成功";
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = "取消分享";
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = "认证失败";
break;
default:
result = "errcode_unknown";
break;
}

Toast.makeText(this, result, Toast.LENGTH_LONG).show();
finish();
}

}

常见问题

认证失败:这种情况一般是包名、APP_ID、签名三者不对应,一一检查后,即可解决,签名发生变化时,需要到微信开放平台上进行修改。还有可能是创建了多个鉴权Receiver,要仔细检查。