zoukankan      html  css  js  c++  java
  • [Unity3D]自制UnityForAndroid二维码扫描插件

    一周左右终于将二维码生成和扫描功能给实现了,终于能舒缓一口气了,从一开始的疑惑为啥不同的扫码客户端为啥扫出来的效果不同?通用的扫描器扫出来就是一个下载APK,自制的扫描器扫出来是想要的有效信息,然后分析出来其实二维码无非就是记录了一个简单的信息,一般是URL,然后自己在URL上面做文章!得知了需求之后然后开始着手做二维码的生成,用了开源框架QRCode,然后解析ZXing,都是站在前人的肩膀上继续做下去,我就没有深入研究二维码的深层次方面的东西,大概只知道生成是根据一个二维Bool数组然后绘制像素点形参一个方形的图片,其中三个角跟中间一块是不包含信息的三个角是三个小矩形,是为了定位位置,正中间有一个方形区域没有信息是为了放置Logo用的,相比大家也比较清楚,都见过,现在餐厅,地铁上基本都有扫一扫的标志,呵呵,二维码已经成为一个通用的宣传手段!然后我接到这个任务之后就要一步一步的分析问题到解决问题,从生成一张二维码图片开始,到批量生成再到批量生成页面,并且每个页面中要嵌套与之对应的二维码,然后再到学习Android,因为之前没怎么接触过Java方向的东西,然后简单的看了两天Android,对Android开发有了一个大体的认识和了解,然后再到学习Android和Unity的交互,再到做出Android插件等过程,截止今晚终于将功能实现,没有什么解决不了的问题,只要动手,动脑,一切都OK!

    接下来我就分享一下制作过程,关于生成二维码的我当时写了一个教程,结果还被抨击了,说.net程序员就你这水平...对于这个网友,我的确很惭愧,我的水平有限,写的内容的确比较浅显,无法满足你求高深技术的法眼,但我写出来是为了更过广大初学者,希望能给他们一点入门的帮助!我想说的人外有人,不要觉得自己厉害就看不起新手或者没你水平高的人,说不定将来他就有可能技术比你厉害!总而言之,或许对大牛而言,这个二维码的生成和解析很简单,但我还是坚持下下来,一来也是对自己这一周多时间的一个小结,二来还是前面那句话,希望和广大初学者一起学习和进步,一起交流!

    二维码生成和交互可以看我之前写的文章:二维码生成 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 plaincopyprint?在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:

    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
  • 相关阅读:
    UOJ #276. 【清华集训2016】汽水
    Luogu P4585 [FJOI2015]火星商店问题
    Luogu P5416 [CTSC2016]时空旅行
    NOIP 2011 提高组初赛错题简析
    Luogu P4068 [SDOI2016]数字配对
    UOJ Easy Round #5
    Codechef September Challenge 2019 Division 2
    Project Euler Problem 675
    AtCoder Grand Contest 037
    拿2k的前端开发都会做些什么?
  • 原文地址:https://www.cnblogs.com/dingxiaowei/p/3703022.html
Copyright © 2011-2022 走看看