公司用egret做了款游戲,需要打android包,做安卓端的微信登錄,於是乎開始了第一安卓上的打包,正的是一臉懵
首先遇到的問題有如下:
1. egret打安卓包時經常運行不起來, 主要是gradle版本和android版本的問題
2. 集成微信登錄流程不清晰, 如: 需要知道微信開放平台設置的包名, 需要生產keystore, 總是喚不起微信
3. http請求 401錯誤, 后來換了okhttpUtil
我的環境:
android studio 2.2.3, 安裝簡化教程也在 Egret項目打包成APK中有提到
第一步是egret打包成安卓
能把app跑起來最重要,建議參考這位博主的文章 Egret項目打包成APK
第二步是微信登錄
-
微信公眾平台去注冊你的app(其實這一步很重要)
登錄 微信開放平台 把你的開發者信息填上,這些就不上圖了,都是中文字,應該看得懂然后進入 管理中心 點擊創建++移動應用++,注意: 應用的包名和簽名不能隨便填!! -
第一步我不主講, 博客上其他人寫的很好, 圖文並茂, 如android第三方登錄之微信登錄(圖文詳解)
集成微信及其他第三方包
dependencies {
compile(name: 'egret', ext: 'aar')
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:5.3.1'
compile 'com.alibaba:fastjson:1.1.70.android'
compile 'com.zhy:okhttputils:2.0.0'
}
這里,沒有像有的博客一樣,添加libammsdk.jar的依賴包, 我都是gradle去下載的
project structure項目配置
選擇jdk路徑(前提是下載jdk, 並安裝配置)
設置keystore
將.keystore文件放到項目根目錄, 同時設置app下的build.gradle
項目結構
入口文件MainActivity
-
添加一個 public IWXAPI mWxApi; 屬性, 在MyApp類中添加一個靜態屬性 public static MainActivity sInstance = null;
-
在OnCreate方法中添加 MyApp.sInstance = this; regToWx(); 下面是regToWx()的方法體
private void regToWx() { // 通過WXAPIFactory工廠,獲取IWXAPI的實例 mWxApi = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false); // 將應用的appId注冊到微信 mWxApi.registerApp(Constants.APP_ID); }
注: 常量類中的內容
public class Constants { public static String APP_ID = "你的appid"; public static String SECRET = "對應的secret"; }
微信文件WXEntryActivity
1 import android.app.Activity; 2 import android.content.Intent; 3 import android.os.Bundle; 4 import android.util.Log; 5 import android.widget.Toast; 6 7 import com.squareup.okhttp.Request; 8 import com.tencent.mm.opensdk.constants.ConstantsAPI; 9 import com.tencent.mm.opensdk.modelbase.BaseReq; 10 import com.tencent.mm.opensdk.modelbase.BaseResp; 11 import com.tencent.mm.opensdk.modelmsg.SendAuth; 12 import com.tencent.mm.opensdk.openapi.IWXAPI; 13 import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler; 14 import com.tencent.mm.opensdk.openapi.WXAPIFactory; 15 import com.zhy.http.okhttp.OkHttpUtils; 16 import com.zhy.http.okhttp.callback.StringCallback; 17 18 import org.json.JSONException; 19 import org.json.JSONObject; 20 21 /** 22 * Created by Administrator on 2019/2/13. 23 */public class WXEntryActivity extends Activity implements IWXAPIEventHandler { 24 25 private IWXAPI mWxApi; 26 27 @Override 28 public void onCreate(Bundle savedInstanceState) { 29 super.onCreate(savedInstanceState); 30 31 mWxApi = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false); 32 try { 33 boolean result = mWxApi.handleIntent(getIntent(), this); 34 System.out.println("result: " + result); 35 36 } catch (Exception e) { 37 e.printStackTrace(); 38 } 39 40 Log.d("WXEntryActivity","onCreate"); 41 } 42 43 @Override 44 protected void onNewIntent(Intent intent) { 45 super.onNewIntent(intent); 46 47 setIntent(intent); 48 mWxApi.handleIntent(intent, this); 49 } 50 51 // 微信發送請求到第三方應用時,會回調到該方法 52 @Override 53 public void onReq(BaseReq req) { 54 Log.i("WXEntryActivity", "onReq"); 55 switch (req.getType()) { 56 case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX: 57 58 break; 59 case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX: 60 61 break; 62 default: 63 break; 64 } 65 } 66 67 // 第三方應用發送到微信的請求處理后的響應結果,會回調到該方法 68 @Override 69 public void onResp(BaseResp resp) { 70 String result = ""; 71 Log.i("WXEntryActivity", "onResp"); 72 // Toast.makeText(this, "baseresp.getType = " + resp.getType(), Toast.LENGTH_SHORT).show(); 73 74 switch (resp.errCode) { 75 case BaseResp.ErrCode.ERR_OK: 76 result = "用戶同意"; 77 if(resp instanceof SendAuth.Resp){ 78 SendAuth.Resp newResp = (SendAuth.Resp)resp; 79 String code = newResp.code; 80 Log.i("WXEntryActivity","獲取code: " + code); 81 82 // 2. 獲取access_token 83 getAccessToken(code); 84 } 85 86 break; 87 case BaseResp.ErrCode.ERR_USER_CANCEL: 88 result = "用戶取消"; 89 break; 90 case BaseResp.ErrCode.ERR_AUTH_DENIED: 91 result = "用戶拒絕授權"; 92 break; 93 case BaseResp.ErrCode.ERR_UNSUPPORT: 94 result = "暫不支持"; 95 break; 96 default: 97 result = "未知錯誤"; 98 break; 99 } 100 101 Toast.makeText(this, result, Toast.LENGTH_LONG).show(); 102 finish(); 103 } 104 105 /** 106 * 獲取access_token 107 */ 108 private void getAccessToken(String code) { 109 //獲取授權 110 StringBuffer loginUrl = new StringBuffer(); 111 loginUrl.append("https://api.weixin.qq.com/sns/oauth2/access_token") 112 .append("?appid=") 113 .append(Constants.APP_ID) 114 .append("&secret=") 115 .append(Constants.SECRET) 116 .append("&code=") 117 .append(code) 118 .append("&grant_type=authorization_code"); 119 120 OkHttpUtils.get() 121 .url(loginUrl.toString()) 122 .build() 123 .execute(new StringCallback() { 124 @Override 125 public void onError(Request request, Exception e) { 126 127 } 128 129 @Override 130 public void onResponse(String response) { 131 // 2. 獲取access_token 132 133 JSONObject accessTokenObj = null; 134 try { 135 accessTokenObj = new JSONObject(response); 136 Log.i("WXEntryActivity", "獲取access_token:" + accessTokenObj.toString()); 137 if (accessTokenObj.getString("access_token") != null) { 138 getWxUserInfo(accessTokenObj.getString("access_token"), accessTokenObj.getString("openid")); 139 140 } 141 } catch (JSONException e) { 142 e.printStackTrace(); 143 } 144 145 } 146 }); 147 148 } 149 150 /** 151 * 3. 獲取微信用戶信息 152 * @return 153 */ 154 private void getWxUserInfo(String access_token, String openid) { 155 StringBuffer url = new StringBuffer(); 156 url.append("https://api.weixin.qq.com/sns/userinfo") 157 .append("?access_token=") 158 .append(access_token) 159 .append("&openid=") 160 .append(openid); 161 162 OkHttpUtils.get() 163 .url(url.toString()) 164 .build() 165 .execute(new StringCallback() { 166 @Override 167 public void onError(Request request, Exception e) { 168 169 } 170 171 @Override 172 public void onResponse(String response) { 173 // todo,我這里是白鷺有游戲, 這里response里就是微信玩家信息, 可以打印一下 174 // 發送給白鷺 175 MyApp.sInstance.sendToJS(response); 176 } 177 }); 178 } 179 }
將獲取到的玩家信息, 發給服務器或者客戶端, 做登錄/注冊游戲
最后
配置和代碼已經完結了,我的也能成功獲取到微信玩家信息, 如果你的不能獲取到的,最重要的還是核實自己的包名, keystore, 我在這里吃了很大的虧,最后祝大家都能把android快速的集成出來, 拜拜!!!