我的棋牌游戏需要一个功能:
房主微信分享一个内容(微信的URL),上面包含有url,标题,内容,略图。当被邀请人点击分享的内容,可以直接开启这个游戏,并登录后直接登录这个房间。不需要人工记忆房间号等。
OK,这里我们就要用到几个知识点:
1、微信SDK-分享URL
2、Andriod APP 的URL启动并传参
3、网页的获取URL参数以及在超链接中加入参数(因为安卓的URL启动模式是 justlovepaohuzi://hmok/JoinRoom?roomID=,在本地是无法实现的,必须通过浏览器才行)
一、微信SDK-分享URL
首先是为UNITY创建 微信的SDK 的JAVA插件,这个可以看我之前的文章-unity使用微信SDK实现微信分享以及反馈_个人工程记录 (好吧,我发现这个文章我没有发布在优快云,而是在我的QQ空间内,实在不行就加我微信找我要把,或者我找时间重新写一遍,原来那篇有一些小错误)
然后在mainactivty 实现分享URL-我直接贴代码了,个人工程记录上有解释
public void shareURL(String Url,String titleString,String 网页描叙,String 图片名字){
try{
//初始化一个web对象,并输入url
UnityPlayer.UnitySendMessage("WXSDK", "ResFromWX", "开始分享URL");
WXWebpageObject webmsg=new WXWebpageObject();
webmsg.webpageUrl=Url;
//用WXWebpageObject对象初始化一个WXMediaMessage填写标题,描叙
WXMediaMessage msg=new WXMediaMessage(webmsg);
msg.title=titleString;
msg.description=网页描叙;
//获得网页略缩图图片的BITMAP格式
// int id = getResources().getIdentifier(图片名字, "drawable", getPackageName());
// Bitmap bmp = BitmapFactory.decodeResource(getResources(),id);
//从文件读取图片
File mFile=new File(图片名字);
Bitmap bmp=null;
//若该文件存在
if (mFile.exists()) {
//UnityPlayer.UnitySendMessage("WXSDK", "ResFromWX", "开始读取"+图片名字);
bmp=BitmapFactory.decodeFile(图片名字);
//UnityPlayer.UnitySendMessage("WXSDK", "ResFromWX", "读取完毕"+图片名字);
}else{
UnityPlayer.UnitySendMessage("WXSDK", "ResFromWX", 图片名字+"读取出错");
}
//生成略缩图
// UnityPlayer.UnitySendMessage("WXSDK", "ResFromWX", "生成thumbBmp");
Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 100, 100, true);
//UnityPlayer.UnitySendMessage("WXSDK", "ResFromWX", "生成msg.thumbData");
msg.thumbData=Util.bmpToByteArray(thumbBmp, true);
// UnityPlayer.UnitySendMessage("WXSDK", "ResFromWX", "图像处理完毕");
//生成微信的请求
SendMessageToWX.Req req = new SendMessageToWX.Req();
//设置它的校验格式
req.transaction = buildTransaction("webpage");
//设置它的内容
req.message = msg;
// UnityPlayer.UnitySendMessage("WXSDK", "ResFromWX", "REQ设置完成,下面选择发送方法");
//发给朋友
req.scene =SendMessageToWX.Req.WXSceneSession;
//使用通讯脚本的静态变量发送这个请求
WXEntryActivity.api.sendReq(req);
//UnityPlayer.UnitySendMessage("WXSDK", "ResFromWX", "发送完成");
}
catch(Exception e){
UnityPlayer.UnitySendMessage("WXSDK", "ResFromWX", "抛出异常:"+e);
}
}
Unity上是这样的一个命令
string 邀请人用户名 = GameManager.s_GameManager.我的用户信息.用户昵称;
string 房间号 = UI_GamrRoomState._最新的房间状态._房间信息.房间编号;
jo.Call("shareURL", new object[] { "http://hmok38.vicp.net/jionroom.asp?roomID=" + 房间号,"速度来打牌!房间号:"+ 房间号, "您的好友 "+ 邀请人用户名+" 邀请您参加牌局!", 文件名 });
在微信上就是下图这样的。哈哈。点击它就会访问 “http://hmok38.vicp.net/jionroom.asp?roomID=房间号” 这个网址。然后网页会给出一个 超链接,
其指向 justlovepaohuzi://hmok/JoinRoom?roomID=房间号 。如果是在安卓上运行自然会启动我这个APP
二、Andriod APP 的URL启动并传参
设置unity 要附带的java插件,我直接在 微信SDK 的JAVA插件上添加需要的内容了。
1、首先是AndroidManifest.xml的设置
需要在MAIN <activity中添加内容
<activity
android:name=".OverrideExample"
android:label="@string/app_name"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<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="justlovepaohuzi" android:host="hmok" android:pathPrefix="/JoinRoom"/>
</intent-filter>
</activity>
至于上面的scheme的设置
<data android:scheme="justlovepaohuzi" android:host="hmok" android:pathPrefix="/JoinRoom"/>
代表了这个APP可以由浏览器发送 justlovepaohuzi://hmok/JoinRoom?roomID=xxxx 的URL来启动这个APP,并且把XXXX传递进来。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
储存打开APP的情况();
}
private String ROOMID="";
private void 储存打开APP的情况(){
try{
Intent i_getvalue = getIntent();
String action = i_getvalue.getAction();
UnityPlayer.UnitySendMessage("PhotonClientManager", "getRoomID", "action:"+action);
if(Intent.ACTION_VIEW.equals(action)){
Uri uri = i_getvalue.getData();
UnityPlayer.UnitySendMessage("PhotonClientManager", "getRoomID", "uri:"+uri);
if(uri != null){
String roomID = uri.getQueryParameter("roomID");
UnityPlayer.UnitySendMessage("PhotonClientManager", "getRoomID", "roomID:"+roomID);
ROOMID=roomID;
}
}
}
catch(Exception e){
UnityPlayer.UnitySendMessage("WXSDK", "ResFromWX", "储存打开APP抛出异常:"+e);
}
}
//unity 获取ID的方法,因为我们不是一进入APP就要调取,所以在进入需要的场景的时候再调用,调用完毕后删除数值,这样保证下次进去的时候不会再次进入上一个房间
public void GetGameRoomID(){
try{
UnityPlayer.UnitySendMessage("PhotonClientManager", "getRoomID", ROOMID);
//清理ID
ROOMID="";
}
catch(Exception e){
UnityPlayer.UnitySendMessage("WXSDK", "ResFromWX", "储存打开APP抛出异常:"+e);
}
}
public void 请求邀请的房间编号()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("GetGameRoomID");
UI_Note.s_UInote.Note("开始请求加入房间的编号");
}
//接收WXSDK中发过来的房间编号的方法
public void getRoomID(string 房间编号)
{
if(房间编号!=null&& 房间编号 != "")
{
UI_Note.s_UInote.Note("朋友邀请您进入:"+ 房间编号);
//发送加入游戏房间的服务器请求
PhotonOperationManager.s_PhotonOperationManager._JionGameRoom(房间编号);
}
else
{
// UI_Note.s_UInote.Note("没有房间编号" );
}
}
这样当unity需要邀请的房间ID时候,运行 请求邀请的房间编号(), WXSDK的JAVA工程发来了房间编号到 getRoomID方法中,如果有房间号就直接向服务器发送请求加入这个房间的编号。如果没有就啥都别做。
三、网页端的设计
用记事本新建个文件,名字叫 jionroom.asp 内容如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>就爱跑胡子</title>
</head>
<body>
<h1 style='font-size:60px;color:red' >提示:如果您使用微信打开本网页,请点击右上角,选择“在浏览器中打开”才可以哦!</h1>
<%
dim gameroomID
gameroomID=Request.QueryString("roomID")
%>
<style type="text/css">
a.toolleft_03:link {color: #274579; font-size:50px;} /* 未访问的链接 */
a.toolleft_03:visited {color: #274579; font-size:50px;} /* 已访问的链接 */
a.toolleft_03:hover {color: #274579; font-size:50px;} /* 鼠标移动到链接上 */
a.toolleft_03:active {color: #274579; font-size:50px;} /* 选定的链接 */
</style>
<a class=toolleft_03 href="justlovepaohuzi://hmok/JoinRoom?roomID=<%=gameroomID%>"> 启动就爱跑胡子,加入<%=gameroomID%>号房间!</a>
</body>
</html>