Android NFC для чтения карт от Samsung Nexus - PullRequest
2 голосов
/ 01 июля 2011

Я хочу прочитать карту с телефона Samsung Nexus, но Android nfc api не предоставляет достаточного количества опций.Я также пытался использовать сторонние имена API "Open NFC", но он дает ошибку не поддерживает API.Может ли кто-нибудь предоставить мне код для чтения данных с карты.У меня есть код для чтения тега, но не для чтения карты.Вот ссылка для загрузки открытого API NFC.

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");

}
 }

Ответы [ 3 ]

1 голос
/ 12 сентября 2012

Вы не можете прочитать карту с помощью Nexus S при использовании Open NFC. По крайней мере, пока.

Открытый стек NFC не зависит от оборудования и использует уровень абстракции, называемый HAL. Единственные доступные HAL для Open NFC предназначены для аппаратного обеспечения Inside Secure, тогда как Nexus S использует аппаратное обеспечение NXP.

Вы не пишете, какую карту вы пытаетесь прочитать, но, вероятно, это достижимо с помощью API Android. Помимо прочего, я мог читать и писать на карту 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

0 голосов
/ 04 июля 2011

Пакет дополнений OpenKFC stack SDK, предоставляемый в sourceforg, поставляется с собственным ядром, которое эмулирует контроллер NFC (см. Документацию SDK, поставляемую в комплекте).Поэтому я сомневаюсь, что вы говорите с реальным HW без изменения драйвера (open_nfc_driver.ko) для этого.В Руководстве по портированию (также входит в комплект) обсуждается, как перенести драйвер на реальное оборудование (раздел 4.5 Адаптация переноса к реальной аппаратной платформе).

0 голосов
/ 01 июля 2011

Вам необходимо добавить библиотеку opennfc в ваш проект Eclipse.

Щелкните правой кнопкой мыши по проекту и выберите Properties, перейдите к Java Build Path|Libraries. Нажмите Add external JARs и выберите свою библиотеку opennfc. Наконец, нажмите на вкладку Order and Export и убедитесь, что ваша библиотека opennfc проверена на экспорт.

...