8-7 QRコードの読み取り   


505以降では、QRコードが読み取れるようになりました。この機能はiアプリでも利用できます。
携帯のカメラで、画像を認識し、画像に埋め込まれた文字情報を取り込みます。

    某携帯電話会社のHP→サービス・機能→iモード→
       作ろうiモードコンテンツ→バーコード→バーコードの概要→QRファクトリー

から、バーコードの作成ツールがダウンロードできます。バーコードを利用してアプリを書く
場合には、テスト用バーコードの作成が必要ですので、ダウンロードをお勧めします。

(1)バーコードを読み取る手順

  バーコードを利用するアプリのソースコードは以下のように書きます。
  @import文
   以下のimport文が必要です。
     import com.nttdocomo.device.*;
     import com.nttdocomo.system.*;

  ACodeReader型変数の取得
     CodeReader CodeReader型変数名=CodeReader.getCodeReader(カメラ番号);
     カメラ番号は、通常0がいいと思います。以下の例は、CodeReader型変数、codeReaderを取得してます。

     CodeReader codeReader=CodeReader.getCodeReader(0);

  B読み取るコードの種類のセット
     読み取れるコードは幾つか種類があります。そこで、どのコードを読み取るか決めます。読み取るコードを
   指定するには

       CodeReader型変数.setCode(コードの種類);

   で行います。コードの種類は、整数型変数で、以下から選びます。
          表ー1 携帯で利用できるコードの種類
意味 備考
CodeReader.CODE_AUTO 自動で識別 オプション
CodeReader.CODE_JAN8 8桁のバーコード(数字)
CodeReader.CODE_JAN13 13桁のバーコード(数字)
CodeReader.CODE_QR いわゆるQRコード
CodeReader.CODE_OCR OCR(文字似ている)コード オプション
   ※オプション:全ての携帯でなく、機種によっては使える機能。

  ところで最初に紹介したパソコンアプリはQR_CODEと呼ばれるコードを生成します。
  そこで、ここではQR_CODEを利用することにします。以下の例は、CodeReader型変数「codeReader」に、
  QRコードを指定します。

        codeReader.setCode(CodeReader.CODE_QR);

  Cデータの読み取り
    携帯にコードを読み取らすには
     CodeReader型変数.read();
   で実行します。これには、「InterruptedOperationException」例外処理が必要です。
    以下の例は、CodeReader型変数「codeReader」を利用して、読み込みます。
           try{
                  codeReader.read();
               }catch(InterruptedOperationException e){
                  //ここに例外処理を書く
           }

  D読み取ったデータの取得
    携帯が読み取ったコードは、文字列やバイトデータとしてアプリが取得できます。
   1)文字列データとして取得するには
     文字列形変数=コードリーダ型変数.getSing();
   で実行できます。
   以下の例は、CoderReader型変数codeReaderを使い、文字列型変数resに結果を格納します。
     res=codeReader.getString();
  
   2)バイト型(0〜255の数値)の配列として取得するには、
      バイト型配列変数=CoderReader型変数.getBytes();
    で実行できます。以下の例は、CoderReader型変数codeReaderを使い、バイト型の配列変数readByteに
    結果をバイト型の配列として格納します。

       readByte=codeReader.getBytes();

    読み取った長さは、配列のサイズとして取得できます。配列の長さを取得するには
       配列変数名.length
    で可能です。以下の例は、整数配列変数readByte配列の大きさを整数型変数lenに設定します。
      int len=readByte.length;

   なお、サンプルプログラムではこの方法でなく、読み取った長さより長いところにアクセスしようとすると
   「例外処理」が発生しますので これを利用しています。
    
  
 (3)利用可能バーコードの種類の取得

   携帯の機種によって利用できるコードが違います。

   整数型配列変数=CodeReader型変数.getAvailableCodes();
  
  で、利用可能なコードの種類を整数型配列変数に取得できます。
  以下の例は、整数型配列変数「kanouCode」に利用可能なコードの種類を取得します。

    kanouCode=codeReader.getAvailableCodes();

