Проблема системы диспетчеризации переднего плана в Android NFC

Я хотел бы создать одно конкретное приложение NFC среди нескольких других приложений NFC, которое должно иметь следующие возможности
1. Приложение должно запускаться только тогда, когда на устройстве сканируется метка NFC с определенным текстом (тип NDEF). (Это означает, что мое приложение не должно отображаться, если нажаты какие-либо другие теги с текстовым типом)

  1. При запуске приложения не должно быть опции «Завершить действие с помощью» и списка всех приложений NFC в устройстве.

Здесь я реализовал систему диспетчеризации переднего плана, но в ней перечислены только все приложения NFC с приоритетом NDEF_DISCOVERED.

Фрагмент кода для файла манифеста выглядит следующим образом:

   <activity android:name=".NFCDiscovered" android:label="@string/app_name">
       <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>  
    </activity>


</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />

Здесь NFCDiscovered.java заботится о чтении тега NFC определенного текстового типа с помощью системы диспетчеризации переднего плана. Фрагмент кода для этого как:

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.nfcreader);
    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_NDEF_DISCOVERED);
    try {
        ndef.addDataType("text/plain");

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

    mFilters = new IntentFilter[] { ndef }; 

    //resolveIntent(getIntent());

}

public void onResume() {
    super.onResume();
    // TODO Auto-generated method stub
    TextView myText= (TextView)findViewById(R.id.nfcTxt);
    super.onResume();        
    if (mAdapter != null) 
        mAdapter.enableForegroundDispatch(this, mPendingIntent, 
          mFilters,null);




}
protected void onNewIntent(Intent intent) { 
    NdefMessage[] msgs = null;
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())){
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawMsgs != null) {
            msgs = new NdefMessage[rawMsgs.length];
            for (int i = 0; i < rawMsgs.length; i++) {
                msgs[i] = (NdefMessage) rawMsgs[i];
            }
        }

    }
    List<TextRecord> records = NdefMessageParser.parse(msgs[0]);
    String text = null;
    for(TextRecord local:records)
    {
         text = local.getText();
    }
    //myText.setText("text :"+msgs);



}
public void onPause() {        
    super.onPause();        
    if (mAdapter != null) mAdapter.disableForegroundDispatch(this);    
}

Было бы здорово, если бы кто-нибудь сказал мне, что мне не хватает.
Заранее спасибо.


person Jeena Joseph    schedule 03.02.2012    source источник
comment
Мне не ясно, что вы на самом деле сканируете тег с вашим приложением, УЖЕ запущенным и на переднем плане, поскольку вы говорите, что приложение должно запускаться только тогда, когда тег NFC с определенным текстом... Диспетчеризация переднего плана работает только тогда, когда ваш приложение находится на переднем плане. Если он находится на переднем плане, то что-то не так либо с тем, как вы фильтруете намерение, либо с тем, какое намерение фактически запущено. Можете ли вы проверить logcat, чтобы увидеть, какие намерения запускаются, когда вы сканируете тег и вставляете их сюда?   -  person robertly    schedule 04.02.2012


Ответы (2)


Если вы контролируете содержимое тегов NFC и используете Android 4.0, рассмотрите возможность добавления Запись приложения Android после текстового сообщения.

person NFC guy    schedule 26.02.2012

три комментария:

  1. вы создаете и инициализируете объект IntentFilter и вообще используете его. возможно, вам следует удалить этот код для ясности, поскольку вы уже используете механизм диспетчеризации переднего плана в файле AndroidManifest.xml.

  2. рекомендуем использовать приложение для чтения NFC из Google Play для сбора информации о тегах NFC, которые вы пытаетесь прочитать или записать. приложение может предоставить список технологий, которые поддерживает тег, и объем памяти, который у него есть.

  3. может быть, вы можете сначала начать с активного режима чтения. ниже сегмента кода.

    @Override
    public void onResume(){
    
    super.onResume();
    
    // here to scan code.
    NfcAdapter mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
    
    // disable foreground dispatch
    mNfcAdapter.disableForegroundDispatch(this);
    
    Bundle bundle = new Bundle();
    //
    mNfcAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A, null) };
    

тогда вы можете сосредоточиться на самом сообщении NFC вместо диспетчеризации активности.

person Zephyr    schedule 24.04.2015