Question

I have a question about the android NFC.

I have already done the function about read and write, but still have one problem.

I wrote the AAR in my tag, after first sensing, it can launch my application.

Second time sensing (my application is launched), I can read the data from NFC tag.

Is it possible just sensing once that can launch my application and get the data from tag?

Was it helpful?

Solution 2

In 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>

you should initiate the NFC adopter in OnCreate()..

     /**
      * 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);
   }

Now in OnResume() ...

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

OTHER TIPS

Use the below pattern (from here). Summary:

  1. The foreground mode lets you capture scanned tags in the form of intents sent to onNewIntent. An onResume will follow the onNewIntent call, so we'll process the intent there. But onResume can also come from other sources, so we add a boolean variable to make sure we only process each new intent once.

  2. An intent is also present when the activity is launched. By initializing the boolean variable to false, we fit it into the above flow - an your problem should be fixed.

    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();
        }
    
    }
    
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top