忍者ブログ

アンドロイドのあれこれ

Android Beamの実装サンプルコード
3日続いて連続にNFC関連の記事となります。今回は簡単なAndroid Beamの書き方を紹介します。

public class MainActivity extends Activity implements CreateNdefMessageCallback,
OnNdefPushCompleteCallback {

private static final int MESSAGE_SENT = 1;
private NfcAdapter mNfcAdapter;
private static Context mContext;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mContext = this.getApplicationContext();

mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mNfcAdapter.setNdefPushMessageCallback(this, this);
mNfcAdapter.setOnNdefPushCompleteCallback(this, this);
}

@Override
public NdefMessage createNdefMessage(NfcEvent event) {
//Beamで送りたいメッセージ
String text = "Beam text";
NdefRecord[] record = new NdefRecord[]{ createMimeRecord(
"application/com.example.demobeam", text.getBytes())

/**
* 他のデバイスがAndroidアプリケーションレコード(AAR)を
* 受信したときに指定されたアプリケーションが実行されることが保証されています。
*/
//,NdefRecord.createApplicationRecord("com.example.demobeam")
};
NdefMessage msg = new NdefMessage(record);
return msg;
}

public NdefRecord createMimeRecord(String mimeType, byte[] payload) {
byte[] mimeBytes = mimeType.getBytes(Charset.forName("US-ASCII"));
NdefRecord mimeRecord = new NdefRecord(
NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload);
return mimeRecord;
}

@Override
public void onResume() {
super.onResume();

//Beamのアクションを受け取ったとき
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
Intent intent = getIntent();
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage msg = (NdefMessage) rawMsgs[0];
//Beamのメッセージ
String receiveBeam = new String(msg.getRecords()[0].getPayload());
Toast.makeText(getApplicationContext(),
"received:" + receiveBeam,
Toast.LENGTH_LONG).show();
}
}

@Override
public void onNdefPushComplete(NfcEvent event) {
//Beam送信完了時のハンドラー
ndefPushHandler.obtainMessage(MESSAGE_SENT).sendToTarget();
}

private final static Handler ndefPushHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_SENT:
Toast.makeText(mContext,
"Beam sent.....",
Toast.LENGTH_LONG).show();
break;
}
}
};
}

Beamを受け取るために受け取ってほしいアクティビティにintent-filterを追加します。
AndroidManifest.xml
...
<activity
android:name="com.example.demobeam.MainActivity"
android:label="@string/app_name" >
<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.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/com.example.demobeam" />
</intent-filter>
</activity>
...


実行のイメージ
Android Beam

Android Beam
COMMENT
NAME
TITLE
MAIL (非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS (コメント編集に必須です)
SECRET
管理人のみ閲覧できます
 
PR
© Android Advent
powered by 忍者ツールズ / 忍者ブログ / [PR]