2011年5月17日火曜日

AndroidでFeliCa対応端末であるかを判定する方法

アプリ開発者にとって、FeliCa対応Android端末(通称:おサイフケータイ対応Android携帯電話)であるか否かを知るのは、時と場合によっては大事なこと。

今回は、FeliCa Networksが公開しているモバイルFeliCaクライアント for Androidを使ってお手元の端末がおサイフケータイなのか否かを判別する。



必要な作業

  • AndroidManifest.xmlへの設定追加
  • FeliCaサービス(com.felicanetworks.mfc.Felica)と接続するインターフェースを実装
  • FeliCaサービスとの接続(bindService)
  • FeliCaをサポートしているかチェック(FeliCaチップの利用開始処理を試行)

AndroidManifest.xmlへの設定追加


AndroidManifestには、FeliCaチップにアクセスするためのパーミッション設定を下記のように追加する。
  1. <uses-permission  
  2.   android:name="com.felicanetworks.mfc.permission.MFC_ACCESS"/>  
さらに、FeliCaサービスを使用するため、下記のようにサービス宣言を追加する。
  1. <service  
  2.   android:name="com.felicanetworks.mfc.Felica"  
  3.   android:exported="false"/>  

サービス接続インターフェース実装


サービス接続インターフェース(ServiceConnection)には、サービスの状態をモニタリングするメソッドが定義されている。 今回は、下記2つの役割を担うクラスとして実装する。
  • FeliCaサービスとの接続が確立された時点でFeliCaチップにアクセスするためのオブジェクトを得る
  • FeliCaチップの利用開始処理を試行し、成功=FeliCa搭載端末と判定する
  1. public class FelicaConnection implements ServiceConnection  
  2. {  
  3.   private Felica mFelica;  
  4.     
  5.   @Override  
  6.   public void onServiceConnected(ComponentName name, IBinder service)  
  7.   {  
  8.     // FeliCaチップアクセスオブジェクト取得  
  9.     mFelica  
  10.       = ((Felica.LocalBinder)service).getInstance();  
  11.   }  
  12.   
  13.   @Override  
  14.   public void onServiceDisconnected(ComponentName name)  
  15.   {  
  16.     try {  
  17.       mFelica.inactivateFelica();  
  18.     }  
  19.     catch (Exception ignore) {}  
  20.   }  
  21.     
  22.   /** 
  23.    * FeliCaをサポートしているかどうかチェックする。 
  24.    * @return true:サポートしている 
  25.    *         false:サポートしていない 
  26.    */  
  27.   public boolean isSupported()  
  28.   {  
  29.     try  
  30.     {  
  31.       // FeliCaチップ利用開始  
  32.       mFelica.activateFelica(nullnew FelicaEventAdapter());  
  33.       return true;  
  34.     }  
  35.     catch (Exception e)  
  36.     {  
  37.       // 失敗するとここに来る  
  38.       return false;  
  39.     }  
  40.     finally  
  41.     {  
  42.       try  
  43.       {  
  44.         mFelica.inactivateFelica();  
  45.       }  
  46.       catch (Exception ignore) {}  
  47.     }  
  48.   }  
  49. }  
さらっと出てきたFelicaEventAdapterは、FelicaEventListenerインターフェースを空実装(処理無し)したものなのでここでは割愛する。

FeliCaサービスとの接続


FeliCaサービスとの接続は、通常のサービス接続と何も変わらず、下記のような感じに実装する。
  1. Context ctx = getApplicationContext();  
  2.   
  3. // サービスを識別するインテント  
  4. Intent intent  
  5.   = new Intent(ctx, Felica.class);  
  6.   
  7. // サービス接続インターフェース  
  8. FelicaConnection conn  
  9.   = new FelicaConnection();  
  10.   
  11. // 接続  
  12. boolean result = ctx.bindService(  
  13.   intent,  
  14.   conn,  
  15.   Context.BIND_AUTO_CREATE);  

FeliCa搭載チェック


最後に、用意しておいたFeliCaサポートチェックメソッドを呼び出して、サービス接続を切ったら終了。 コードは上の続き。
  1. boolean supported = false;  
  2.   
  3. // 接続に成功した場合のみ  
  4. if (result)  
  5. {  
  6.   supported = conn.isSupported();  
  7.     
  8.   // サービス切断  
  9.   getApplicationContext().unbindService(conn);  
  10. }  
  11.   
  12. // FeliCa搭載してるか否か!?  
  13. return supported;  

注意点
  • FeliCaのサイトからダウンロードしたMFCUtility_1.0.1.jarを静的にリンクしておく必要がある(やってないとコンパイルすら通らないので気付くと思うけど:D)
  • FeliCaチップ利用開始処理(activateFelica())を行うと、利用終了処理(inactivateFelica())を行うまでは他のアプリケーションがFeliCaチップを利用できなくなる。

0 件のコメント:

コメントを投稿