編輯:關於android開發
今天在寫微信登錄,花了半天時間搞定、然後寫下自己的筆記,希望幫助更多的人。。。歡迎各位指教。
微信授權登錄,官方說的不是很清楚、所以導致有一部分的坑。
微信注冊應用平台的應用簽名,下載 微信簽名生成工具 輸入項目的packageName也可以查看到。
(注意:debug、Release 一定要區分,因為2種生成的微信簽名不一致,會導致沒有跳轉、回調。。。。一般在微信開發者上面注冊的是正式環境打包好的、)


申請微信開發者賬號、應用申請省略。。。。
1. 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"/>
2.在圖一按鈕上面,加上微信跳轉方法、也就是啟動微信登錄的方法
private void loginToWeiXin(){
IWXAPI mApi = WXAPIFactory.createWXAPI(this, WXEntryActivity.WEIXIN_APP_ID, true);
mApi.registerApp(WXEntryActivity.WEIXIN_APP_ID);
if (mApi != null && mApi.isWXAppInstalled()) {
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test_neng";
mApi.sendReq(req);
} else
Toast.makeText(this, "用戶未安裝微信", Toast.LENGTH_SHORT).show();
}
3.在你的包名相應目錄下新建一個wxapi目錄,並在該wxapi目錄下新增一個WXEntryActivity類,該類繼承自Activity
package(項目報名).wxapi.WXEntryActivity.Java
回調方法onResp() 方法沒有觸發回調、請監測WXEntryActivity onCreate中是否調用此方法 mApi.handleIntent(this.getIntent(), this);
package com.xxx.xxxx.android.wxapi;
/**
* 微信登錄頁面
* @author kevin_chen 2016-12-10 下午19:03:45
* @version v1.0
*/
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String APP_SECRET = "填寫自己的AppSecret";
private IWXAPI mWeixinAPI;
public static final String WEIXIN_APP_ID = "填寫自己的APP_id";
private static String uuid;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mWeixinAPI = WXAPIFactory.createWXAPI(this, WEIXIN_APP_ID, true);
mWeixinAPI.handleIntent(this.getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
mWeixinAPI.handleIntent(intent, this);//必須調用此句話
}
//微信發送的請求將回調到onReq方法
@Override
public void onReq(BaseReq req) {
LogUtils.log("onReq");
}
//發送到微信請求的響應結果
@Override
public void onResp(BaseResp resp) {
LogUtils.log("onResp");
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
LogUtils.log("ERR_OK");
//發送成功
SendAuth.Resp sendResp = (SendAuth.Resp) resp;
if (sendResp != null) {
String code = sendResp.code;
getAccess_token(code);
}
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
LogUtils.log("ERR_USER_CANCEL");
//發送取消
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
LogUtils.log("ERR_AUTH_DENIED");
//發送被拒絕
break;
default:
//發送返回
break;
}
}
/**
* 獲取openid accessToken值用於後期操作
* @param code 請求碼
*/
private void getAccess_token(final String code) {
String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ WEIXIN_APP_ID
+ "&secret="
+ APP_SECRET
+ "&code="
+ code
+ "&grant_type=authorization_code";
LogUtils.log("getAccess_token:" + path);
//網絡請求,根據自己的請求方式
VolleyRequest.get(this, path, "getAccess_token", false, null, new VolleyRequest.Callback() {
@Override
public void onSuccess(String result) {
LogUtils.log("getAccess_token_result:" + result);
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(result);
String openid = jsonObject.getString("openid").toString().trim();
String access_token = jsonObject.getString("access_token").toString().trim();
getUserMesg(access_token, openid);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onError(String errorMessage) {
}
});
}
/**
* 獲取微信的個人信息
* @param access_token
* @param openid
*/
private void getUserMesg(final String access_token, final String openid) {
String path = "https://api.weixin.qq.com/sns/userinfo?access_token="
+ access_token
+ "&openid="
+ openid;
LogUtils.log("getUserMesg:" + path);
//網絡請求,根據自己的請求方式
VolleyRequest.get(this, path, "getAccess_token", false, null, new VolleyRequest.Callback() {
@Override
public void onSuccess(String result) {
LogUtils.log("getUserMesg_result:" + result);
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(result);
String nickname = jsonObject.getString("nickname");
int sex = Integer.parseInt(jsonObject.get("sex").toString());
String headimgurl = jsonObject.getString("headimgurl");
LogUtils.log("用戶基本信息:");
LogUtils.log("nickname:" + nickname);
LogUtils.log("sex:" + sex);
LogUtils.log("headimgurl:" + headimgurl);
} catch (JSONException e) {
e.printStackTrace();
}
finish();
}
@Override
public void onError(String errorMessage) {
}
});
}
}
5.在 AndroidManifest.xml 設置注冊微信的頁面
當授權時候進入WXEntryActivity、當前背景可能是黒或白,為了不影響用戶體驗,可以把當前Activity設置為透明:
android:theme="@android:style/Theme.Translucent"
<!--注冊微信回調 WXEntryActivity -->
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Translucent" />
具體可參考:微信授權登錄取用戶信息步驟
UI組件之ImageView及其子類(一)ImageView顯示圖片
UI組件之ImageView及其子類(一)ImageView顯示圖片 ImageView家族的繼承關系如圖: ImageView繼承自View組件,它的主要功能室顯示圖
算法導論--廣度優先搜索和深度優先搜索,導論深度優先搜索
算法導論--廣度優先搜索和深度優先搜索,導論深度優先搜索廣度優先搜索 在給定圖G=(V,E)和一個特定的源頂點s的情況下,廣度優先搜索系統地探索G中的邊,以期“發現”可從
Listview詳解,listview
Listview詳解,listview Listview應該是最為常見的控件。對於大多數規則排列的界
android Gui系統之SurfaceFlinger(4),androidgui系統
android Gui系統之SurfaceFlinger(4),androidgui系統8.Vsync 8.1概論 VSYNC(Vertical Synchronizat
android入門系列- TextView EditText Button ImageView 的簡單應用,textviewedittext
android入門系列- TextView EditText Butto