精华版、安卓项目用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