遊戲sdk接入教程:接入應用寶渠道SDK之一登陸篇

官方文檔及SDK的下載地址爲:http://wiki.open.qq.com/wiki/YSDK%E4%B8%8B%E8%BD%BDhtml

 

在接入以前,需先在應用寶後臺建立遊戲,獲取一些接入參數。java

 

客戶端所須要參數包括:手Q的app_id、微信的app_id 。android

 

準備工做作爲,正式開始接入,首先把應用寶的YSDKLibrary引用庫導入到咱們的工做環境中去,而後用咱們demo工程去引用那個工程。git

我這邊的接入環境是Eclipsegithub

至於demo工程如何建立在上一篇的接入文檔中有詳細教程,請至:json

http://www.cnblogs.com/laohaizei/p/6724250.htmlapi

 

首先咱們打開咱們demo工程的AndroidManifest.xml文件。微信

而後複製如下代碼app

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.demo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:resizeable="true"
        android:smallScreens="true" />

    <!-- TODO GAME SDK接入必須權限模塊 START -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.RESTART_PACKAGES" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

    <!-- TODO GAME SDK Midas接入配置 設置屏幕兼容聲明 START -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.RESTART_PACKAGES" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

    <application
        android:allowBackup="false"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- TODO GAME SDK接入YSDK登錄接入配置 START -->
        <activity
            android:name="com.tencent.ysdk.module.realName.impl.RegisterRealNameActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:screenOrientation="landscape"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" >
        </activity>

        <!-- TODO GAME SDK接入YSDK登錄接入配置 END -->
        <!-- TODO GAME SDK QQ接入配置 START -->
        <activity
            android:name="com.tencent.tauth.AuthActivity"
            android:launchMode="singleTask"
            android:noHistory="true" >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:scheme="tencent@qq_app_id@" />
                <!-- TODO GAME 這裏爲遊戲QQ登陸的配置,遊戲須要修改成本身手Q的appid -->
            </intent-filter>
        </activity>
        <activity
            android:name="com.tencent.connect.common.AssistActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
        <!-- TODO GAME SDK QQ接入配置 END -->


        <!-- TODO GAME SDK 微信接入配置 START -->
        <activity
            android:name="com.tencent.tmgp.yybtestsdk.wxapi.WXEntryActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:excludeFromRecents="true"
            android:exported="true"
            android:label="WXEntryActivity"
            android:launchMode="singleTop"
            android:taskAffinity="@package@.diff"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" >

            <!-- TODO GAME 這裏爲遊戲微信登陸的配置,遊戲須要修改成本身的包名加.diff -->
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:scheme="@wx_app_id@" />
                <!-- TODO GAME 這裏爲遊戲微信登陸的配置,遊戲須要修改成本身的微信appid -->
            </intent-filter>
        </activity>
        <!-- TODO GAME SDK 微信接入配置 END -->


        <!-- TODO GAME SDK Midas接入配置 START -->
        <activity
            android:name="com.tencent.midas.proxyactivity.APMidasPayProxyActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="sensorLandscape"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
        <activity
            android:name="com.tencent.midas.wx.APMidasWXPayActivity"
            android:exported="true"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
        <activity
            android:name="com.tencent.midas.qq.APMidasQQWalletActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />

                <data android:scheme="qwallet100703379" />
                <!-- TODO GAME 這裏爲米大師的默認配置,遊戲不要修改 -->
            </intent-filter>
        </activity>
        <activity
            android:name="com.tencent.midas.jsbridge.APWebJSBridgeActivity"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:windowSoftInputMode="stateAlwaysHidden" />
        <!-- TODO GAME SDK Midas接入配置 END -->

    </application>

</manifest>

以上是須要添加在AndroidManifest.xml中的。(@xxx@部分請注意替換修改)ide

而後到咱們demo工程的AndroidManifest.xml全選替換粘貼

這樣AndroidManifest.xml修改好了。

 

作完以上步驟,接下來,咱們開始接入SDK的接口。

首先打開咱們的MainActivity.java

打開的MainActivity.java應該是這個樣子的

而後把下面的代碼複製進去,注意別把第一行的代碼覆蓋了。

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;

