Приложение для Android с NFC - PullRequest
       0

Приложение для Android с NFC

1 голос
/ 26 февраля 2011

Я пытаюсь создать приложение для Android, в котором мне нужно выполнить следующее: Он загружается и ждет, пока не будет обнаружен тег NFC. Меня не особо волнует способ анализа тега (будь то смарт-постер или URI и т. Д.). Единственное, что меня интересует, это идентификатор этого тега. После обнаружения тега и его идентификатора я хочу выполнить некоторые вычисления, а затем вернуться в состояние ожидания (состояние, в котором приложение ожидает обнаружения тега NFC).

Моя проблема в том, что я не могу понять, как заставить весь мой код запускаться при обнаружении тега. (Обратите внимание, что приложение работает, поэтому оно не является проблемой приоритета приложения. Вместо этого я хочу, чтобы мой код срабатывал при обнаружении тега, а затем возвращался в состояние ожидания).

Большое спасибо

1 Ответ

8 голосов
/ 04 апреля 2011

Вот, пожалуйста, код ниже. Хитрость заключается в том, чтобы зарегистрировать отправку тегов переднего плана, чтобы ваша деятельность получила все новые теги. Также укажите флаг SINGLE_TOP, чтобы один активный экземпляр действия вызывался с onNewIntent. Будет также публиковать ForegroundUtil.

public class DashboardActivity extends Activity {

NFCForegroundUtil nfcForegroundUtil = null;

private TextView info;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    info = (TextView)findViewById(R.id.info);

    nfcForegroundUtil = new NFCForegroundUtil(this);


}

public void onPause() {
    super.onPause();
    nfcForegroundUtil.disableForeground();
}   

public void onResume() {
    super.onResume();
    nfcForegroundUtil.enableForeground();

    if (!nfcForegroundUtil.getNfc().isEnabled())
    {
        Toast.makeText(getApplicationContext(), "Please activate NFC and press Back to return to the application!", Toast.LENGTH_LONG).show();
        startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS));
    }

}

public void onNewIntent(Intent intent) {
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    info.setText(NFCUtil.printTagDetails(tag));    

}


}

Foreground-Util (вы должны изменить фильтр намерений в соответствии с вашими потребностями)

public class NFCForegroundUtil {

private NfcAdapter nfc;


private Activity activity;
private IntentFilter intentFiltersArray[];
private PendingIntent intent;
private String techListsArray[][];

public NFCForegroundUtil(Activity activity) {
    super();
    this.activity = activity; 
    nfc = NfcAdapter.getDefaultAdapter(activity.getApplicationContext());

    intent = PendingIntent.getActivity(activity, 0, new Intent(activity,
            activity.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);

    try {
        ndef.addDataType("*/*");
    } catch (MalformedMimeTypeException e) {
        throw new RuntimeException("Unable to speciy */* Mime Type", e);
    }
    intentFiltersArray = new IntentFilter[] { ndef };

    techListsArray = new String[][] { new String[] { NfcA.class.getName() } };
    //techListsArray = new String[][] { new String[] { NfcA.class.getName(), NfcB.class.getName() }, new String[] {NfcV.class.getName()} };
}

public void enableForeground()
{
    Log.d("demo", "Foreground NFC dispatch enabled");
    nfc.enableForegroundDispatch(activity, intent, intentFiltersArray, techListsArray);     
}

public void disableForeground()
{
    Log.d("demo", "Foreground NFC dispatch disabled");
    nfc.disableForegroundDispatch(activity);
}

public NfcAdapter getNfc() {
    return nfc;
}   

}
...