2012-12-08 32 views
12

Tôi đang cố gắng khởi chạy một hoạt động cụ thể khi điện thoại của tôi quét thẻ NFC. Đây là những gì biểu hiện của tôi trông giống như:Khởi chạy một hoạt động cụ thể khi quét thẻ 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> 

Bất cứ khi nào tôi quét thẻ của tôi, ra mắt hoạt động chính của tôi nhưng tôi muốn BluePrintActivity tôi để khởi động. Tôi không chắc tại sao lại như vậy. Đây là mã của tôi để viết cho tag:

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; 
    } 

Edit: Câu trả lời tôi chấp nhận ở trên gợi ý cho tôi hướng tới đúng hướng nhưng kể từ khi tôi đang viết cho một thẻ, mã trong câu trả lời được chấp nhận là không chính xác giải pháp đúng . Nếu bạn đang viết cho một thẻ, đây là những gì bạn cần làm:

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

Nếu bạn muốn lưu trữ một tải trọng, chỉ cần thay thế các tham số cuối cùng "byte mới [0]" vào tập dữ liệu thích hợp.

Trả lời

9

Lý do khiến ứng dụng của bạn bắt đầu là do bạn viết Bản ghi ứng dụng Android vào thẻ. Điều này làm cho ứng dụng có tên gói phù hợp để bắt đầu thay vì hoạt động được lọc.

Bởi vì bạn đang lọc cho một loại mime bạn muốn tạo một bản ghi Mime với kiểu 'application/com.lgandroid.ddcnfc' nên thay vì

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

Bạn nên sử dụng:

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

Điều này khá lạ, bởi vì theo tài liệu ở đây (http://developer.android.com/guide/topics/connectivity/nfc/nfc.html), nó nói rằng Android sẽ cố gắng chạy Hoạt động có bộ lọc ý định phù hợp. Tôi đoán tài liệu Android có thể bị tắt ở đây. Tôi sẽ cố gắng khi tôi về nhà tối nay. – l46kok

+1

Bạn đúng về bộ lọc ý định nhưng thẻ bạn hiện đang tạo là Bản ghi ứng dụng Android thay vì Bản ghi Mime mà bạn hiện đang lọc. Về cơ bản bạn không có bộ lọc ý định cho thẻ bạn hiện đang viết. Nhưng bởi vì nó là một ứng dụng Android Record, ứng dụng vẫn còn bắt đầu. –

0

Miễn là bạn chỉ có một AAR được lưu trữ trên thẻ, ứng dụng của bạn sẽ được khởi chạy với hoạt động mặc định của nó (hoặc ngăn xếp hoạt động hiện tại, bất kể nó là gì). Do đó, AAR sẽ là bản ghi cuối cùng được lưu trữ trên thẻ, chỉ được sử dụng để xác định ứng dụng.

Nếu bạn có hồ sơ NDEF bổ sung được khớp với một trong các Hoạt động của bạn, có khả năng Hoạt động theo sẽ được mở để xử lý thẻ. Tuy nhiên, my experimentsanother question here cho biết rằng cơ chế này không hoạt động như được quảng cáo.

Một giải pháp thay thế có thể là lưu trữ URL dưới dạng một trong các thông báo trên thẻ, mở trang web trên máy chủ mà bạn kiểm soát (hoặc truy cập trực tiếp vào Google Play).

+0

Vì vậy, tôi đoán chức năng có thể không hoạt động như được quảng cáo trong tài liệu. Đó là một người lười biếng :( – l46kok

Các vấn đề liên quan