2016-07-19 23 views
0

Ich schaffe Anwendung, die eine Aktion zu tun, wenn getroffen NFC-Chip, ich die folgenden Informationen über NFC in Android wissen bitte korrigieren Sie mich, wenn ich falsch binWie man Android-Anwendung auf bestimmte NFC-Chip hören?

  1. Sie keine Aktionen des NFC registrieren können, um Empfänger in der Manifest-Datei, nur Aktivitäten.
  2. jeder NFC-Chip hat seine eigene eindeutige ID.

, was ich tun möchte, ist
, während die Anwendung im Hintergrund ist oder es ist geschlossen, wenn ich NFC-Chip schlug mit id (ex 1234) meiner App zu Mittag gegessen und eine Aktion zu tun.

ist das möglich? Wenn ja, wie kann es erreicht werden?

bearbeiten hier ist mein Code, es öffnet sich nicht, wenn Sie ein Chip NFC überprüfen und diese Aktion android.nfc.action.TECH_DISCOVERED bekommen, aber wenn es um die Aktion zu öffnen ist android.intent.action.MAIN MainActivity.java

public class MainActivity extends AppCompatActivity { 
    public static final String ACTION_CHECK_IN= "checked"; 
    public static final String ACTION_CHECK_OUT= "unchecked"; 
    private NfcAdapter mNfcAdapter; 
    boolean isCheckedIn = false; 

    private static final String TAG = "MainActivity"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mNfcAdapter = NfcAdapter.getDefaultAdapter(this); 
     isCheckedIn = Pref.getBoolean("check", false); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     Log.d(TAG, "onResume() called with: " + ""); 
     String action = getIntent().getAction(); 
     if (action != null) { 
      Log.d("MainActivity", "onCreate(" + action + ")"); 
      if (action.equals(NfcAdapter.ACTION_NDEF_DISCOVERED) || action.equals(NfcAdapter.ACTION_TAG_DISCOVERED) || action.equals(NfcAdapter.ACTION_TECH_DISCOVERED)) { 

       if (!isCheckedIn) { 
        isCheckedIn = true; 
        Pref.putBoolean("check", true); 
        Log.d("checking","IN"); 
       } else { 
        isCheckedIn = false; 
        Pref.putBoolean("check", false); 
        Log.d("checking","Out"); 
       } 

      } 

     } 

     if (!mNfcAdapter.isEnabled()) { 

      Toast.makeText(MainActivity.this, "Please open it ", Toast.LENGTH_SHORT).show(); 
     } 


     /** 
     * It's important, that the activity is in the foreground. 
     * Otherwise an IllegalStateException is thrown. 
     */ 
     setupForegroundDispatch(this, mNfcAdapter); 
    } 

    @Override 
    protected void onPause() { 
     /** 
     * Call this before onPause, otherwise an IllegalArgumentException is thrown. 
     */ 
     stopForegroundDispatch(this, mNfcAdapter); 

     super.onPause(); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
    } 


    public static void setupForegroundDispatch(Activity activity, NfcAdapter adapter) { 
     final Intent intent = new Intent(activity.getApplicationContext(), activity.getClass()); 
     intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 

     final PendingIntent pendingIntent = PendingIntent.getActivity(
       activity.getApplicationContext(), 0, intent, 0); 

     IntentFilter[] filters = new IntentFilter[2]; 
     String[][] techList = new String[][]{}; 

     // same filter as manifest - action, category 
     filters[0] = new IntentFilter(); 
     filters[0].addAction(NfcAdapter.ACTION_TAG_DISCOVERED); 
     filters[1] = new IntentFilter(); 
     filters[1].addAction(NfcAdapter.ACTION_TECH_DISCOVERED); 

     adapter.enableForegroundDispatch(activity, pendingIntent, filters, techList); 
    } 

    public static void stopForegroundDispatch(Activity activity, NfcAdapter adapter) { 
     adapter.disableForegroundDispatch(activity); 
    } 
} 

manifest

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.srjo.pocnfcadapter"> 

    <uses-permission android:name="android.permission.NFC" /> 

    <uses-feature 
     android:name="android.hardware.nfc" 
     android:required="true" /> 

    <application 
     android:name=".MyApplication" 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 


      <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.TAG_DISCOVERED" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.nfc.action.TECH_DISCOVERED" /> 
      </intent-filter> 

      <meta-data 
       android:name="android.nfc.action.TECH_DISCOVERED" 
       android:resource="@xml/filter_nfc" /> 

     </activity> 

    </application> 

</manifest> 

Antwort

0

Nach dem Android-Entwicklung R Site, ist es für Ihre App möglich, NFC-Absichten wie ACTION_NDEF_DISCOVERED zu filtern.

+0

aber wie das folgende Szenario zu tun? Holen Sie sich die ID des Chips dann öffnen Sie die App, wenn es meine ID ist? –

+0

Ich denke, Google bietet keine solche Funktion, weil ich dies noch nicht in doc gelesen habe. –

0

erste App im Manifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.survivingwithandroid.nfc" > 

.... 
<intent-filter> 
<action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
<category android:name="android.intent.category.DEFAULT" /> 
<data android:mimeType="text/plain"/> 
</intent-filter> 
<manifest> 

registrieren Dann sollten Sie Vordergrund Versand (Vordergrund app) verwenden. Schließlich verwenden Sie NFCAdapter, um den Inhalt zu lesen (onNewIntent). Ich schrieb eine detaillierte posts about NFC, wenn Sie gerne einen Blick werfen.