2012-12-08 72 views
12

我試圖在手機掃描NFC標籤時啓動特定活動。這就是我的清單看起來像:掃描NFC標籤時啓動特定活動

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.lgandroid.ddcnfc" 
android:versionCode="1" 
android:versionName="1.0" > 

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

<uses-sdk 
    android:minSdkVersion="14" 
    android:targetSdkVersion="16" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.lgandroid.ddcnfc.BluePrintActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
      <data android:mimeType="application/com.lgandroid.ddcnfc"/> 
      <category android:name="android.intent.category.DEFAULT"/> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.lgandroid.ddcnfc.LoginActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.lgandroid.ddcnfc.MainActivity" 
     android:label="@string/app_name" > 
    </activity> 
    <activity 
     android:name="com.lgandroid.ddcnfc.PointDiagnosisActivity" 
     android:label="@string/app_name" > 
    </activity> 
    <activity 
     android:name="com.lgandroid.ddcnfc.PointControlActivity" 
     android:label="@string/app_name" > 
    </activity> 
    <activity 
     android:name="com.lgandroid.ddcnfc.SystemDiagnosisActivity" 
     android:label="@string/app_name" > 
    </activity> 



    <activity android:name="com.lgandroid.ddcnfc.SettingsActivity" android:label="@string/app_name"></activity> 
</application> 

每當我掃描我的標籤,我的主要活動發佈會,但我想我的BluePrintActivity推出。我不確定爲什麼會出現這種情況。這裏是我寫標籤代碼:

private boolean writeTag(Tag tag) { 
     NdefRecord appRecord = NdefRecord.createApplicationRecord("com.lgandroid.ddcnfc"); 
     NdefMessage message = new NdefMessage(new NdefRecord[] { appRecord }); 

     try { 
      // see if tag is already NDEF formatted 
      Ndef ndef = Ndef.get(tag); 
      if (ndef != null) { 
       ndef.connect(); 

       if (!ndef.isWritable()) { 
        nfcTextView.setText("Read-only tag."); 
        return false; 
       } 

       // work out how much space we need for the data 
       int size = message.toByteArray().length; 
       if (ndef.getMaxSize() < size) { 
        nfcTextView.setText("Tag doesn't have enough free space."); 
        return false; 
       } 

       ndef.writeNdefMessage(message); 
       nfcTextView.setText("Tag written successfully."); 
       return true; 
      } else { 
       // attempt to format tag 
       NdefFormatable format = NdefFormatable.get(tag); 
       if (format != null) { 
        try { 
         format.connect(); 
         format.format(message); 
         nfcTextView.setText("Tag written successfully!\nClose this app and scan tag."); 
         return true; 
        } catch (IOException e) { 
         nfcTextView.setText("Unable to format tag to NDEF."); 
         return false; 
        } 
       } else { 
        nfcTextView.setText("Tag doesn't appear to support NDEF format."); 
        return false; 
       } 
      } 
     } catch (Exception e) { 
      nfcTextView.setText("Failed to write tag"); 
     } 

     return false; 
    } 

編輯:上面我接受的答案暗示我朝着正確的方向,但因爲我在寫標籤,在接受的答案代碼是不完全正確的解決方案。如果你正在寫標籤,這是你需要做什麼:

NdefRecord appRecord = new NdefRecord(
      NdefRecord.TNF_MIME_MEDIA , 
      "application/com.lgandroid.ddcnfc".getBytes(Charset.forName("US-ASCII")), 
      new byte[0], new byte[0]); 
    NdefMessage message = new NdefMessage(new NdefRecord[] { appRecord }); 

如果你想存儲的有效載荷,只需更換最後一個參數「新的字節[0]」,以適當的數據。

回答

9

您的應用程序啓動的原因是您將Android應用程序記錄寫入標記。這會導致具有匹配的包名稱的應用程序啓動而不是篩選的活動。

因爲你過濾的MIME類型要創建MIME記錄類型「應用程序/ com.lgandroid.ddcnfc」所以不是

NdefRecord appRecord = NdefRecord.createApplicationRecord("com.lgandroid.ddcnfc"); 

你應該使用:

NdefRecord appRecord = NdefRecord.createMimeRecord("application/com.lgandroid.ddcnfc", byteArray); 
+0

這很奇怪,因爲根據這裏的文檔(http://developer.android.com/guide/topics/connectivity/nfc/nfc.html),它表示Android會嘗試運行具有匹配的意圖過濾器。我猜Android的文檔可能不在這裏。當我今晚回到家時,我會試試這個。 – l46kok

+1

您對意向過濾器是真實的,但您當前創建的標記是Android應用程序記錄,而不是您正在過濾的Mime記錄。基本上,您沒有針對您目前正在撰寫的標籤的意圖過濾器。但是因爲它是Android應用程序記錄,所以應用程序仍然啓動。 –

0

只要你在標籤上只存儲了一個AAR,你的應用程序就會以其默認活動(或當前的活動堆棧,不管它是什麼)啓動。因此,AAR應該是存儲在標籤上的最後一條記錄,僅用於識別應用。

如果您有其他NDEF記錄與您的某個活動相匹配,則可能會打開相應的活動來處理該標記。但是,my experimentsanother question here指示此機制不起作用的廣告。

另一種解決方案可能是將URL存儲爲標記中的一條消息,在您控制的服務器上打開網頁(或直接轉到Google Play)。

+0

所以我猜這個功能可能無法像文檔中所宣傳的那樣工作。這是一個無賴 – l46kok

相關問題