網狐精華版,打包安卓,微信登入
阿新 • • 發佈:2019-02-07
精華版、安卓專案用eclipse開啟
此時會遇到很多問題,專案全線標紅
沒做過安卓開發的同學看到這些紅色的報錯已經一個頭倆個大了,
直接萌生退卻的想法
其實這只是紙老虎。
所有的報錯,都是jar路徑引用不正確。在專案遷移的時候出現的問題。
這個時候必須要耐心的把所有的問題都解決掉,才能繼續用eclipse二開。
告訴自己、不怕、我能行!
右鍵專案》屬性》JavaBuildPath》Library
開啟後,拉到最底下,就能看到錯誤的根源
標紅的jar包 路徑不正確。
在這裡我推薦個工具 :Everything(檔案搜尋工具)
pc上的檔案秒搜,強大的一逼。
把專案中缺失的jar包,直接在工具裡搜好,然後重新指定。重新整理專案。就會發現少了很多錯誤。
然後還有個錯誤,找不到cocos2dx 相關的jar包
這個問題,網上搜很多的、就是把cocos2dx 裡的android.project 裡的src 檔案下的copy 到咱們的安卓專案中就好了。
如果是個正常的專案的話,操作完上述步驟,基本就沒報錯 了,
就可以在這個基礎上繼續二開了。
還有個 就是Android.manifest.xml 中 有幾個欄位需要改下。
我做上面的改動的原因是我要自己對接微信官方的Sdk登入、
因為原專案中的用的友盟sdk、老實說、我每次安卓打包的微信登入、完全看運氣、
找不出原因。於是心一橫,乾脆直接改了得了。
這是微信登入的回撥處理,我直接貼出來吧
WXEntryActivity.java
package com.qiaoshuai.majiang2017.wxapi; import java.util.HashMap; import java.util.Map; import org.cocos2dx.thirdparty.HttpRequest; import org.cocos2dx.thirdparty.ThirdDefine; import org.cocos2dx.thirdparty.ThirdParty; import org.cocos2dx.thirdparty.ThirdParty.PLATFORM; import org.json.JSONException; import org.json.JSONObject; import android.content.Context; import android.os.Bundle; import android.os.StrictMode; import android.widget.Toast; import com.tencent.mm.opensdk.constants.ConstantsAPI; import com.tencent.mm.opensdk.modelbase.BaseReq; import com.tencent.mm.opensdk.modelbase.BaseResp; import com.tencent.mm.opensdk.modelmsg.SendAuth; import com.tencent.mm.opensdk.openapi.IWXAPI; import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler; import com.umeng.socialize.bean.SHARE_MEDIA; import android.app.Activity; import android.content.Intent; public class WXEntryActivity extends Activity implements IWXAPIEventHandler{ private static final String TAG = "WXEntryActivity"; private static final int RETURN_MSG_TYPE_LOGIN = 1; //登入 private static final int RETURN_MSG_TYPE_SHARE = 2; //分享 private Context mContext; // IWXAPI 是第三方app和微信通訊的openapi介面 private IWXAPI api; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 通過WXAPIFactory工廠,獲取IWXAPI的例項 api = ThirdParty.getInstance().myWXApi; //注意: //第三方開發者如果使用透明介面來實現WXEntryActivity,需要判斷handleIntent的返回值,如果返回值為false,則說明入參不合法未被SDK處理,應finish當前透明介面,避免外部通過傳遞非法引數的Intent導致停留在透明介面,引起使用者的疑惑 try { api.handleIntent(getIntent(), this); } catch (Exception e) { e.printStackTrace(); } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this); } // 微信傳送請求到第三方應用時,會回撥到該方法 @Override public void onReq(BaseReq req) { switch (req.getType()) { case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX: break; case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX: break; default: break; } } // 第三方應用傳送到微信的請求處理後的響應結果,會回撥到該方法 @Override public void onResp(BaseResp resp) { int result = 0; Toast.makeText(this, "baseresp.getType = " + resp.getType(), 2); System.out.println("baseresp.getType = " + ((SendAuth.Resp) resp).code); getAccessToken(((SendAuth.Resp) resp).code); switch (resp.errCode) { case BaseResp.ErrCode.ERR_OK: Toast.makeText(this, "baseresp.11", 2); //result = R.string.errcode_success; break; case BaseResp.ErrCode.ERR_USER_CANCEL: Toast.makeText(this, "baseresp.22", 2); //result = R.string.errcode_cancel; break; case BaseResp.ErrCode.ERR_AUTH_DENIED: Toast.makeText(this, "baseresp.33", 2); //result = R.string.errcode_deny; break; case BaseResp.ErrCode.ERR_UNSUPPORT: Toast.makeText(this, "baseresp.44", 2); //result = R.string.errcode_unsupported; break; default: //result = R.string.errcode_unknown; break; } } /** * 獲取access_token: * * @param code 使用者或取access_token的code,僅在ErrCode為0時有效 */ private void getAccessToken(final String code) { Map<String, Object> params = new HashMap(); params.put("appid", ThirdDefine.WeixinAppID); params.put("secret", ThirdDefine.WeixinAppSecret); params.put("code", code); params.put("grant_type", "authorization_code"); //Token String URL = String.format("https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code",ThirdDefine.WeixinAppID,ThirdDefine.WeixinAppSecret,code); System.out.println(URL); URL = "https://api.weixin.qq.com/sns/oauth2/access_token?"; String param = "appid="+ ThirdDefine.WeixinAppID +"&secret="+ThirdDefine.WeixinAppSecret+"&code="+code+"&grant_type=authorization_code"; StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); String accessTokenResult = HttpRequest.sendPost(URL, param); this.SetToken(accessTokenResult); if(this.GetToken("errcode") != null){ System.out.print(this.GetToken("errcode")); }else{ System.out.print(this.GetToken("access_token")); } System.out.println(" ============================================start 1 ============================================================="); //UserInfo URL = "https://api.weixin.qq.com/sns/userinfo?"; param = "access_token="+ this.GetToken("access_token") +"&openid="+ThirdDefine.WeixinAppID; System.out.println(URL); System.out.println(param); String userInfoResult = HttpRequest.sendPost(URL, param); this.SetUserInfo(userInfoResult); final PLATFORM plat = ThirdParty.getInstance().getPlatformFrom(SHARE_MEDIA.WEIXIN); System.out.println("===============start 99 "+plat); if(this.GetUserInfo("errcode") != null){ System.out.print(this.GetUserInfo("errcode")); System.out.println(" ============================================start 2222 ============================================================="); JSONObject jObject = new JSONObject(); System.out.println(" ============================================start 1111 ============================================================="); try { jObject.put("valid", false); jObject.put("errorcode", GetUserInfo("errcode")); ThirdParty.getInstance().myLoginListener.onLoginFail(plat, jObject.toString()); } catch (JSONException e) { System.out.println(" ============================================start 2 ============================================================="); ThirdParty.getInstance().myLoginListener.onLoginFail(plat, ""); e.printStackTrace(); } }else{ //鐧婚檰鎴愬姛 System.out.println(" ============================================start 3 ============================================================="); JSONObject jObject = new JSONObject(userInfoMap); try { System.out.println(" ============================================start 4 ============================================================="); jObject.put("valid", true); jObject.put("um_code", userInfoMap); ThirdParty.getInstance().myLoginListener.onLoginSuccess(plat,userInfoResult); } catch (JSONException e) { ThirdParty.getInstance().myLoginListener.onLoginFail(plat, ""); e.printStackTrace(); } } //https://api.weixin.qq.com/sns/userinfo?access_token=14_0dncWe3pJt-hZASZ29IsN13e_TAEy9x6XckC700Gw42q1Uro0bkZMZ07-Rx-YEb2gVbJ8qj3hRxb9dZ0atAmHrFoXu3c4X_xLuHe-LT2DLM&openid=wx26f61c962ed021e3 finish(); } private Map<String,String> tokenMap = new HashMap(); private Map<String,String> userInfoMap = new HashMap(); private void SetToken(String str){ tokenMap = new HashMap(); String strr = str.replace("{", "").replace("}", ""); System.out.println(strr); String[] arrayTmp = strr.split(","); for(int i=0;i< arrayTmp.length;i++){ String key = arrayTmp[i].split(":")[0].replace("\"", ""); String value = arrayTmp[i].split(":")[1].replace("\"", ""); tokenMap.put(key, value); } } private String GetToken(String key){ System.out.println("獲取:"+key); System.out.println("長度:"+tokenMap.size()); for (Map.Entry<String, String> entry : tokenMap.entrySet()) { System.out.println("Item : " + entry.getKey() + " Count : " + entry.getValue()); } if(tokenMap.containsKey(key)){ return tokenMap.get(key); } return null; } private void SetUserInfo(String str){ userInfoMap = new HashMap(); String strr = str.replace("{", "").replace("}", ""); System.out.println(strr); String[] arrayTmp = strr.split(","); for(int i=0;i< arrayTmp.length;i++){ String key = arrayTmp[i].split(":")[0]; String value = arrayTmp[i].split(":")[1]; userInfoMap.put(key, value); } } private String GetUserInfo(String key){ System.out.println("獲取:"+key); System.out.println("長度:"+userInfoMap.size()); for (Map.Entry<String, String> entry : userInfoMap.entrySet()) { System.out.println("Item : " + entry.getKey() + " Count : " + entry.getValue()); } if(userInfoMap.containsKey(key)){ return userInfoMap.get(key); } return null; } private String ChangeString(String str){ if(str == "nickname"){ str = "screen_name"; }else if (str == "headimgurl"){ str = "profile_image_url"; }else if (str == "sex"){ str = "gender"; } return str; } }
private void doWeChatLogin(final OnLoginListener listener)
{
if (false == mShareAPI.isInstall(m_Context, SHARE_MEDIA.WEIXIN))
{
listener.onLoginFail(PLATFORM.WECHAT, "寰俊瀹㈡埛絝湭瀹夎,鏃犳硶鎺堟潈鐧婚檰");
return;
}
if (null == m_Context || false == ThirdDefine.bConfigWeChat)
{
listener.onLoginFail(PLATFORM.WECHAT, "");
return;
}
SendAuth.Req req = new SendAuth.Req();
//授權讀取使用者資訊
req.scope = "snsapi_userinfo";
//自定義資訊
req.state = "wechat_sdk_demo_test";
//向微信傳送請求
myWXApi.sendReq(req);
}
第二個是請求微信的AccessToken 第一段是請求回撥的處理
還有問題的話,可加我的群,我們繼續討論
最好 GoodLucy