[Unity3D]自制UnityForAndroid二維碼掃描插件

一週左右終於將二維碼生成和掃描功能給實現了,終於能舒緩一口氣了,從一開始的疑惑爲啥不一樣的掃碼客戶端爲啥掃出來的效果不一樣?通用的掃描器掃出來就是一個下載APK,自制的掃描器掃出來是想要的有效信息,而後分析出來其實二維碼無非就是記錄了一個簡單的信息,通常是URL,而後本身在URL上面作文章!得知了需求以後而後開始着手作二維碼的生成,用了開源框架QRCode,而後解析ZXing,都是站在前人的肩膀上繼續作下去,我就沒有深刻研究二維碼的深層次方面的東西,大概只知道生成是根據一個二維Bool數組而後繪製像素點形參一個方形的圖片,其中三個角跟中間一塊是不包含信息的三個角是三個小矩形,是爲了定位位置,正中間有一個方形區域沒有信息是爲了放置Logo用的,相比你們也比較清楚,都見過,如今餐廳,地鐵上基本都有掃一掃的標誌,呵呵,二維碼已經成爲一個通用的宣傳手段!而後我接到這個任務以後就要一步一步的分析問題到解決問題,從生成一張二維碼圖片開始,到批量生成再到批量生成頁面,而且每一個頁面中要嵌套與之對應的二維碼,而後再到學習Android,由於以前沒怎麼接觸過Java方向的東西,而後簡單的看了兩天Android,對Android開發有了一個大致的認識和了解,而後再到學習Android和Unity的交互,再到作出Android插件等過程,截止今晚終於將功能實現,沒有什麼解決不了的問題,只要動手,動腦,一切都OK!java

接下來我就分享一下製做過程,關於生成二維碼的我當時寫了一個教程,結果還被抨擊了,說.net程序員就你這水平...對於這個網友,個人確很慚愧,個人水平有限,寫的內容的確比較淺顯,沒法知足你求高深技術的法眼,但我寫出來是爲了更過廣大初學者,但願能給他們一點入門的幫助!我想說的人外有人,不要以爲本身厲害就看不起新手或者沒你水平高的人,說不定未來他就有可能技術比你厲害!總而言之,或許對大牛而言,這個二維碼的生成和解析很簡單,但我仍是堅持下下來,一來也是對本身這一週多時間的一個小結,二來仍是前面那句話,但願和廣大初學者一塊兒學習和進步,一塊兒交流!android

二維碼生成和交互能夠看我以前寫的文章:二維碼生成 http://blog.csdn.net/dingxiaowei2013/article/details/22925709,Unity和Android交互http://blog.csdn.net/dingxiaowei2013/article/details/24485937。在這基礎之上,而後接着實現功能!程序員

更多精彩內容請關注個人微博  @丁小未   轉載請註明出處:http://blog.csdn.net/dingxiaowei2013/article/details/24677795數組

效果圖:

手機掃描後的效果:

 

說明:這裏是Unity界面調用Android的Java方法跳轉Android開發的Activity視圖,而後在Android中Java方法調用Unity再回到Unity界面。框架

源碼

Unity:

[csharp]  view plain copy print ? 在CODE上查看代碼片 派生到個人代碼片
 
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class NewBehaviourScript : MonoBehaviour {  
  5.   
  6.     private AndroidJavaObject activity;  
  7.     private string result="http://blog.csdn.net/dingxiaowei2013";  //result用於接收二維碼的返回值  
  8.     void Start()  
  9.     {  
  10.         AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");  
  11.         activity = jc.GetStatic<AndroidJavaObject>("currentActivity");  
  12.     }  
  13.   
  14.     void OnGUI()  
  15.     {  
  16.         //點擊掃碼調用Android方法  
  17.         if (GUI.Button(new Rect(Screen.width / 2 - 50, 20, 100, 50), "點擊掃碼"))  
  18.         {  
  19.             activity.Call("Show");  
  20.         }  
  21.         GUI.Label(new Rect(Screen.width / 2 - 100, 120, 300, 20), result);  
  22.     }  
  23.   
  24.     //這個是Android調用的方法  
  25.     void GetString(string str)  
  26.     {  
  27.         result = str;  
  28.     }  
  29. }  

