1. 程式人生 > >網狐精華版,打包安卓,微信登入

網狐精華版,打包安卓,微信登入

精華版、安卓專案用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