アンドロイドのあれこれ
[PR]
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
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
実行のイメージ
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>
...
実行のイメージ
COMMENT