Android:

[java]  view plain copy print ? 在CODE上查看代碼片 派生到個人代碼片
 
  1. package com.example.qr_codescan;  
  2.   
  3.   
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.widget.ImageView;  
  7. import android.widget.TextView;  
  8.   
  9. import com.unity3d.player.UnityPlayer;  
  10. import com.unity3d.player.UnityPlayerActivity;  
  11.   
  12.   
  13.   
  14. public class MainActivity extends UnityPlayerActivity {  
  15.     private final static int SCANNIN_GREQUEST_CODE = 1;  
  16.     /** 
  17.      * 顯示掃描結果 
  18.      */  
  19.     private TextView mTextView ;  
  20.     /** 
  21.      * 顯示掃描拍的圖片 
  22.      */  
  23.     private ImageView mImageView;  
  24.       
  25.   
  26.     @Override  
  27.     protected void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         //setContentView(R.layout.activity_main);  
  30.           
  31. //      mTextView = (TextView) findViewById(R.id.result);   
  32. //      mImageView = (ImageView) findViewById(R.id.qrcode_bitmap);  
  33. //        
  34. //      //點擊按鈕跳轉到二維碼掃描界面,這裏用的是startActivityForResult跳轉  
  35. //      //掃描完了以後調到該界面  
  36. //      Button mButton = (Button) findViewById(R.id.button1);  
  37. //      mButton.setOnClickListener(new OnClickListener() {  
  38. //            
  39. //          @Override  
  40. //          public void onClick(View v) {  
  41. //              Intent intent = new Intent();  
  42. //              intent.setClass(MainActivity.this, MipcaActivityCapture.class);  
  43. //              intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
  44. //              startActivityForResult(intent, SCANNIN_GREQUEST_CODE);  
  45. //          }  
  46. //      });  
  47.     }  
  48.       
  49.     public void Show()  
  50.     {  
  51.         Intent intent = new Intent();  
  52.         intent.setClass(MainActivity.this, MipcaActivityCapture.class);  
  53.         intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
  54.         startActivityForResult(intent, SCANNIN_GREQUEST_CODE);  
  55.     }  
  56.       
  57.       
  58.       
  59.     @Override  
  60.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  61.         super.onActivityResult(requestCode, resultCode, data);  
  62.         switch (requestCode) {  
  63.         case SCANNIN_GREQUEST_CODE:  
  64.             if(resultCode == RESULT_OK){  
  65.                 Bundle bundle = data.getExtras();  
  66.                 //顯示掃描到的內容  
  67.                 //mTextView.setText(bundle.getString("result"));  
  68.                 //顯示  
  69.                 //mImageView.setImageBitmap((Bitmap) data.getParcelableExtra("bitmap"));  
  70.                 UnityPlayer.UnitySendMessage("Cube","GetString",bundle.getString("result"));  
  71.             }  
  72.             break;  
  73.         }  
  74.     }     
  75.   
  76. }  

導出插件:

而後我導出成插件,以前一個掃碼插件是EasyCodeScanner,而後我從此的網名叫Aladdin,我也命名一個掃碼的Android插件,爲AladdinCodeScanner,往後可能繼續完成添加上IOS的掃碼功能,完善這一插件,我這也是深受EasyCodeScanner的折磨才決定自食其力!以前好不容易找到一個掃碼的插件EasyCodeScanner,結果發現會出錯還有關鍵的是沒有實現Android的掃碼功能,Android部分的方法沒實現,因此也促成了我本身寫插件的念頭,今天如願以償,一身輕鬆!時間不早,感受熬夜身體有點吃不消了,身體是本錢,明兒繼續將工程補上!晚安!
 

工程源碼:

http://down.51cto.com/data/1156726
相關文章
相關標籤/搜索