(4)読み取ったバーコードの種類の取得

 読み取ったコードの種類は、何なのかを
  整数型変数=CodeReader型変数.getResultCode();
 で整数型変数に取得できます。返される値は表ー1に加え、以下のものがあります。

        表−2 読み取ったコードの型(追加)
意味 備考
CodeReader.CODE_UNKNOWN 不明なコード
CodeReader.CODE_UNSUPPORTED サポートされないコード オプション
※オプション:全ての携帯でなく、機種によっては使える機能。

 以下の例は、CoderReader型変数codeReaderを使い整数型変数syuruiに読み取ったコードの種類を取得します。

  syurui=codeReader.getResultCode();

(5)読み取ったデータのタイプの取得
   読み取ったバーコードがデータが、数値だけか、英数字かなどのデータのタイプを
      整数型変数=CodeReader型変数.getResultType();
   で、整数型変数に取得できます。
   タイプの種類には以下のものがあります。
       
意味
CodeReader.TYPE_BINARY バイナリータイプ
CodeReader.TYPE_NUMBER 数値
CodeReader.TYPE_ASCII 英数字(0〜9、A-Z)
CodeReader.TYPE_STRING 文字
CodeReader.TYPE_UNKNOWN 不明なタイプ 

  以下の例は、CodeReader型変数「codeReader」を使い、整数型変数codeTypeに読み取ったバーコード
  のタイプを取得します。

     codeType=codeReader.getResultType();

