diff --git a/samples/AndroidBeam/AndroidManifest.xml b/samples/AndroidBeam/AndroidManifest.xml new file mode 100644 index 000000000..5fb9f552e --- /dev/null +++ b/samples/AndroidBeam/AndroidManifest.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + diff --git a/samples/AndroidBeam/_index.html b/samples/AndroidBeam/_index.html new file mode 100755 index 000000000..ad4e71a8f --- /dev/null +++ b/samples/AndroidBeam/_index.html @@ -0,0 +1,3 @@ +

The Beam application demonstrates how to use the Android Beam feature introduced in API level 14. This +application beams a simple message from one device to another when they are in close enough proximity. This +application must be installed on two devices that have NFC capabilities, running Android 4.0 or later.

diff --git a/samples/AndroidBeam/res/drawable-hdpi/icon.png b/samples/AndroidBeam/res/drawable-hdpi/icon.png new file mode 100644 index 000000000..8074c4c57 Binary files /dev/null and b/samples/AndroidBeam/res/drawable-hdpi/icon.png differ diff --git a/samples/AndroidBeam/res/drawable-ldpi/icon.png b/samples/AndroidBeam/res/drawable-ldpi/icon.png new file mode 100644 index 000000000..1095584ec Binary files /dev/null and b/samples/AndroidBeam/res/drawable-ldpi/icon.png differ diff --git a/samples/AndroidBeam/res/drawable-mdpi/icon.png b/samples/AndroidBeam/res/drawable-mdpi/icon.png new file mode 100644 index 000000000..a07c69fa5 Binary files /dev/null and b/samples/AndroidBeam/res/drawable-mdpi/icon.png differ diff --git a/samples/AndroidBeam/res/layout/main.xml b/samples/AndroidBeam/res/layout/main.xml new file mode 100644 index 000000000..dce616998 --- /dev/null +++ b/samples/AndroidBeam/res/layout/main.xml @@ -0,0 +1,24 @@ + + + diff --git a/samples/AndroidBeam/res/values/strings.xml b/samples/AndroidBeam/res/values/strings.xml new file mode 100644 index 000000000..ff4492fe5 --- /dev/null +++ b/samples/AndroidBeam/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Beam + diff --git a/samples/AndroidBeam/src/com/example/android/beam/Beam.java b/samples/AndroidBeam/src/com/example/android/beam/Beam.java new file mode 100644 index 000000000..17ec3256f --- /dev/null +++ b/samples/AndroidBeam/src/com/example/android/beam/Beam.java @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +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[] { createMimeRecord( + "application/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())); + } + + /** + * Creates a custom MIME type encapsulated in an NDEF record + * + * @param mimeType + */ + 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; + } +}