Android近距離無線通訊---NFC基礎(五)

來源:互聯網
上載者:User

標籤:

轉自 http://blog.csdn.net/think_soft/article/details/8190463

 

Android應用程式記錄(Android Application Record---AAR)

在Android4.0(API Level 14)中引入的Android應用程式記錄(AAR),提供了較強的在掃描到NFC標籤時,啟動應用程式的確定性。AAR有嵌入到NDEF記錄內部的應用程式的包名。你能夠把一個AAR添加到你的NDEF訊息的任何記錄中,因為Android會針對AAR來搜尋整個NDEF訊息。如果它找到一個AAR,它就會基於AAR內部的包名來啟動應用程式。如果該應用程式不在當前的裝置上,會啟動Google Play來下載對應的應用程式。

如果你想要防止其他的應用對相同的Intent的過濾並潛在的處理你部署的特定的NFC標籤,那麼AAR是有用的。AAR僅在應用程式級被支援,因為包名的約束,並不能在Activity層級來過濾Intent。如果你想要在Activity級處理Intent,請使用Intent過濾器。

如果NFC標籤中包含了AAR,則NFC標籤調度系統會按照下列方式來調度:

1.  通常,嘗試使用Intent過濾器來啟動一個Activity。如果跟該Intent匹配的Activity也跟AAR匹配,那麼就啟動該Activity。

2.  如果跟Intent隊形的Activity跟AAR不匹配,或者是有多個Activity能夠處理該Intent,或者是沒有能夠處理該Intent的Activity存在,那麼就啟動由AAR指定的應用程式。

3.  如果沒有跟該AAR對應的應用程式,那麼就會啟動Google Play來小組基於該AAR的應用程式。

注意:你能夠用前台調度系統來重寫AAR和Intent調度系統,在NFC標籤被發現時。它允許優先使用前台的Activity。用這種方法,Activity必須是在前台來重寫AAR和Intent調度系統。

如果你依然想要過濾掃描到的沒有包含AAR的NFC標籤,通常,你能夠聲明Intent過濾器。如果你的應用程式對不包含AAR的其他NFC標籤感興趣,這種做法是有用的。例如,你可能想要保證你的應用程式處理你部署的專用NFC標籤,以及由第三方部署的普通的NFC標籤。要記住AAR是在Android4.0以後才指定的,因此部署NFC標籤時,你很可能希望使用能夠廣泛支援AAR和MIME類型/URI的是裝置。另外,在你部署NFC標籤時,還要想如何編寫你的NFC標籤,以便讓大多數裝置(Android裝置和其他裝置)支援。同過定義相對唯一的MIME類型或URI,讓應用程式更容易的區分,就可以做到這一點。

Android提供了簡單的建立AAR的API:createApplicationRecord()。你需要做的所有工作就是把AAR嵌入到你的NdefMessage中。除非AAR是NdefMessage中的唯一記錄,否則不要把使用NdefMessage的第一條記錄。這是因為,Android系統會檢查NdefMessage的第一條記錄來判斷NFC標籤的MIME類型或URI,這些資訊被用於建立對應應用程式的Intent對象。以下代碼示範了如何建立一個AAR:

NdefMessage msg = new NdefMessage(

        new NdefRecord[] {

            ...,

            NdefRecord.createApplicationRecord("com.example.android.beam")}

 

把NDEF訊息發射到其他裝置上

Android Beam允許在兩個Android裝置之間進行簡單的對等資料交換,想要把資料發送給另一個裝置的應用程式必須是在前台,並且接收資料的裝置必須不被鎖定。當發射裝置跟接收裝置的距離足夠近的時候,發射裝置會顯示“Touch to Beam(觸摸發射)”的UI。然後,使用者能夠選擇是否把訊息發射給接收裝置。

注意:在API Level 10中可以利用前台的NDEF推送,它提供了與Android Beam類似的功能。這些API已經過時了,但是在一些老舊裝置上還有效。更多的資訊請看enableForegroundNdefPush()。

通過調用下列兩個方法中的任意一個,就能夠為你的應用程式啟用Android Beam:

1.  setNdefPushMessage():這個方法把接收到的NdefMessage對象作為一個訊息設定給Beam。當兩個裝置足夠近的時候,就會自動的發送訊息。

2.  setNdefPushMessageCallback():接收包含createNdefMessage()方法的回調,當裝置在發射資料的範圍內時,這個回調方法會被調用。回調會讓你只在需要的時候建立NDEF訊息。

一個Activity一次只能推送一條NDEF訊息,因此如果同時使用了這兩種方法,那麼setNdefPushMessageCallback()方法的優先順序要高於setNdefPushMessage()方法。要使用Android Beam,通常必須滿足以下條件:

1.  發射資料的Activity必須是在前台。兩個裝置的螢幕都必須沒有被鎖定;

2.  必鬚髮要發射的資料封裝到一個NdefMessage對象中;

3.  接收發射資料的NFC裝置必須支援com.android.npp NDEF推送協議或是NFC組織的SNEP協議(簡單的NDEF交換協議)。在API Level9(Android2.3)到API Level 13(Android3.2)的裝置上需要com.android.npp協議。在API Level 14(Android4.0)和以後的裝置上,com.android.npp和SNEP都需要。

注意:如果在前台的Activity啟用了Android Beam,那麼標準的Intent調度系統就會被禁用。但是,如果該Activity還啟用了前台調度,那麼在前台調度系統中,它依然能夠掃描到跟Intent過濾器匹配的NFC標籤。

啟用Android Beam:

1.  建立一個準備推送到另一個裝置上的包含NdefRecord的NdefMessage對象。

2.  調用帶有NdefMessage型別參數的setNdefPushMessage()方法,或者是在Activity的onCreate()方法中調用setNdefPushMessageCallback方法來傳遞實現NfcAdapter.CreateNdefMessageCallback介面的對象。這兩個方法都至少需要一個準備要啟用Android Beam的Activity,以及一個可選的其他的活躍的Activity列表。

通常,如果你的Activity在任何時候都值推送相同的NDEF訊息,那麼當兩個裝置在通訊範圍內的時候,使用setNdefPushMessage()就可以了。當你的應用程式要關注應用程式的當前內容,並想要根據使用者在你的應用程式中的行為來推送NDEF訊息時,就要使用setNdefPushMessageCallback方法。

下列範例程式碼示範了如何在activity的onCreate()方法中調用NfcAdapter.CreateNdefMessageCallback方法(完整的樣本請看AndroidBeamDemo)。這個樣本中還有協助建立MIME記錄的方法:

package com.example.android.beam;

 

import android.app.Activity;

import android.content.Intent;

import android.nfc.NdefMessage;

import android.nfc.NdefRecord;

import android.nfc.NfcAdapter;

import android.nfc.NfcAdapter.CreateNdefMessageCallback;

import android.nfc.NfcEvent;

import android.os.Bundle;

import android.os.Parcelable;

import android.widget.TextView;

import android.widget.Toast;

import java.nio.charset.Charset;

public class Beam extends Activity implements CreateNdefMessageCallback {

    NfcAdapter mNfcAdapter;

    TextView textView;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        TextView textView = (TextView) findViewById(R.id.textView);

        // Check for available NFC Adapter

        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);

        if (mNfcAdapter == null) {

            Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show();

            finish();

            return;

        }

        // Register callback

        mNfcAdapter.setNdefPushMessageCallback(this, this);

    }

    @Override

    public NdefMessage createNdefMessage(NfcEvent event) {

        String text = ("Beam me up, Android!\n\n" +

                "Beam Time: " + System.currentTimeMillis());

        NdefMessage msg = new NdefMessage(

                new NdefRecord[] { createMime(

                        "application/vnd.com.example.android.beam", text.getBytes())

         /**

          * The Android Application Record (AAR) is commented out. When a device

          * receives a push with an AAR in it, the application specified in the AAR

          * is guaranteed to run. The AAR overrides the tag dispatch system.

          * You can add it back in to guarantee that this

          * activity starts when receiving a beamed message. For now, this code

          * uses the tag dispatch system.

          */

          //,NdefRecord.createApplicationRecord("com.example.android.beam")

        });

        return msg;

    }

    @Override

    public void onResume() {

        super.onResume();

        // Check to see that the Activity started due to an Android Beam

        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {

            processIntent(getIntent());

        }

    }

    @Override

    public void onNewIntent(Intent intent) {

        // onResume gets called after this to handle the intent

        setIntent(intent);

    }

    /**

     * Parses the NDEF Message from the intent and prints to the TextView

     */

    void processIntent(Intent intent) {

        textView = (TextView) findViewById(R.id.textView);

        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(

                NfcAdapter.EXTRA_NDEF_MESSAGES);

        // only one message sent during the beam

        NdefMessage msg = (NdefMessage) rawMsgs[0];

        // record 0 contains the MIME type, record 1 is the AAR, if present

        textView.setText(new String(msg.getRecords()[0].getPayload()));

    }

}

注意:上例代碼把AAR給注釋掉了,你可以刪除它。如果你啟用了AAR,那麼該應用程式就會始終接收在AAR中指定的Android Beam訊息。如果該應用程式不存在,Google Play就會啟動下載程式。因此,如果使用AAR,對於Android4.0以後的裝置,下列的Intent過濾器,在技術上不是必須的:

<intent-filter>

  <action android:name="android.nfc.action.NDEF_DISCOVERED"/>

  <category android:name="android.intent.category.DEFAULT"/>

  <data android:mimeType="application/vnd.com.example.android.beam"/>

</intent-filter>

有了這個Intent過濾器,com.example.android.beam應用就能夠在以下情況下被啟動:

1.  掃描到NFC標籤;

2.  接收到com.example.android.beam類型的AAR或NDEF訊息中包含一條application/vnd.com.example.android.beam類型的MIME記錄的Android beam的時候。

即使通過AAR能夠保證了一個應用程式被啟動或下載,但是還是推薦使用Intent過濾器,因為它會讓你選擇啟動應用程式中Activity,而不是總啟動AAR中指定的應用程式套件組合的主Activity。AAR沒有Activity層級的粒度。而且還有一些android裝置不支援AAR,你還應該在NDEF訊息的第一條NDEF記錄中嵌入標識資訊,以及對應的過濾器。

Android近距離無線通訊---NFC基礎(五)(轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.