(6)サンプルソース
 以下にサンプルソースを記載します。
  @動作
    バーコード読み取り前は
     ・利用可能なバーコードの一覧が表示されます。
     ・「↑」「↓」キーで読み取るバーコードに種類を選択します。
     ・ソフトキー2でバーコードの読み取り開始
    バーコード読み取り後は以下を表示します。
     ・読み取ったバーコードの種類(ただし、CodeReaderは省略してます)
     ・読み取ったデータのタイプ(同上)
     ・読み込んだデータの文字列表示
     ・読み込んだデータのバイト表示

  Aソースコード
    a)20〜176行  CodeReadクラス-Coderリーダを使って、コードの読み込みを行います。
    b)181〜227行 Apcクラスは、Canvasの継承クラスで、表示やキーの受付を処理をします。
    c)232〜239行 barCodeクラスで、最初に携帯から呼び出されます。

   1://------------------------------------------------------------ 
   2:// バーコードリーダのサンプル 
   3:// barCode.java 
   4:// 
   5:// CopyRight(c) 2006 by inu_poti 
   6:// 
   7://------------------------------------------------------------ 
   8:
   9:import com.nttdocomo.ui.*;
  10:
  11://このインポート文が必要です。 
  12:import com.nttdocomo.device.*;
  13:import com.nttdocomo.system.*;
  14:
  15://--------------------------------------------- 
  16://  
  17:// CodeReadクラスで、QRコードを読み込みます。 
  18:// 
  19://---------------------------------------------- 
  20:class CodeRead{
  21:      
  22:      //プロパティ 
  23:      
  24:      //読み取ったデータの情報 
  25:      String res;//読み取った文字列 
  26:      byte readByte[];//読み取ったバイト 
  27:      String type;//読み取ったタイプ 
  28:      String code;//読み取ったコードの種別 
  29:      
  30:      
  31:      //利用可能なバーコード情報 
  32:      int kanouCode[];//利用可能なコードのリスト 
  33:      int kanouCount;//利用可能なコードの数 
  34:      int pos;//実際に使用するコード 
  35:      
  36:      
  37:      //コンストラクタ 
  38:      CodeRead(){
  39:            int dm;
  40:            
  41:            //読み取った結果にnullをセット 
  42:            res=null;
  43:            
  44:            //コードリーダの取得 
  45:            CodeReader codeReader=CodeReader.getCodeReader(0);
  46:            
  47:            //利用可能な、コードの取得 
  48:            kanouCode=codeReader.getAvailableCodes();
  49:            
  50:            //利用可能なコードの解析 
  51:            // @kanouCountに数を入れる 
  52:            // AposにQR_CODEの位置をセット 
  53:            // getAvalableCodeメソッドでは、数が不明なので例外処理を使い数を確認します。 
  54:            kanouCount=0;
  55:            pos=0;
  56:            
  57:            while(true){
  58:                  try{
  59:                        dm=kanouCode[kanouCount];
  60:                        if(dm==CodeReader.CODE_QR)pos=kanouCount;
  61:                        kanouCount++;
  62:                        }catch(Exception e){
  63:                        //例外が発生したら、ループを抜ける 
  64:                        break;
  65:                  }
  66:            }
  67:      }
  68:      
  69:      //利用可能なコードの表示 
  70:      // 引数 g -表示に利用するGraphics型変数 
  71:      void paintKanouCode(Graphics g){
  72:            int i;
  73:            g.drawString("-以下のコードが利用可能です。-",10,18);
  74:            for(i=0;i<kanouCount;i++){
 75:                  g.drawString(getCodeName(kanouCode[i]),2,20*i+40);
  76:            }
  77:            
  78:            g.drawLine(0,20*pos+41,120,20*pos+41);
  79:            
  80:      }
  81:      
  82:      //利用するコードの変更 
  83:      void changeCode(int key){
  84:            if(key==Display.KEY_UP)pos=(pos+kanouCount-1)%kanouCount;
  85:            if(key==Display.KEY_DOWN)pos=(pos+1)%kanouCount;
  86:      }
  87:      
  88:      
  89:      //読み込んだコードの種類を文字に変換 
  90:      String getCodeName(int codeKind){
  91:            String rv;
  92:            rv="";
  93:            if(codeKind==CodeReader.CODE_AUTO)rv="CODE_AUTO";
  94:            if(codeKind==CodeReader.CODE_JAN8)rv="CODE_JAN8";
  95:            if(codeKind==CodeReader.CODE_JAN13)rv="CODE_JAN13";
  96:            if(codeKind==CodeReader.CODE_QR)rv="CODE_QR";
  97:            if(codeKind==CodeReader.CODE_OCR)rv="CODE_OCR";
  98:            if(codeKind==CodeReader.CODE_UNKNOWN)rv="CODE_UNKNOWN";
  99:            if(codeKind==CodeReader.CODE_UNSUPPORTED)rv="CODE_UNSUPPORTED";
 100:            return rv;
 101:      }
 102:      
 103:      
 104:      
 105:      
 106:      //コードの読み取り 
 107:      void read(){
 108:            //@コードリーダ型変数の取得 
 109:            CodeReader codeReader=CodeReader.getCodeReader(0);
 110:            
 111:            //A読み込むコードの指定 
 112:            codeReader.setCode(kanouCode[pos]);
 113:            
 114:            //Bコードの読み込み 
 115:            try{
 116:                  codeReader.read();
 117:                  }catch(InterruptedOperationException e){
 118:                  res=null;
 119:                  return;
 120:            }
 121:            
 122:            //C読み込んだコードを取得 
 123:            res=codeReader.getString();
 124:            
 125:            
 126:            // -以下はおまけの機能かなー 
 127:            //Dバイトを読み取る 
 128:            readByte=codeReader.getBytes();
 129:            
 130:            
 131:            //E読み込んだコードの種類を取得 
 132:            int syurui=codeReader.getResultCode();
 133:            code=getCodeName(syurui);
 134:            
 135:            
 136:            
 137:            //F読み込んだコードのタイプの取得 
 138:            int codeType=codeReader.getResultType();
 139:            
 140:            //G読み込んだタイプの文字列設定 
 141:            if(codeType==CodeReader.TYPE_BINARY)type="TYPE_BINARY";
 142:            if(codeType==CodeReader.TYPE_NUMBER)type="TYPE_NUMBER";
 143:            if(codeType==CodeReader.TYPE_ASCII)type="TYPE_ASCII";
 144:            if(codeType==CodeReader.TYPE_STRING)type="TYPE_STRING";
 145:            if(codeType==CodeReader.TYPE_UNKNOWN)type="TYPE_UNKNOWN";
 146:      }
 147:      
 148:      
 149:      //読み込んだ値の取得 
 150:      String getRes(){return res;}
 151:      
 152:      //読み込んだコードのコードの種類の取得 
 153:      String getCode(){return code;}
 154:      
 155:      //読み込んだコードのタイプの取得 
 156:      String getType(){return type;}
 157:      
 158:      //読み込んだバイト値を文字列に変換する。 
 159:      String getByteString(){
 160:            String tv;
 161:            int k;
 162:            tv="";
 163:            k=0;
 164:            while(true){
 165:                  try{
 166:                        tv=tv+(int)readByte[k]+ ",";
 167:                        k++;
 168:                        }catch(Exception e){
 169:                        //バイトのサイズが不明のため、エラーを発生させ終わりにする。 
 170:                        break;
 171:                  }
 172:            }
 173:            return tv;
 174:      }
 175:      
 176:}
 177:
 178://--------------------------------------------- 
 179:// ApcクラスはCanvasの継承クラスです。 
 180://--------------------------------------------- 
 181:class Apc extends Canvas{
 182:      
 183:      CodeRead codeRead=new CodeRead();
 184:      
 185:      Apc(){
 186:            setSoftLabel(SOFT_KEY_2,"終了");
 187:            setSoftLabel(SOFT_KEY_1,"読込");
 188:      }
 189:      
 190:      public void paint(Graphics g){
 191:            
 192:            g.clearRect(0,0,getWidth(),getHeight());
 193:            
 194:            if(codeRead.getRes()==null){
 195:                  codeRead.paintKanouCode(g);
 196:                  }else{
 197:                  g.drawString("種類 :" +codeRead.getCode(),0,20);
 198:                  g.drawString("タイプ:" +codeRead.getType(),0,40);
 199:                  g.drawString("値 :" +codeRead.getRes(),0,60);
 200:                  g.drawString("バイト:" +codeRead.getByteString(),0,80);
 201:                  
 202:            }
 203:      }
 204:      
 205:      //イベント応答 
 206:      // type -イベントのタイプ 
 207:      // param -イベントに付随するパラメータ 
 208:      //    (キーが押された場合は、キーの種類) 
 209:      public void processEvent(int type,int param){
 210:            if(type==Display.KEY_RELEASED_EVENT){
 211:                  
 212:                  //ソフトキー2で、アプリを終了 
 213:                  if(param==Display.KEY_SOFT2)
 214:                  IApplication.getCurrentApp().terminate();
 215:                  
 216:                  
 217:                  if(param==Display.KEY_UP)codeRead.changeCode(param);
 218:                  if(param==Display.KEY_DOWN)codeRead.changeCode(param);
 219:                  
 220:                  //ソフトキー1で、バーコードの読み取り 
 221:                  if(param==Display.KEY_SOFT1)codeRead.read();
 222:                  
 223:                  //再描画 
 224:                  repaint();
 225:            }
 226:      }
 227:}
 228:
 229://------------------------------------------------ 
 230:// 以下のクラスのstratメソッドから開始します。 
 231://------------------------------------------------ 
 232:public class barCode extends IApplication{
 233:      
 234:      public void start(){
 235:            //キャンバスの生成と表示設定 
 236:            Display.setCurrent(new Apc());
 237:      }
 238:      
 239:}
 240:

以下のサイトから携帯にサンプルがダウンロードができます
http://www.geocities.jp/inu_poti/i/s/barCode.html