0

我有一个关于 android NFC 的问题。

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

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

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

是否有可能只感应一次就可以启动我的应用程序并从标签中获取数据?

4

2 回答 2

1

使用下面的模式(从这里)。概括:

  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();
        }
    
    }
    
于 2013-01-23T00:00:31.873 回答
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);
  }
 }
于 2013-01-22T16:04:19.593 回答