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

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


サービス接続インターフェース(ServiceConnection)には、サービスの状態をモニタリングするメソッドが定義されている。 今回は、下記2つの役割を担うクラスとして実装する。
  • FeliCaサービスとの接続が確立された時点でFeliCaチップにアクセスするためのオブジェクトを得る
  • FeliCaチップの利用開始処理を試行し、成功=FeliCa搭載端末と判定する
public class FelicaConnection implements ServiceConnection
{
  private Felica mFelica;
  
  @Override
  public void onServiceConnected(ComponentName name, IBinder service)
  {
    // FeliCaチップアクセスオブジェクト取得
    mFelica
      = ((Felica.LocalBinder)service).getInstance();
  }

  @Override
  public void onServiceDisconnected(ComponentName name)
  {
    try {
      mFelica.inactivateFelica();
    }
    catch (Exception ignore) {}
  }
  
  /**
   * FeliCaをサポートしているかどうかチェックする。
   * @return true:サポートしている
   *         false:サポートしていない
   */
  public boolean isSupported()
  {
    try
    {
      // FeliCaチップ利用開始
      mFelica.activateFelica(null, new FelicaEventAdapter());
      return true;
    }
    catch (Exception e)
    {
      // 失敗するとここに来る
      return false;
    }
    finally
    {
      try
      {
        mFelica.inactivateFelica();
      }
      catch (Exception ignore) {}
    }
  }
}
さらっと出てきたFelicaEventAdapterは、FelicaEventListenerインターフェースを空実装(処理無し)したものなのでここでは割愛する。

FeliCaサービスとの接続


FeliCaサービスとの接続は、通常のサービス接続と何も変わらず、下記のような感じに実装する。
Context ctx = getApplicationContext();

// サービスを識別するインテント
Intent intent
  = new Intent(ctx, Felica.class);

// サービス接続インターフェース
FelicaConnection conn
  = new FelicaConnection();

// 接続
boolean result = ctx.bindService(
  intent,
  conn,
  Context.BIND_AUTO_CREATE);

FeliCa搭載チェック


最後に、用意しておいたFeliCaサポートチェックメソッドを呼び出して、サービス接続を切ったら終了。 コードは上の続き。
boolean supported = false;

// 接続に成功した場合のみ
if (result)
{
  supported = conn.isSupported();
  
  // サービス切断
  getApplicationContext().unbindService(conn);
}

// FeliCa搭載してるか否か!?
return supported;

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

0 件のコメント:

コメントを投稿