2

Samsung Nexus電話からカードを読みたいのですが、androidnfcapiには十分なオプションがありません。また、サードパーティのAPI名「opennfc」を使用してみましたが、APIがサポートされていないというエラーが発生します。カードからデータを読み取るためのコードを誰かに教えてもらえますか?タグを読み取るコードはありますが、カードを読み取るコードはありません。開いているnfcapiをダウンロードするためのリンクは次のとおりです。

http://sourceforge.net/projects/open-nfc/files/Open%20NFC%204.3%20beta%20%2810381%29/

どんな助けでも大歓迎です。

これは私が使用したコードです。opennfcが失敗するというエラーが発生します...

   public class NFCone  extends Activity implements CardDetectionEventHandler,     ReadCompletionEventHandler,NfcTagDetectionEventHandler{

CardListenerRegistry i=null;
CardDetectionEventHandler hand=null;
NfcManager nfcMngr = null;
NfcTagManager mNfcTagManager=null;
NfcTagDetectionEventHandler tagHand=null;
ReadCompletionEventHandler readHand=null;
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main1); 
    System.out.println("onCreate");
    try
    {
        nfcMngr.start();
        i.registerCardListener(NfcPriority.MAXIMUM, hand);
    }
    catch(Exception e)
    {

    }
}
protected void onResume() {
    // TODO Auto-generated method stub

    super.onResume();
    System.out.println("onResume");

    Toast.makeText(this, "NDEF reader Starting ... ", Toast.LENGTH_SHORT)
            .show();
    try{
    if (mNfcTagManager != null) {

        mNfcTagManager.registerTagListener(NfcPriority.MAXIMUM, tagHand);
        mNfcTagManager.registerMessageReader(NdefTypeNameFormat.WELL_KNOWN,
                "U", NfcPriority.MINIMUM, this);
    }
    }
    catch(Exception e)
    {       }
    }
protected void onPause() 
{   
    super.onPause();
    System.out.println("onPause");
    mNfcTagManager.unregisterMessageReader(readHand);
    mNfcTagManager.unregisterTagListener(tagHand);

}
protected void onDestroy() 

{ 
    super.onDestroy();
    System.out.println("onDestroy");
    i.unregisterCardListener(hand);
    try{
    nfcMngr.stop();
    }
    catch(Exception e)
    {       }
}
public void onCardDetected(Connection connection) {
    System.out.println("onCardDetected");

    //ConnectionProperty[] con = connection.getProperties();

}
public void onCardDetectedError(NfcErrorCode what) {
    System.out.println("onCardDetectedError");
    // TODO Auto-generated method stub

}
private void startBrowserOn(String url) {
    System.out.println("startBrowserOn");
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
}
public void onReadError(NfcErrorCode what) {
    System.out.println("onReadError");
}
public void onTagRead(NdefMessage message) {
    {
        System.out.println("onTagRead");
        if (message != null) {

            Vector<NdefRecord> records = message.getRecords();

            for (int i = 0; i < records.size(); i++) {

                if (UriRecord.isUriRecord(records.elementAt(i))) {

                    UriRecord uri;

                    try {
                        try {

                            uri = new UriRecord(records.elementAt(i));
                            startBrowserOn(uri.getUri().toString());
                        } catch (NfcException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                    } catch (URISyntaxException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();

                        Toast.makeText(this, "URISyntaxException! ",
                                Toast.LENGTH_SHORT).show();
                    }

                    break;
                }}}}
}
    public void onTagDetected(NfcTagConnection connection) {
    System.out.println("onTagDetected");

}
    public void onTagDetectedError(NfcErrorCode what) {
    System.out.println("onTagDetectedError");

}
 }
4

3 に答える 3

1

Open NFC を使用している間は、Nexus S を使用してカードを読み取ることはできません。少なくともまだです。

Open NFC スタックはハードウェアに依存せず、HAL と呼ばれる抽象化レイヤーを使用します。Open NFC で使用できる HAL は Inside Secure ハードウェア用のみですが、Nexus S は NXP ハードウェアを使用します。

読み取ろうとしているカードの種類を書く必要はありませんが、おそらく Android API を使用することで実現できます。特に、MIFARE カードの読み書きができました。

発見された技術をフィルタリングする必要があります

<tech>android.nfc.tech.MifareClassic</tech>
<tech>android.nfc.tech.MifareUltralight</tech>

次に、onNewIntentメソッドで

    Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
     MifareClassic clas = MifareClassic.get(tagFromIntent);
            try
            {
                clas.connect();
                if (!DefaultAuthenticate(clas))
                    throw new Exception("Unable to authenticate using default key");
                String myData = new String(clas.readBlock(clas
                            .sectorToBlock(MY_DATA_SECTOR)), "US-ASCII");
                clas.close();
            } catch (Exception ex)
            {
                ShowMessage(ex.getMessage());
            } 

DefaultAnthenticate は、デフォルトの MIFARE キーを使用して認証する私の方法です。

private Boolean DefaultAuthenticate(MifareClassic clas) throws IOException
    {
        Boolean result = false;
        result = clas.authenticateSectorWithKeyA(MY_DATA_SECTOR,
                MifareClassic.KEY_DEFAULT);
        result = result
                && clas.authenticateSectorWithKeyB(MY_DATA_SECTOR,
                        MifareClassic.KEY_DEFAULT);
        return result;
    }

コードはリファクタリングを使用する可能性があり、少し切り刻まれていますが、何が起こっているかを示していると思います。あなた自身の検索に役立つことを願っています-http://developer.android.com/guide/topics/connectivity/nfc/advanced-nfc.htmlにアクセスすることをお勧めします

于 2012-09-12T09:51:04.070 に答える
0

opennfc ライブラリを Eclipse プロジェクトに追加する必要があります。

プロジェクトを右クリックして を選択しProperties、 に移動しJava Build Path|Librariesます。Add external JARsopennfc ライブラリをクリックして選択します。最後に、Order and Exportタブをクリックして、opennfc ライブラリのエクスポートがチェックされていることを確認します。

于 2011-07-01T09:34:29.197 に答える
0

sourceforg で提供される OpenNFC スタック SDK アドオン パッケージには、NFC コントローラーをエミュレートするカスタム カーネルが付属しています (パッケージに付属の SDK ドキュメントを参照してください)。したがって、ドライバー (open_nfc_driver.ko) を変更せずに実際のハードウェアと話しているかどうかは疑問です。移植ガイド (パッケージにも含まれています) では、ドライバーを実際のハードウェアに移植する方法について説明しています (セクション 4.5 移植を実際のハードウェア プラットフォームに適合させる)。

于 2011-07-04T19:32:04.053 に答える