使用URL 启动unity Andriod APP并传递参数

来源:互联网 发布:软件测试实践报告 编辑:程序博客网 时间:2024/06/05 14:02


我的棋牌游戏需要一个功能:

房主微信分享一个内容(微信的URL),上面包含有url,标题,内容,略图。当被邀请人点击分享的内容,可以直接开启这个游戏,并登录后直接登录这个房间。不需要人工记忆房间号等。

OK,这里我们就要用到几个知识点:

1、微信SDK-分享URL

2、Andriod APP 的URL启动并传参

3、网页的获取URL参数以及在超链接中加入参数(因为安卓的URL启动模式是  justlovepaohuzi://hmok/JoinRoom?roomID=,在本地是无法实现的,必须通过浏览器才行)


一、微信SDK-分享URL

首先是为UNITY创建 微信的SDK 的JAVA插件,这个可以看我之前的文章-unity使用微信SDK实现微信分享以及反馈_个人工程记录 (好吧,我发现这个文章我没有发布在CSDN,而是在我的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中添加内容

但是注意:千万不要和原来的<intent-filter>放在一起,否则就会丢失安卓的快捷方式,无法运行。
最后的样子如下(红色部分是必须添加的,其他的都按需要设置)
 <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传递进来。
scheme你们可以百度一下,看看它的作用。

2、完事后在main activity(OverrideExample.Java)中设置一个接收参数的方法,以及一个Unity获取参数的方法
onCreate()方法中添加获取参数,并保存到个string里去
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);} }

3、然后在unity中需要调用的时候调用它(下面方法是在UNITY中实现)
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方法中,如果有房间号就直接向服务器发送请求加入这个房间的编号。如果没有就啥都别做。


三、网页端的设计
我完全不会写,百度了一晚上,发现好简单script和C#太多不同,我习惯每行结束加;然后一直出错。哭死
用记事本新建个文件,名字叫 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 gameroomIDgameroomID=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>


当打开网页的时候会出现一个超链接,指向 justlovepaohuzi://hmok/JoinRoom?roomID=房间号。点击这个链接就能够在安卓上启动我的APP并且传递房间号给APP了。

四、总结
设计思路:
1、房主微信分享一个URL(http://hmok38.vicp.net/jionroom.asp?roomID=房间号),里面包含了他创建的房间号。
2、被邀请人,点击URL ,打开APP并自动获得房间号。but:我测试过好像不能直接这样分享(justlovepaohuzi://hmok/JoinRoom?roomID=房间号),所以第一步不能直接分享带scheme的内容。
那么只好在网站上做个中转,访问一个网页(http://hmok38.vicp.net/jionroom.asp?roomID=房间号),这个网页会给出链接到(justlovepaohuzi://hmok/JoinRoom?roomID=房间号),而房间号的数值来源于访问网页时候的url中的房间号数值,也就是转告了一次而已。
3、被邀请人点击网页的链接后,打开APP,登录后自动加入房间号
五、请大家有机会帮个忙
1、最近没事做,想找一份unity的主程工作,当然是游戏方面的,其他方面不考虑。大家有机会帮忙推荐下把。
2、自己使用phonton server+unity做了个棋牌游戏,就是可以几个朋友微信约好在一个房间内打牌的游戏。上次被一个朋友买了一套服务器去他家乡运营了。弱弱的问句还有朋友想运营么?或者你出棋牌的内容,我来定向开发,反正一个游戏服务器也就几万块,定向开发也就2-3个星期的时间就OK;
3、有不懂的内容请加我微信:hmokhmok 询问。CSDN我一般需要写东西来来,基本不看留言和私信的。
4、关键点来了-微信它不支持直接在微信内访问外部链接。所以只能选择“在浏览器中打开”后才可以打开APP和传值哦。SO,以上的内容和效果打了折扣的。哈哈,郁闷吗?
没关系,学了新东西就不怕,而且下一篇文章我会解决这个问题,可以直接微信内打开APP和传值。当然做法完全不同了,敬请期待吧。
5、想要学习phonton server+unity做网络游戏的朋友也可以加我微信,互相探讨下思路,如果没有合适的工作我就准备成立个团队自己做游戏发行游戏了,有兴趣或者资金或者优秀美工技能的朋友联系我把。

阅读全文
0 0