import com.tencent.ysdk.api.YSDKApi;
import com.tencent.ysdk.framework.common.eFlag;
import com.tencent.ysdk.framework.common.ePlatform;
import com.tencent.ysdk.module.user.PersonInfo;
import com.tencent.ysdk.module.user.UserListener;
import com.tencent.ysdk.module.user.UserLoginRet;
import com.tencent.ysdk.module.user.UserRelationRet;
import com.tencent.ysdk.module.user.WakeupRet;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {

	private final static String TAG = "demo";

	public static String openId = "";
	public static String pf = "";
	public static String pfKey = "";
	public static String accessToken = "";
	public static String payToken = "";
	public Context context = this;
	public Activity activity = MainActivity.this;
	public boolean isLogin = true;
	int logintype = 0;// 1是qq登陸,2是微信登陸

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		YSDKApi.onCreate(activity);
		YSDKApi.setUserListener(ysdkUser);
		YSDKApi.handleIntent(activity.getIntent());
	}
	
	/*--------------------------------登陸接口-----------------------------------------*/
	public void qqLogin(){
		YSDKApi.login(ePlatform.QQ);
	}
	
	public void wxLogin(){
		YSDKApi.login(ePlatform.WX);
	}
	
	public void logout(){
		YSDKApi.logout();
	}

	/*--------------------------------生命週期-----------------------------------------*/
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		YSDKApi.onDestroy(activity);
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		YSDKApi.onPause(activity);
	}

	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		super.onRestart();
		YSDKApi.onRestart(activity);
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		YSDKApi.onResume(activity);
	}

	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		YSDKApi.onStop(activity);
	}

	@Override
	protected void onNewIntent(Intent intent) {
		// TODO Auto-generated method stub
		super.onNewIntent(intent);
		YSDKApi.handleIntent(intent);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		YSDKApi.onActivityResult(requestCode, resultCode,data);
	}

	/*--------------------------------監聽回調-----------------------------------------*/
	UserListener ysdkUser = new UserListener() {

		@Override
		public void OnWakeupNotify(WakeupRet ret) {
			// TODO Auto-generated method stub
			Log.d(TAG, "called");
			Log.d(TAG, "flag:" + ret.flag);
			Log.d(TAG, "msg:" + ret.msg);
			Log.d(TAG, "platform:" + ret.platform);
			int platform = ret.platform;
			// TODO GAME 遊戲須要在這裏增長處理異帳號的邏輯
			if (eFlag.Wakeup_YSDKLogining == ret.flag) {
				// 用拉起的帳號登陸,登陸結果在OnLoginNotify()中回調
			} else if (ret.flag == eFlag.Wakeup_NeedUserSelectAccount) {
				// 異帳號時,遊戲須要彈出提示框讓用戶選擇須要登陸的帳號
				Log.d(TAG, "diff account");
			} else if (ret.flag == eFlag.Wakeup_NeedUserLogin) {
				// 沒有有效的票據,登出遊戲讓用戶從新登陸
				Log.d(TAG, "need login");
			} else {
				Log.d(TAG, "logout");
			}
		}

		@Override
		public void OnRelationNotify(UserRelationRet ret) {
			// TODO Auto-generated method stub
			String result = "";
			result = result + "flag:" + ret.flag + "\n";
			result = result + "msg:" + ret.msg + "\n";
			result = result + "platform:" + ret.platform + "\n";
			if (ret.persons != null && ret.persons.size() > 0) {
				PersonInfo personInfo = (PersonInfo) ret.persons.firstElement();
				StringBuilder builder = new StringBuilder();
				builder.append("UserInfoResponse json: \n");
				builder.append("nick_name: " + personInfo.nickName + "\n");
				builder.append("open_id: " + personInfo.openId + "\n");
				builder.append("userId: " + personInfo.userId + "\n");
				builder.append("gender: " + personInfo.gender + "\n");
				builder.append("picture_small: " + personInfo.pictureSmall
						+ "\n");
				builder.append("picture_middle: " + personInfo.pictureMiddle
						+ "\n");
				builder.append("picture_large: " + personInfo.pictureLarge
						+ "\n");
				builder.append("provice: " + personInfo.province + "\n");
				builder.append("city: " + personInfo.city + "\n");
				builder.append("country: " + personInfo.country + "\n");
				result = result + builder.toString();
			} else {
				result = result + "relationRet.persons is bad";
			}
			Log.d(TAG, "OnRelationNotify" + result);

			// 發送結果到結果展現界面
		}

		@Override
		public void OnLoginNotify(UserLoginRet ret) {
			// TODO Auto-generated method stub
			switch (ret.flag) {
			case eFlag.Succ:
				Log.e(TAG, "Login success:" + ret.toString());
				openId = ret.open_id;
				payToken = ret.getPayToken();
				pf = ret.pf;
				pfKey = ret.pf_key;
				accessToken = ret.getAccessToken();
				Log.i(TAG, "platform:" + ret.platform);
				logintype = ret.platform;
				// token和uid
				Log.d(TAG, "uid:" + openId + "token:" + accessToken);

				new NetHelper().execute();

				break;
			// 遊戲邏輯,對登陸失敗狀況分別進行處理
			case eFlag.QQ_UserCancel:
				Log.e(TAG, "用戶取消受權,請重試");
				// showTips("用戶取消受權,請重試",localContext);
				break;
			case eFlag.QQ_LoginFail:
				Log.e(TAG, "QQ登陸失敗,請重試");
				// showTips("QQ登陸失敗,請重試",localContext);
				break;
			case eFlag.QQ_NetworkErr:
				Log.e(TAG, "QQ登陸失敗,請重試");
				// showTips("QQ登陸失敗,請重試",localContext);
				break;
			case eFlag.QQ_NotInstall:
				Log.e(TAG, "手機未安裝手Q,請安裝後重試");
				// showTips("手機未安裝手Q,請安裝後重試", localContext);
				break;
			case eFlag.QQ_NotSupportApi:
				Log.e(TAG, "手機手Q版本過低,請升級後重試");
				// showTips("手機手Q版本過低,請升級後重試", localContext);
				break;
			case eFlag.WX_NotInstall:
				Log.e(TAG, "手機未安裝微信,請安裝後重試");
				// showTips("手機未安裝微信,請安裝後重試", localContext);
				break;
			case eFlag.WX_NotSupportApi:
				Log.e(TAG, "手機微信版本過低,請升級後重試");
				// showTips("手機微信版本過低,請升級後重試", localContext);
				break;
			case eFlag.WX_UserCancel:
				Log.e(TAG, "用戶取消受權,請重試");
				// showTips("用戶取消受權,請重試",localContext);
				break;
			case eFlag.WX_UserDeny:
				Log.e(TAG, "用戶拒絕了受權,請重試");
				// showTips("用戶拒絕了受權,請重試",localContext);
				break;
			case eFlag.WX_LoginFail:
				Log.e(TAG, "微信登陸失敗,請重試");
				// showTips("微信登陸失敗,請重試",localContext);
				break;
			case eFlag.Login_TokenInvalid:
				Log.e(TAG, "您還沒有登陸或者以前的登陸已過時,請重試");
				// showTips("您還沒有登陸或者以前的登陸已過時,請重試",localContext);
				break;
			case eFlag.Login_NotRegisterRealName:
				// 顯示登陸界面
				Log.e(TAG, "您的帳號沒有進行實名認證,請實名認證後重試");
				// showTips("您的帳號沒有進行實名認證,請實名認證後重試", localContext);
				break;
			default:
				// 顯示登陸界面
				break;
			}
		}
	};

	// 客戶端收到登陸成功回調(正常登陸,票據刷新),發送SDK服務端刷新票據
	private class NetHelper extends AsyncTask<Integer, Void, Integer> {

		@Override
		protected Integer doInBackground(Integer... params) {
			// TODO Auto-generated method stub
			try {
				Map<String, Object> map = new HashMap<String, Object>();
				map.put("openid", openId);
				map.put("openkey", accessToken);
				map.put("pf", pf);
				map.put("pfkey", pfKey);
				map.put("payToken", payToken);
				String beforeSignString = "openid=" + openId + "&openkey="
						+ accessToken + "&payToken=" + payToken + "&pf=" + pf
						+ "&pfkey=" + pfKey + "clientKey";
				Log.e(TAG, "login beforeSignString:" + beforeSignString);
				String sign = md5(beforeSignString);
				map.put("sign", sign);
				// 如下爲把map post到服務端
				// refreshResult = HttpUtil._post(TypeSDKBonjour_Tencent
				// .Instance().platform.GetData("tokenUrl"), map);
				// Log.i(TAG, "tokenUrl reuslt:" + refreshResult);
			} catch (Exception e) {

				e.printStackTrace();
			}
			return null;
		}

		@Override
		protected void onPostExecute(Integer result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
		}

	}

	public static String md5(String string) {

		byte[] hash;

		try {

			hash = MessageDigest.getInstance("MD5").digest(
					string.getBytes("UTF-8"));

		} catch (NoSuchAlgorithmException e) {

			throw new RuntimeException("Huh, MD5 should be supported?", e);

		} catch (UnsupportedEncodingException e) {

			throw new RuntimeException("Huh, UTF-8 should be supported?", e);

		}

		StringBuilder hex = new StringBuilder(hash.length * 2);

		for (byte b : hash) {

			if ((b & 0xFF) < 0x10)
				hex.append("0");

			hex.append(Integer.toHexString(b & 0xFF));

		}

		return hex.toString();

	}

}

  

 

至此咱們就把全部應用寶上線所需的登陸接口完成了,添加UI並添加相應事件調用相應接口後,就是一個最簡單的demo了

 

 

若是想要了解具體的接口做用,和相應參數的說明,查看代碼中的註釋或查看官方文檔

 

若是想了解更多,請聯繫咱們或關注官網

 

瞭解更多:www.typesdk.com問題解答:1771930259聯繫郵箱:qianyuzhou@typesdk.com項目地址:https://github.com/typesdk

相關文章
相關標籤/搜索