簡體   English   中英

如何開始有關 nfc 標簽發現的新活動?

[英]How to start new activity on nfc tag discovery?

我正在編寫一個代碼,當在掃描過程中檢測到 NFC 時,該代碼應該在下一個活動(頁面)上返回 NFC 標簽值。 這里發生的情況是,當我第一次啟動應用程序時,第一頁會顯示幾分之一秒,然后直接移動到第二頁(活動)。

這是第一個活動的代碼(僅用於要求用戶點擊掃描)

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        askPermissions();

        mtxtViewNfcContent = (TextView) findViewById(R.id.text);
        nfcAdapter         = NfcAdapter.getDefaultAdapter(this);

        if (nfcAdapter == null) {
            Toast.makeText(this, "No NFC", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }

        else {

Intent in = new Intent(Main2Activity.this, MainActivity.class);
            startActivity(in);
}

我想要的是在啟動時顯示第一頁,當用戶點擊 nfc 掃描時,在下一頁(MainActivity)上顯示輸出。

PS:我是安卓新手,請原諒我的代碼。

到目前為止,您在做什么是在設備不支持 nfc 時退出應用程序或在設備支持 nfc 時啟動另一個活動。

你實際上根本沒有在聽任何標簽。

在這里你有兩種可能性:第一:在第一個活動中讀取一個 nfc 標簽,然后創建一個新的意圖,並將標簽讀取的結果作為額外的包。

二:在第一個活動中監聽標簽存在,然后將標簽發送到第二個活動並在第二個活動中讀取它。

我更喜歡第一個secinario。

在第一個活動:

public class MainActivity extends AppCompatActivity {
private PendingIntent pendingIntent;
private IntentFilter[] writeTagFilters;
private NfcAdapter nfcAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTheme(R.style.AppTheme);
    setContentView(R.layout.activity_main);
    nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    if (nfcAdapter == null) {
        Toast.makeText(this, "No NFC", Toast.LENGTH_SHORT).show();
        finish();
        return;
    }
    setForeground();

}
 private void setForeground() {
    pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
    tagDetected.addCategory(Intent.CATEGORY_DEFAULT);
    writeTagFilters = new IntentFilter[]{tagDetected};
}
@Override
protected void onResume() {

    super.onResume();
    if (nfcAdapter != null) {
        nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
    }
    processNfcTag(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

@Override
protected void onPause() {

    super.onPause();
    if (nfcAdapter != null) {
        nfcAdapter.disableForegroundDispatch(this);
    }

}

private void processNfcTag(Intent intent) {
//TODO: here you should to check if this intent is an NFC Intent, in case it is an nfc intent you could read it according of tag tech you have 
// for example MifareUltralight.
MifareUltralight mfu = MifareUltralight.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG));
try {
        mfu.connect();
        byte [] bytes = mfu.readPages(pageNumber);
        mfu.close();
    } catch (IOException e) {
        e.printStackTrace();

    }
// then you could get this bytes and send it to the other activity 
}

請檢查此鏈接以了解如何在活動之間發送數據。

ps:你應該快速檢查一下我寫的代碼。

您可以在調用意圖時使用 intent.putExtra (key,value) 並在結果活動上使用 bundle 來獲取變量數據

在調用意圖時使用它

`Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("some_key", value);
intent.putExtra("some_other_key", "a value");
startActivity(intent);`

在結果活動中使用它

`Bundle bundle = getIntent().getExtras();
int valueText = bundle.getInt("some_key");
String valueString = bundle.getString("some_other_key");
TextView textone =(TextView)findVeiwById(R.id.textone);
textone.setText(valueText);
TextView stringTextView = (TextView)FindViewById(R.id.stringTextView)
stringTextView.setText(valueString)`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM