私がしなければならないことは、アクセスしたいアプリケーションを見つけてADPUコマンドを送信することであるとスタックオーバーフローで[読んだ]。
正しい、それはまさにあなたがする必要があることです。この情報 (つまり、カードの通信プロトコルの仕様) を取得したら、次のようにします。
Tag tag = ... // TODO: get tag handle from intent
IsoDep isoDep = IsoDep.get(tag);
if (isoDep != null) {
isoDep.connect();
byte[] response = isoDep.transceive(SELECT_APDU); // SELECT_APDU = 00 A4 0400 <Lc> <APPLICATION ID>
// TODO: send further APDU commands according to the protocol specification
//response = isoDep.transceive(APDU);
isoDep.close();
}
[...]しかし、Androidアプリでカードを探索すると、常にFound 0 Applicationsと表示されるため、私のカードにはアプリケーションがないようです。
これは通常、**スキャナー アプリに認識されている**カードにアプリケーションがないことを意味するだけです。多くの ISO-DEP カードには、カード上で利用可能なアプリケーションの公的に読み取り可能なディレクトリがありません。(一部のカードには EF.DIR または類似のものがある場合があります。)
そのため、どこでこの情報を入手すればよいかわかりません。
そうです、それは通常トリッキーな部分です。これにはいくつかのアプローチがあります。
- 仕様については、搬送システムのオペレーターにお問い合わせください。
- カードに EF.DIR (または同様のもの) があり、そこに何かがリストされているかどうかを確認します (ただし、カードのプロトコルはまだ明らかにされていないため、これは出発点にすぎません)。
- カードに GlobalPlatform セキュリティ ドメイン/カード マネージャーがあるかどうか、およびそのカード マネージャーがデフォルトのキーでアクセスできるかどうかを確認します (Google が詳しい情報を見つけるのに役立ちます)。存在する場合、GP は、インストールされているアプリケーションを一覧表示するコマンドを提供します。プロトコルについては、2.に同じ。
- カードにアクセスできることがわかっているアプリをリバース エンジニアリングします。(これはあなたの国では違法であるか、アプリのライセンス契約で禁止されている可能性があることに注意してください。)