2012-07-30 5 views
0

스마트 카드 읽기가 완료되면 Android NFC 앱에 동일한 NFC 태그 정보가 다시 표시되고 작동 중 다시 시작됩니다. 체계. 실제로 휴대 전화를 옮기지 않으면 영구적 인 고리가됩니다. 읽는 데이터의 양은 1 ~ 2 초 정도 걸리므로 결국 다시 시작됩니다. 는 (이것은 내 갤럭시 S2 진저와 ICS 내 S3에 매우 일반적이다)NFC (스마트 카드)에 가까울 때 Android NFC 앱 루핑을 중지하는 방법

나는 그것이 NFC 소스 (스마트 카드)를 변경하지 않은 경우 반복 멀리 전화에서 이동하지 않은 중지하려면 어떻게

?

내 활동의 인 텐트 필터가 있습니다

<tech-list> 
    <tech>android.nfc.tech.IsoDep</tech> 
</tech-list> 

의 기술 목록

  <intent-filter > 
       <action android:name="android.nfc.action.TECH_DISCOVERED" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <action android:name="android.nfc.action.TAG_DISCOVERED" /> 
      </intent-filter> 
      <meta-data 
       android:name="android.nfc.action.TECH_DISCOVERED" 
       android:resource="@xml/filter_nfc" /> 

을 소스 코드 :

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    resolveIntent(getIntent()); 
} 

@Override 
public void onNewIntent(Intent intent) { 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
} 

private void resolveIntent(Intent intent) { 
      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    final String action = intent.getAction(); 
    if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) 
       || NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) { 
     ....work 
     handled = true; 
    } 
    if (!handled) { 
     Log.e(tag, "Unknown intent " + intent); 
     finish(); 
     return; 
    } 
} 

답변

0

는 유일한 방법 나는 그것을 해결할 수 onCreate (setContentView line 및 resolveIntent 행) 내부에 시간 확인을 배치하는 것이 었습니다. 또한 insid onNewIntent 함수.

이것은 Android가 NFC를 처리하기 위해 다시 앱을 호출하는 것을 멈추지 않았지만 마지막 NFC 읽기로부터 2 초 이내에 호출 된 경우 앱이 아무 것도하지 않았습니다.

아마도 가장 깨끗한 방법은 아니지만 루핑 문제에 효과적 일 수 있으며 다른 장치에서 모든 테스트를 통과해야합니다.

0

이것은 정상적인 현상은 아니지만 비슷한 문제가 발생했습니다. 내가 시도한 것은 NFC 전경 파견을 가능하게하는 것이 었습니다. 이렇게하면 들어오는 NFC 인 텐트를 앱이 완벽하게 제어 할 수 있습니다. 그런 다음 태그의 ID (또는 마지막 NFC 이벤트 이후 경과 한 시간)를 기준으로 태그를 무시할 수 있습니다.

@Override 
protected void onResume() { 
    ... 
    ForegroundDispatch.setupForegroundDispatch(this); 
} 

@Override 
protected void onPause() { 
    ... 
    ForegroundDispatch.stopForegroundDispatch(this); 
}; 

@Override 
public void onNewIntent(Intent intent) { 
    ... // check for the tag's ID or elapsed time to determine how to react 
} 
+0

다시 감사합니다. NFC guy! 이 문제는 특정 전화기 및 특정 카드가 다른 사람이 그렇지 않을 때 보여 주었던 것처럼 매우 어려웠습니다. 내 해결책은 아래에 있습니다. 나는 전경 파견을 사용하고 ID를 읽는 것이 항상 신뢰할만한 것은 아니므로 다른 요청을 무시하기 위해 시간 지연을 사용해야했습니다. 두 번째 것이 무시되면 그것은 영원히 반복을 멈추는 것처럼 보였습니다! – paul