- 准备材料:
- 微信开发者账号
- 注册你的APP
- libammsdk.jar包
- debug.keystore文件
准备工作
申请你的APPID
导入libammsdk.jar包
-
在AndroidManifest.xml中设置权限
<uses-permission android:name="android.permission.INTERNET"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-
注册APP到微信
private static final String App_Id = "你注册的APP_ID"; private IWXAPI api; public void registerToWX(){ api = WXAPIFactory.createWXAPI(this, App_Id, true); api.registerApp(App_ID); }
分享:
-
分享(以分享图片为例)
直接触发分享图片按钮的点击事件findViewById(R.id.send_img).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_img); WXImageObject imgObj = new WXImageObject(bmp); WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = imgObj; Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 150, 150, true); bmp.recycle(); msg.thumbData = Util.bmpToByteArray(thumbBmp, true); SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("img"); req.message = msg; req.scene = SendMessageToWX.Req.WXSceneTimeline; SendMessageToWX.Req.WXSceneSession; api.sendReq(req); finish(); } });
其中req.scene表示分享选择分别代表分享到朋友圈和会话框
Util是一个图片处理的类
登录
-
登录需要重新APP到微信,需要触发回调,下面直接上代码:
package com.lht.pan_android.wxapi; import org.apache.http.Header; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.alibaba.fastjson.JSON; import com.lht.pan_android.HttpUtil; import com.lht.pan_android.MainActivity; import com.lht.pan_android.R; import com.lht.pan_android.WeChatCodeBean; import com.loopj.android.http.AsyncHttpResponseHandler; import com.tencent.mm.sdk.modelbase.BaseReq; import com.tencent.mm.sdk.modelbase.BaseResp; import com.tencent.mm.sdk.modelmsg.SendAuth; import com.tencent.mm.sdk.openapi.IWXAPI; import com.tencent.mm.sdk.openapi.IWXAPIEventHandler; import com.tencent.mm.sdk.openapi.WXAPIFactory; public class WXEntryActivity extends Activity implements IWXAPIEventHandler { private static final String TAG = "wechat"; private static final String APP_ID = "你的APP_Id"; private static final String APP_SECRET = "你的APP_secret"; private Button registerBtn; private IWXAPI api; private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.entry); registerBtn = (Button) findViewById(R.id.reg_btn); tv = (TextView) findViewById(R.id.log); api = WXAPIFactory.createWXAPI(this, APP_ID, true); registerBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { loginWithWeixin(); } }); api.handleIntent(getIntent(), this); } //登录信息 private void loginWithWeixin() { if (api == null) { api = WXAPIFactory.createWXAPI(this, APP_ID, false); } if (!api.isWXAppInstalled()) { Toast.makeText(this, "没有安装微信", Toast.LENGTH_SHORT).show(); return; } api.registerApp(APP_ID); SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "com.lht.bridge.session"; api.sendReq(req); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this); } //实现了IWXAPIEventHandler @Override public void onReq(BaseReq req) { } //实现了IWXAPIEventHandler @Override public void onResp(BaseResp resp) { code_code = ((SendAuth.Resp) resp).code; String result = null; switch (resp.errCode) { case BaseResp.ErrCode.ERR_OK: result = "发送成功"; //此处进行数据请求,请求用户信息 Toast.makeText(this, result, Toast.LENGTH_LONG).show(); finish(); break; case BaseResp.ErrCode.ERR_USER_CANCEL: result = "发送取消"; Toast.makeText(this, result, Toast.LENGTH_LONG).show(); finish(); break; case BaseResp.ErrCode.ERR_AUTH_DENIED: result = "发送被拒绝"; Toast.makeText(this, result, Toast.LENGTH_LONG).show(); finish(); break; default: result = "发送返回"; Toast.makeText(this, result, Toast.LENGTH_LONG).show(); finish(); break; } Toast.makeText(this, result, Toast.LENGTH_LONG).show(); } }
实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法
在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法
- 在Androidmanifest.xml中注册:
<activity
android:name = ".wxapi.WXEntryActivity"
android:exported = "true"/>
- 请求用户信息:
微信需要先获取到code,再根据code获取access_token,根据access_token获取openId,最后根据access_token和openId获取用户信息
到此微信登录和分享的流程基本走通了,但是还有许多需要注意的问题
- 1、最最最重要的一点是登录需要单独写一个包,据说这样登录才能走微信自己的一套机制
格式为:包名.wxapi 类名:WXEntryActivity.java - 2、导入的jar包问题,jar包导入的不对就可能导致获取code这一步出现问题,微信的jar包分为老版本和新版本,新版本的可以直接获取access_token,但是官网并没有说明怎么通过access_token获取用户信息,老版本的jar包是可以获取code的,然后自己根据code自己写网络请求(你没有看错,就是自己写网络请求);
- 3、程序运行时一定要保证你的签名正确,如果需要更换你的key,windows下需要更换sdk/.android/debug.keystore以正确替换你的key
目前能想到的就这些了,有什么问题欢迎指出,最后吐槽一下微信登录竟然收费、微信的文档就呵呵了