2016-08-11 3 views
0

Я написал образец кода для отправки APDU на бесконтактную смарт-карту по телефону nfc reader, и она работала успешно. Теперь я хочу написать андроидную библиотеку для выполнения некоторых операций, таких как проверка PIN-кода и т. Д. Эти функции должны подключаться к бесконтактной смарт-карте и отправлять им апду и возвращать результат. Проблема здесь :(Использование андроидного nfc-адаптера в андроидной библиотеке

Это мой пример кода, который работает:.

public class MainActivity extends Activity { 

    private NfcAdapter mAdapter = null; 
    static IsoDep myTag; 
    private TextView lblStatus; 
    private Button btnSelectApplet; 
    private PendingIntent mPendingIntent; 
    boolean mFirstDetected=false; 
    boolean mShowAtr=false; 

    private String[][] mTechLists; 
    private IntentFilter[] mFilters; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     lblStatus = (TextView) findViewById(R.id.lblStatus); 
     btnSelectApplet = (Button) findViewById(R.id.btnSelect); 
     btnSelectApplet.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       byte[] select = new byte[] {0x00, (byte)0xa4, 0x04, 0x00, 0x09, (byte)0xa0, 0x00, 
         0x00, 0x03, 0x08, 0x00, 0x00, 0x10, 0x00, 0x1a}; 

       byte[] res = transceives(select); 
      } 
     }); 
     resolveIntent(getIntent()); 
     mAdapter = NfcAdapter.getDefaultAdapter(this); 
     mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 
     IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); 
     try 
     { 
      ndef.addDataType("*/*"); 
     } 
     catch (IntentFilter.MalformedMimeTypeException e) 
     { 
      throw new RuntimeException("fail", e); 
     } 
     mFilters = new IntentFilter[] { ndef, }; 
     mTechLists = new String[][] { new String[] { IsoDep.class.getName() } }; 

    } 

    private static byte[] transceives (byte[] data) 
    { 
     byte[] ra = null; 
     try 
     { 
      ra = myTag.transceive(data); 
     } 
     catch (IOException e) 
     { 
     } 
     try 
     { 

     } 
     catch (Exception e1) 
     { 
      e1.printStackTrace(); 
     } 

     return (ra); 
    } 


    private void resolveIntent(Intent intent) 
    { 
     String action = intent.getAction(); 
     if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { 
      Parcelable tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
      final Tag t = (Tag) tag; 
      myTag = IsoDep.get(t); 
      mFirstDetected = true; 
      if (myTag != null) { 
       if (!myTag.isConnected()) { 
        try { 
         myTag.connect(); 
         myTag.setTimeout(5000); 
        } catch (IOException e) { 
         e.printStackTrace(); 
         return; 
        } 
       } 
       if (myTag.isConnected()) { 
        String szATR = null; 
        try { 
         mShowAtr = true; 
         szATR = " 3B " + getATRLeString(myTag.getHistoricalBytes()) + "80 01 " + getHexString(myTag.getHistoricalBytes()) + "" + getATRXorString(myTag.getHistoricalBytes()); 
        } catch (Exception e) { 
         mShowAtr = false; 
         szATR = "CARD DETECTED "; 
        } 
        lblStatus.setText(szATR); 
       } else { 
        lblStatus.setText("Not Connected!"); 
       } 
       if (mFirstDetected == true && myTag.isConnected()) { 

       } else { 
        lblStatus.setText("Not Connected!"); 
       } 
      } 
     } 
    } 

    private static String getATRLeString(byte[] data) throws Exception 
    { 
     return String.format("%02X ", data.length | 0x80); 
    } 

    private static String getATRXorString(byte[] b) throws Exception 
    { 
     int Lrc=0x00; 
     Lrc = b.length | 0x80; 
     Lrc = Lrc^0x81; 
     for (int i=0; i < b.length; i++) 
     { 
      Lrc = Lrc^(b[i] & 0xFF); 
     } 
     return String.format("%02X ", Lrc); 
    } 

    private static String getHexString(byte[] data) throws Exception 
    { 
     String szDataStr = ""; 
     for (int ii=0; ii < data.length; ii++) 
     { 
      szDataStr += String.format("%02X ", data[ii] & 0xFF); 
     } 
     return szDataStr; 
    } 

    @Override 
    protected void onNewIntent(Intent intent) 
    { 
     setIntent(intent); 
     resolveIntent(intent); 
    } 

    @Override 
    public void onResume() 
    { 
     super.onResume(); 
     if (mAdapter != null) 
     { 
      mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists); 
     } 
    } 

}

Пример кода используется enableForegroundDispatch функции для обнаружения смарт-карт в области NFC При обнаружении чиповых карт,, onNewIntent является

Я хочу поместить весь код в библиотечный модуль android X и использовать его в Activity Y like

Activity Y extend X 

или

X x = new X() 

и называть его функции. как я мог его реализовать? У меня есть проблема, когда я хочу, чтобы позвонить

mAdapter = NfcAdapter.getDefaultAdapter(this); 

, если я использую этот код:

mAdapter = NfcAdapter.getDefaultAdapter(context);// context pass from Y Activity to X(Android library) 

функцию

mAdapter.enableForegroundDispatch(this , mPendingIntent, mFilters, mTechLists); // In X (Android library) 

не работает правильно, потому что он не использует Y (он использовал X-экстенсивно). Как я могу решить мою проблему таким образом, чтобы весь код был в X (андроидная библиотека)?

Спасибо.

ответ

0

согласно моему пониманию, вы пытаетесь получить доступ к некоторым методам от другой деятельности,

  1. здесь я предлагаю вам создать третий класс для того, что методы модуля NFC,
  2. создать одноплодной метод, который возвращает статический экземпляр этого класса модели.
  3. вы можете получить доступ к этому экземпляру из любой вашей деятельности.
  4. вы также можете установить обратный вызов в классе и вызов другого метода из другого класса деятельности.

Надеюсь, это вам поможет. спросите, если что-то неясно.

Happy Code:

+0

благодарит за ответ. Могу ли я использовать «enableForegroundDispatch» (активность активности, намерение PendingIntent, фильтры IntentFilter [], функция String [] [] techLists] в одиночном классе, который не является активностью? –

Смежные вопросы