游戏sdk接入教程:接入应用宝渠道SDK之一登录篇

官方文档及SDK的下载地址为:http://wiki.open.qq.com/wiki/YSDK%E4%B8%8B%E8%BD%BD

在接入之前,需先在应用宝后台创建游戏,获取一些接入参数。

客户端所需要参数包括:手Q的app_id、微信的app_id 。

准备工作做为,正式开始接入,首先把应用宝的YSDKLibrary引用库导入到我们的工作环境中去,然后用我们demo工程去引用那个工程。

我这边的接入环境是Eclipse

至于demo工程如何创建在上一篇的接入文档中有详细教程,请至:

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

首先我们打开我们demo工程的AndroidManifest.xml文件。

然后复制以下代码

<?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="[email protected][email protected]" />
                <!-- 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="@[email protected]"
            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="@[email protected]" />
                <!-- 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中的。(@[email protected]部分请注意替换修改)

然后到我们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了

如果想要了解具体的接口作用,和相应参数的说明,查看代码中的注释或查看官方文档

时间: 2024-08-26 01:21:11

游戏sdk接入教程:接入应用宝渠道SDK之一登录篇的相关文章

高效率完成一次接入80个手游渠道SDK——游戏接入SDK客户端篇

一.引言 通常,游戏开发商并不会只在一个渠道上线他们的游戏,接入越多的渠道,代表着可能获取越多的用户,但同时也代表着越多的接入SDK工作量.工期和费用.一款游戏要有足够的用户,甚至需要接入30家以上的各种渠道,以保障自己的市场覆盖率.单个SDK接入流程在一位有经验的全职客户端程序.一位全职服务端程序员.一位全职QA处理的情况下,需要3天时间才能完成.因此当一款产品面对30个甚至更多不同需求的渠道SDK时,人员成本和时间成本就会急剧增加. 所以我们需要一个通用接口,来处理各种渠道的需求,这就是统一

高效率完成一次接入80个手游渠道SDK——游戏接入SDK服务端篇

1 概要    通常,游戏开发商并不会只在一个渠道上线他们的游戏,接入越多的渠道,代表着可能获取越多的用户,但同时也代表着越多的接入SDK工作量.工期和费用.一款游戏要有足够的用户,甚至需要接入30家以上的各种渠道,以保障自己的市场覆盖率. 单个SDK接入流程在一位有经验的全职客户端程序.一位全职服务端程序员.一位全职QA处理的情况下,需要3天时间才能完成.因此当一款产品面对30个甚至更多不同需求的渠道SDK时,人员成本和时间成本就会急剧增加.所以我们需要一个通用接口,来处理各种渠道的需求,这就

【转】微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引

微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引 Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享.也欢迎大家的补充! SDK还在不断优化升级中,开源项目见:https://github.com/JeffreySu/WeiXinMPSDK 微信技术交流社区:http://www.weiweihi.com/QA Senparc

微信公众账号 Senparc.Weixin.MP SDK 开发教程

http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html 微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引 Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享.也欢迎大家的补充! SDK还在不断优化升级中,开源项目见:https://githu

unity3d游戏开发之如何快速接入渠道SDK

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. 首先我们讲一下,为什么要介绍这个插件? 是因为这个插件极大的简化了我对接渠道SDK的工作量,精力和时间,也避免了我不断的重复的做接入SDK工作这样没有成就感的无聊工作! 所以我就介绍一下这款插件!!!!!! 开发环境:windows系统 , eclipse , unity3d 4.0 这款插件的

手机游戏渠道SDK接入工具项目分享(三)拨开云雾是个坑

一直在纠结是先写框架设计还是先写掉过的坑,最后本这娱乐大众的态度先写掉过的坑让大家乐呵下. 项目开发过程中遇问题无数,回顾下8个大坑照成了项目一定程度上延期甚至返工. 1.  项目一开始几个人把现有3家主流的产品(1接,棱镜,AnySDK)研究了一遍.没想先在这里就进坑了.在研究了几天后发现这3家虽推出有一定时间,但都是以第三方服务角度设计和开发的产品,与需求不符. 2.  版本管理.和流程管理等内容因为运营人员更替一直在调整,直到我提出需要加价才做吧.需求上快把打包工具做成OA系统了,删除了于

手机游戏渠道SDK接入工具项目分享(二)万事开头难

一般接到任务后程序员们通常都开始着手进行技术调研了,但我这活是项目负责人.还有一大堆事情要先期准备,没人能帮忙. 一.人力配置 考虑的之前已经有一波人搞了大半年,但没有起色,先期也没有太大人力需求,所以不指望这批人了.因为是外包收钱按人头工时算,所以拉几个自己兄弟填坑. 初期人力配置 服务端x 1.Android x 1 二.开发需求 自己手机游戏CP作了3年,需求直接写完后让对方确认,一次通过. 1.      公司多款游戏都需要使用这套工具,需要作适配兼容,还好都是Unity3D项目.之后我

手机游戏渠道SDK接入工具项目分享(一)缘起

#剧情章节 # 上周刚结束一个外包的项目,开发手机游戏渠道SDK聚合接入工具的,现在有空回顾整理一下这个项目开发过程,因涉嫌商业秘密不会提供项目代码,只谈下开发思路和掉过的坑. 本人多年从事手机互联网行业,从当年的功能机一直搞到红的发紫的手机游戏,一年前离职开始自己的APP开发外包生意. 十几年间许多相熟的老同事不是当了高管就已有自己公司了,到处拜访找老同事拉业务居然还能蹭上饭,感叹作技术的都是好兄弟. 找到之前公司一位老领导刚接手一家手机游戏开发公司管理层,被拉住聊了一晚希望我加入,但因为自己

教你快速高效接入SDK——Unity统一接入渠道SDK(Unity篇)

上一篇,我们着重讲解了用Unity开发的手游,在接入U8SDK时,Android中的部分.接下来,这一篇,我们就来看看,在Unity工程中,我们需要怎么调用上一篇中我们提供的各种接口,以及怎么接收Android中的消息通知,比如登录成功,切换帐号成功等. 在写代码之前,我们先要做一个简单的配置,在Project面板中,按照Unity官方的要求,新建一个Plugins文件夹,在Plugins文件夹下,再建立一个Android文件夹.这里,将会放置所有Android工程相关的文件. 1.将上一篇中,