NFC 태그 프론트 데스크 배포 및 데이터 읽 기

8592 단어
파일 설정 이 프론트 데스크 톱 배포 기능 을 실현 하려 면 먼저 Manifest 파일 을 설정 해 야 합 니 다. 그 중에서 LanchActivity 는 간단 한 시작 페이지 일 뿐 MainActivity 로 이동 합 니 다.공식 문서 에 따 르 면 탭 스 캔 결 과 를 처리 하 는 Activity 는 프로그램의 시작 페이지 이지 만 저 희 는 보통 시작 페이지 에서 데 이 터 를 처리 하지 않 습 니 다.
   

    

    
        

            
                
                
            
            
        
        
            
                
                
            
        
    

@xml/nfc_tech_filter 파일, 이 파일 은 응용 프로그램 이 지원 하 는 NFC 기술 목록 입 니 다.


    
        android.nfc.tech.MifareClassic
    



홈 페이지 문서 가 지원 하 는 모든 기술 목록 은 다음 과 같 습 니 다.

    
        android.nfc.tech.IsoDep
        android.nfc.tech.NfcA
        android.nfc.tech.NfcB
        android.nfc.tech.NfcF
        android.nfc.tech.NfcV
        android.nfc.tech.Ndef
        android.nfc.tech.NdefFormatable
        android.nfc.tech.MifareClassic
        android.nfc.tech.MifareUltralight
    


홈 페이지 설명 에 따 르 면 라벨 배포 차단 은 다음 과 같은 절차 가 있 습 니 다. 1. onCreate 방법 에서 전체적인 PendingIntent 대상 을 만 들 고 NFC 탭 을 스 캔 할 때 시스템 은 스 캔 한 tag 정보 로 이 pendingIntent 대상 을 채 울 수 있 습 니 다.코드 는 다음 과 같 습 니 다:
 pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

2. 차단 할 intent 필 터 를 정의 합 니 다.장치 가 탭 을 검색 할 때 시스템 프론트 데스크 톱 배포 시스템 은 받 은 intent 에 따라 우리 가 지정 한 intent Filter 에 부합 되 는 지 확인 합 니 다.일치 하면 프로그램 이 이 intent 를 처리 합 니 다. 그렇지 않 으 면 시스템 intent 배포 시스템 을 호출 합 니 다.intent 필터 와 기술 필터 배열 이 비어 있 으 면 TAG 를 받 을 수 있 습 니 다.DISCOVERED 에 있 는 모든 태그.(즉, 시스템 태그 배포 시스템 을 우리 프론트 데스크 톱 Activity 로 차단 하려 면 차단 한 intent 필터, 우리 가 처리 해 야 할 기술 필터 배열 을 정의 해 야 합 니 다) 시스템 예제 코드 는 다음 과 같 습 니 다.
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    try {
        ndef.addDataType("*/*");    /* Handles all MIME based dispatches.
                                       You should specify only the ones that you need. */
    }
    catch (MalformedMimeTypeException e) {
        throw new RuntimeException("fail", e);
    }
   intentFiltersArray = new IntentFilter[] {ndef, };

내 가 테스트 하 는 과정 에서 mime 형식 을 사용 하지 않 았 다.
techListsArray = new String[][]{new String[]{MifareClassic.class.getName()}};//       
IntentFilter ndef = new IntentFilter();
ndef.addAction(NfcAdapter.ACTION_NDEF_DISCOVERED);//        
intentFiltersArray = new IntentFilter[]{ndef};

3. 복사 시스템 방법
  @Override
    protected void onNewIntent(Intent intent) {
        processIntent(intent);//         ,          intent 
    }

    @Override
    protected void onPause() {
        super.onPause();
        nfcAdapter.disableForegroundDispatch(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
        if (getIntent().getAction() != null) {
            if (NfcAdapter.ACTION_TECH_DISCOVERED.endsWith(getIntent().getAction())) {
                processIntent(getIntent());
            }
        }
    }

이 가운데 onResume 방법의 if 판단 은 프로그램 이 실행 되 지 않 았 을 때 NFC 탭 을 스 캔 해도 데 이 터 를 받 을 수 있 도록 하 는 것 이다.
그 다음 에 중요 한 것 은 데이터 읽 기와 쓰기 입 니 다. 여 기 는 간단 한 조작 일 뿐 구체 적 으로 는 공식 문 서 를 참고 해 야 합 니 다.
  //    block    
  private void readData(final MifareClassic mfc) {
        if (mfc != null) {
            if (mfc.isConnected()) {
                try {
                    String result = "";
                    tvStatus.setText("      ");
                    for (int i = 0; i < mfc.getSectorCount(); i++) {//         
                        int bindex;
                        int bCount;
                        if (mfc.authenticateSectorWithKeyA(i, MifareClassic.KEY_DEFAULT)) {//        key,      
                            bindex = mfc.sectorToBlock(i);
                            bCount = mfc.getBlockCountInSector(i);
                            result += "Sector " + i + "    
"; for (int j = 0; j < bCount; j++) {// , key, , byte[] data = mfc.readBlock(bindex); result += "Block " + bindex + " : " + new String(data, Charset.forName("UTF-8")) + "
"; bindex++; } } } tvStatus.setText(" "); tvReadData.setText(result); } catch (Exception ex) { tvStatus.setText(" :" + ex.getMessage()); } } } else { Toast.makeText(this, " NFC", Toast.LENGTH_SHORT).show(); } } // block private void writeData(final MifareClassic mfc, final int blockIndex, String msg) { if (mfc != null) { try { Log.e(TAG, "writeData: isConnected:" + mfc.isConnected()); if (mfc.isConnected()) { byte[] temp = msg.getBytes(Charset.forName("UTF-8")); final byte[] write = new byte[MifareClassic.BLOCK_SIZE];// for (int i = 0; i < MifareClassic.BLOCK_SIZE; i++) { if (i < temp.length) write[i] = temp[i]; else write[i] = 0; } tvStatus.setText(" "); new Thread(new Runnable() { @Override public void run() { try { Log.e(TAG, "run: :" + new String(write)); mfc.writeBlock(blockIndex, write);// , UI runOnUiThread(new Runnable() { @Override public void run() { tvStatus.setText(" "); } }); } catch (final Exception ex) { Log.e(TAG, "writeData_Ex: " + ex.getMessage()); runOnUiThread(new Runnable() { @Override public void run() { tvStatus.setText(" :" + ex.getMessage()); } }); } } }).start(); } else { Toast.makeText(this, "NFC ", Toast.LENGTH_SHORT).show(); } } catch (Exception ex) { Log.e(TAG, "writeData: " + ex.getMessage()); } } else { Toast.makeText(this, " NFC ", Toast.LENGTH_SHORT).show(); } }

NFCWRDemo PS: 잘 못 썼 습 니 다. 기록 만 있 습 니 다.

좋은 웹페이지 즐겨찾기