2011/09/17

Android 3.1以上でPaSoRiを動かせそうなライブラリを公開

JavaもAndroidもFeliCaもNFCも、なんとなく中途半端な知識しかない。
ないのだが、せっかく作ったので公開してみたくなるのは仕方ないだろう。
githubに、Android 3.1以上でPaSoRiを動かせるんじゃないかな、と思うライブラリを公開しました。

git clone git://github.com/hirokuma/NfcPcd.git

 

ProGuardをかけてみたので、うまく動くかどうかわからんです。


プロジェクトの設定で、ライブラリを追加

Java Build Path > Libraries

libnfcpcd.jarを追加。

 

AndroidManifest.xmlに、以下が必要。

manifest内

<uses-feature android:name="android.hardware.usb.host"></uses-feature>

activity内

<intent-filter>
    <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>

<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" />

 

ソースファイルにも手が入る。

Activityソース

Activityクラスに「implements com.blogpost.hiro99ma.pcd.UsbHost.UsbListener」を付ける。
USB挿抜検知用(動くと思う)。

eclipseでやっていると、メソッドが足りん、といわれるので、いわれるままに追加。

@Override
public void inserted() {
    // 挿された!    
}
 
@Override
public void removed() {
    // 抜かれた!
}

やってみたけど、挿された方はうまくいかんかったです。

onCreate()で、UsbHostのonCreate()を呼んでやるのも必要。

・・・
説明が面倒になったので、サンプルも置きました。
はてさて、どうなることやら。

7 件のコメント:

  1. おお、こんなの探してました。
    がんばってください。

    返信削除
  2. ありがとうございます。
    動くかどうか、自分のところでしか試してないのでよくわからないんですよねぇ。

    返信削除
  3. すばらしいライブラリの公開ありがとうございます。
    サンプルはNexu7+RC-S330で無事動作しました。
    あつかましくてすいませんが、IDmの取得はわかりましたが、データの読み取り方法がよくわかりませんでした。
    何かサンプルを公開いただけるとありがたいです。

    返信削除
    返信
    1. 【解決】自己Resになります。
      communicateThruExを使ってlibpasoriを参考に
      ・servicecodeを取得
      ・felica_read_without_encryption02を作成し、上で取得したサービスの読み込み
      で読み込みができました。
      communicateThruExがあるのでlibpasoriのコマンド移植をして、それでやるんですね。

      削除
    2. 解決されたようで、よかったです。
      今のところFeliCa Lite用にしか作っていないので、communicateThruExを使うしかないと思います。

      削除
    3. 【お礼】
      コメントありがとうございます。
      やはりcommunicateThruExなんですね。
      Nexu7だと内蔵のNFCでも読めるのですが、Pasoriのように存在感のある部分に置く方がいかにもカードリーダっぽいです。(^^!
      PS.
      「ニモカ残高」なども公開されていたんですね。

      削除
    4. 「ニモカ残高」はサービスコード固定なので、こんな感じで書いていますね。

      boolean ret = NfcPcd.pollingF(0x0003);
      if(ret) {
      NfcF f = NfcF.getInstance();
      byte[] buf = new byte[NfcPcd.SIZE_BLOCK];
      int[] opt = new int[] { 0x090f }; //service code
      ret = f.read(buf, 0, opt);
      if(ret) {
      int money = (int)(((short)buf[11]) << 8 | (((short)buf[10]) & 0x00ff));
      mMoneyText.setText(Integer.toString(money) + " yen");
      } else {
      mMoneyText.setText(R.string.fail_read);
      Log.d(TAG, "fail read.");
      }
      } else {
      mMoneyText.setText(R.string.fail_read);
      Log.d(TAG, "not FeliCa card.");
      }
      NfcPcd.rfOff();

      削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。