Android NFC传感和读取标签数据同时进行

时间:2013-01-22 11:00:55

标签: android nfc android-applicationrecord

我对Android NFC有疑问。

我已经完成了有关读写的功能,但仍有一个问题。

我在我的标签中写了AAR,在第一次感应之后,它可以启动我的应用程序。

第二次感应(我的应用程序已启动),我可以从NFC标签中读取数据。

是否可以只检测一次可以启动我的应用程序并从标签获取数据?

2 个答案:

答案 0 :(得分:1)

使用以下模式(来自here)。总结:

  1. 前台模式允许您以发送到onNewIntent的意图形式捕获扫描的标签。 onResume将跟随onNewIntent调用,因此我们将在那里处理意图。但是onResume也可以来自其他来源,所以我们添加一个布尔变量来确保我们只处理一次新的意图。

  2. 启动活动时也会出现意图。通过将布尔变量初始化为false,我们将其纳入上述流程 - 您的问题应该得到解决。

    protected boolean intentProcessed = false;
    
    public void onNewIntent(Intent intent) {
    
        Log.d(TAG, "onNewIntent");
    
        // onResume gets called after this to handle the intent
        intentProcessed = false;
    
        setIntent(intent);
    }
    
    protected void onResume() {
        super.onResume();
    
        // your current stuff
    
        if(!intentProcessed) {
             intentProcessed = true;
    
             processIntent();
        }
    
    }
    

答案 1 :(得分:0)

在AndroidManifest中 -

  <activity
        android:name=".TagDiscoverer"
        android:alwaysRetainTaskState="true"
        android:label="@string/app_name"
        android:launchMode="singleInstance"
        android:screenOrientation="nosensor" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />
            <action android:name="android.nfc.action.TECH_DISCOVERED" />
            <action android:name="android.nfc.action.TAG_DISCOVERED" />

            <category android:name="android.intent.category.DEFAULT" />

            <data android:mimeType="text/plain" />
        </intent-filter>

        <meta-data
            android:name="android.nfc.action.TECH_DISCOVERED"/>
    </activity>

你应该在OnCreate()中启动NFC采用者..

     /**
      * Initiates the NFC adapter
     */
  private void initNfcAdapter() {
    nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    mPendingIntent = PendingIntent.getActivity(this, 0,
        new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
   }

现在在OnResume()......

  @Override
  protected void onResume() {
  super.onResume();
  if (nfcAdapter != null) {
    nfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
  }
 }