1. 程式人生 > >使用URL 啟動unity Andriod APP並傳遞引數

使用URL 啟動unity Andriod APP並傳遞引數


我的棋牌遊戲需要一個功能:

房主微信分享一個內容(微信的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 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>


當開啟網頁的時候會出現一個超連結,指向 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做網路遊戲的朋友也可以加我微信,互相探討下思路,如果沒有合適的工作我就準備成立個團隊自己做遊戲發行遊戲了,有興趣或者資金或者優秀美工技能的朋友聯絡我把。