ブログ記事
で使ってる NFC 書き込みサンプルの Gist
書籍『NFC Hacks』(株式会社ブリリアントサービス著, オライリージャパン発行)の Hack #35 を参考にして作成
ブログ記事
で使ってる NFC 書き込みサンプルの Gist
書籍『NFC Hacks』(株式会社ブリリアントサービス著, オライリージャパン発行)の Hack #35 を参考にして作成
| <?xml version="1.0" encoding="utf-8"?> | |
| <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
| xmlns:app="http://schemas.android.com/apk/res-auto" | |
| xmlns:tools="http://schemas.android.com/tools" | |
| android:layout_width="match_parent" | |
| android:layout_height="match_parent" | |
| tools:context=".MainActivity"> | |
| <EditText | |
| android:id="@+id/id_editText" | |
| android:layout_width="match_parent" | |
| android:layout_height="0dp" | |
| android:hint="enter id" | |
| app:layout_constraintLeft_toLeftOf="parent" | |
| app:layout_constraintRight_toRightOf="parent" | |
| app:layout_constraintTop_toTopOf="parent" | |
| android:autofillHints="no" | |
| android:inputType="number" /> | |
| <EditText | |
| android:id="@+id/note_editText" | |
| android:layout_width="match_parent" | |
| android:layout_height="45dp" | |
| android:hint="Hello World!" | |
| app:layout_constraintLeft_toLeftOf="parent" | |
| app:layout_constraintRight_toRightOf="parent" | |
| app:layout_constraintTop_toBottomOf="@+id/id_editText" | |
| android:autofillHints="no" | |
| android:inputType="text" /> | |
| <Button | |
| android:id="@+id/writeButton" | |
| android:layout_width="wrap_content" | |
| android:layout_height="wrap_content" | |
| android:text="Button" | |
| app:layout_constraintStart_toStartOf="parent" | |
| app:layout_constraintTop_toBottomOf="@+id/note_editText" /> | |
| </androidx.constraintlayout.widget.ConstraintLayout> |
| <?xml version="1.0" encoding="utf-8"?> | |
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
| package="com.example.nfcwriterexample"> | |
| <uses-permission android:name="android.permission.NFC" /> | |
| <application | |
| android:allowBackup="true" | |
| android:icon="@mipmap/ic_launcher" | |
| android:label="@string/app_name" | |
| android:roundIcon="@mipmap/ic_launcher_round" | |
| android:supportsRtl="true" | |
| android:theme="@style/AppTheme"> | |
| <activity | |
| android:name=".MainActivity" | |
| android:launchMode="singleTask"> | |
| <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="text/plain" /> | |
| </intent-filter> | |
| --> | |
| </activity> | |
| </application> | |
| </manifest> |
| package com.example.nfcwriterexample; | |
| import androidx.appcompat.app.AlertDialog; | |
| import androidx.appcompat.app.AppCompatActivity; | |
| import android.app.PendingIntent; | |
| import android.content.DialogInterface; | |
| import android.content.Intent; | |
| import android.content.IntentFilter; | |
| import android.nfc.FormatException; | |
| import android.nfc.NdefMessage; | |
| import android.nfc.NdefRecord; | |
| import android.nfc.NfcAdapter; | |
| import android.nfc.Tag; | |
| import android.nfc.tech.Ndef; | |
| import android.os.Bundle; | |
| import android.util.Log; | |
| import android.view.View; | |
| import android.widget.Button; | |
| import android.widget.EditText; | |
| import android.widget.Toast; | |
| import java.io.IOException; | |
| /** | |
| * 書籍 『NFC Hacks』 (株式会社ブリリアントサービス著, オライリージャパン発行)の Hack #35 を参考に作成した | |
| * NFC書き込みアプリのサンプル実装 | |
| */ | |
| public class MainActivity extends AppCompatActivity { | |
| private static final String TAG = MainActivity.class.getSimpleName(); | |
| private NfcAdapter mNfcAdapter; | |
| private EditText mId; | |
| private EditText mText; | |
| private IntentFilter[] mNdefFilters; | |
| private boolean mWriteFlag; | |
| private PendingIntent mPendingIntent; | |
| @Override | |
| protected void onCreate(Bundle savedInstanceState) { | |
| super.onCreate(savedInstanceState); | |
| Log.d(TAG, "onCreate"); | |
| setContentView(R.layout.activity_main); | |
| mNfcAdapter = NfcAdapter.getDefaultAdapter(this); | |
| mId = (EditText) findViewById(R.id.id_editText); | |
| mText = (EditText) findViewById(R.id.note_editText); | |
| Button mButton = (Button) findViewById(R.id.writeButton); | |
| mButton.setOnClickListener(new View.OnClickListener() { | |
| @Override | |
| public void onClick(View view) { | |
| Log.d(TAG, "Button#onClick"); | |
| IntentFilter filter = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); | |
| mNdefFilters = new IntentFilter[] {filter}; | |
| enableNdefMode(mNdefFilters); | |
| new AlertDialog.Builder(MainActivity.this).setTitle("書き込みモード") | |
| .setOnCancelListener(new DialogInterface.OnCancelListener() { | |
| @Override | |
| public void onCancel(DialogInterface dialogInterface) { | |
| disableNdefMode(); | |
| } | |
| }).create().show(); | |
| } | |
| }); | |
| mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()), 0); | |
| } | |
| private void disableNdefMode() { | |
| Log.d(TAG, "disableNdefMode"); | |
| mNfcAdapter.disableForegroundDispatch(this); | |
| mWriteFlag = false; | |
| } | |
| private void enableNdefMode(IntentFilter[] filters) { | |
| Log.d(TAG, "enableNdefMode"); | |
| mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, filters, null); | |
| mWriteFlag = true; | |
| } | |
| @Override | |
| protected void onNewIntent(Intent intent) { | |
| super.onNewIntent(intent); | |
| Log.d(TAG, "onNewIntent"); | |
| if (mWriteFlag && (intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED) || intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED))) { | |
| writeNdef(intent); | |
| Toast.makeText(this, "NDEF への書き込みが完了しました", Toast.LENGTH_LONG).show(); | |
| } | |
| } | |
| private void writeNdef(Intent intent) { | |
| Ndef ndef = null; | |
| Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); | |
| NdefMessage msg = createNdefMessage(); | |
| ndef = Ndef.get(tag); | |
| if (ndef != null) { | |
| try { | |
| ndef.connect(); | |
| ndef.writeNdefMessage(msg); | |
| ndef.close(); | |
| } catch (FormatException e) { | |
| e.printStackTrace(); | |
| } catch (IOException e) { | |
| e.printStackTrace(); | |
| } | |
| } | |
| } | |
| private NdefMessage createNdefMessage() { | |
| byte[] textBytes = mText.getText().toString().getBytes(); | |
| byte[] idBytes = mId.getText().toString().getBytes(); | |
| //NdefRecord record = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "text/plain;charset=utf-8".getBytes(), idBytes, textBytes); | |
| //NdefRecord record = NdefRecord.createMime("text/plain;charset=utf-8", textBytes); | |
| //NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, null, idBytes, textBytes); | |
| NdefRecord record = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "text/plain".getBytes(), idBytes, textBytes); | |
| return new NdefMessage(new NdefRecord[] {record}); | |
| } | |
| } |