スポンサードリンク


これは、Android Advent Calendar 2012の17日目(裏)の記事です。表は @tomo_watanabeさんです。

いまさらながらAndroid 4.0から搭載されたAndroid Beam機能をほんのちょっとだけライブラリ化したのでちょっと紹介します。

まず、Android Beam機能はどういうものかというと、NFCチップを搭載された端末同士でアプリの画面(Activity)から簡単なデータ送信、受信を実現する仕組み。

Andoid Developerサイト内の”Beaming NDEF Messages to Other Devices“のソースコードを元にライブラリ化しました。Andoid Developerサイトのソースコードの解説はTechBoosterさんのサイトが詳しいです。

上記のサイトのソースコードをそのまま使用してもいいのですが、Andorid 4.0以降の端末にしか動作しないアプリになってしまいます。4.0未満で実行させるとアプリが落ちてしまいます。
そもそもは、既に開発しているアプリにAndroid Beam機能を追加しようと思ってたのですが、アプリ自体のサポートバージョンは2.x系も含めていたので、Android Beam非対応端末であっても同じコードで落ちないようにしたいと思い、ライブラリ化しておこうと思っただけです。
4.0未満の端末ではアプリが落ちずにAndroid Beam機能部分は実行されないようにラッピングしています。

ソースコードをgithubで公開ています。

このライブラリのAPIリファレンス

BeamHelperクラス

・コンストラクタ

public BeamHelper(Activity activity, String pushPackageName, String pushMessage, boolean isAAR)
引数
 activity : {Activity} Beamを送信するActivity
 pushPackageName : {String} 送信するメッセージを受け取るアプリケーションのパッケージ名(通常、自アプリのパッケージ名を指定することが多いと思います)
 pushMessage : {String} 送信するデータ
 isAAR : {Boolean} Beamを受け取った際、受け取った端末がpushPackageNameに指定したアプリケーションがインストールされていない時にGoogle Playのアプリ画面を表示する(=true)か否か(=false)

・静的メソッド

public static String getReceivedBeamString(Intent intent)
 Beamを受け取った際に受け取ったデータをIntentから取り出し、取り出した文字列を返す
 送信側のプログラムでBeamHelperのコンストラクタのpushMessageに指定した文字列になる
引数
 intent : {Intent} Activityに受け取ったIntent

使い方

1.準備

まず、上記のソースをgithubから取得します。(fork後cloneなり、直接cloneなり、zipで落とすなり)
ローカルで展開したら、eclipseでAndroid Projectととしてインポートしてください。

次に、このライブラリを使用したいAndroidアプリケーションプロジェクトからライブラリを追加してください。

2.使いたいアプリのソースを改造

アプリ側の修正は以下の手順になります。

  1. マニフェストファイルへNFCのパーミッションを追加する
  2. Android Beamでメッセージを送信したいActivityにBeamHelperのインスタンスを作成するようにする
  3. データを受け取る処理を実装する
  4. メッセージを受け取った時にアプリを起動するようにするためにintentfilterを設定する

2-1.マニフェストファイル(AndroidManifest.xml)へNFCのパーミッションを追加する

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

2-2.Android Beamでメッセージを送信したいActivityにBeamHelperのインスタンスを作成するようにする

    BeamHelper mBeam = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        :
        mBeam = new BeamHelper(this, "com.toro.android.beamsample", "Hello, World", true);
        :
    }

onCreateで処理しなくてもかまいません。送信できるデータが作れた段階でインスタンスを作成すれば、そのタイミング以降で送信できるようになります。

2-3.メッセージを受け取る処理を実装する

受信側のメッセージを受信する処理を実装

    @Override
    public void onResume() {
        super.onResume();
        String beamMessage = BeamHelper.getReceivedBeamString(getIntent());
        if(beamMessage != null) {
            // beamのデータを受け取った時の処理
        } else {
            // それ以外の処理
        }
        :
    }

    @Override
    public void onNewIntent(Intent intent) {
        setIntent(intent);
    }

2-4.メッセージを受け取った時にアプリを起動するようにするためにマニフェストファイル(AndroidManifest.xml)へintentfilterを設定する

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="application/com.toro.android.beamsample" />
            </intent-filter>
        </activity>

intent-filterの<data>のandroid:mimeTypeの値はアプリのパッケージ名を指定します。


これで、片方の端末でアクティビティを起動した状態で端末同士のNFCチップを重ねるように近づけるとデータを送信、受信できます。

もし、今のアプリにAndroid Beam機能を追加したい場合は使ってみてください。

なお、Android Beamに対応していない端末(NFC未搭載またはAndroid4.0未満)の場合、当然ながらこのライブラリを使用してもAndroid Beamは使用できません。

それでは、明日のAndroid Advent Calendar 2012は表: @zaki50さん、裏: @daichan4649さんです。

スポンサードリンク