質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

3787閲覧

FATAL EXCEPTION: mainの原因

kouki-12

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/03/08 15:54

編集2020/03/12 12:42

発生している問題・エラーメッセージ

NFCのブロックデータの読み込みで実行すると、アプリが落ちてしまいます。その時のエラーメッセージが
以下のようになっています。

java

12020-03-09 00:42:55.726 10628-10628/com.example.t D/Hoge: date Discovered! 22020-03-09 00:42:55.727 10628-10628/com.example.t E/com.example.ta: No package ID 31 found for ID 0x31303336. 32020-03-09 00:42:55.727 10628-10628/com.example.t D/AndroidRuntime: Shutting down VM 42020-03-09 00:42:55.732 10628-10628/com.example.t E/AndroidRuntime: FATAL EXCEPTION: main 5 Process: com.example.t, PID: 10628 6 android.content.res.Resources$NotFoundException: String resource ID #0x31303336 7 at android.content.res.Resources.getText(Resources.java:348) 8 at android.widget.Toast.makeText(Toast.java:307) 9 at com.example.t.MainActivity.onNewIntent(MainActivity.java:92) 10 at android.app.Activity.performNewIntent(Activity.java:7149) 11 at android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1367) 12 at android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1379) 13 at android.app.ActivityThread.deliverNewIntents(ActivityThread.java:3114) 14 at android.app.ActivityThread.performNewIntents(ActivityThread.java:3130) 15 at android.app.ActivityThread.handleNewIntent(ActivityThread.java:3147) 16 at android.app.servertransaction.NewIntentItem.execute(NewIntentItem.java:49) 17 at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 18 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 19 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1814) 20 at android.os.Handler.dispatchMessage(Handler.java:106) 21 at android.os.Looper.loop(Looper.java:280) 22 at android.app.ActivityThread.main(ActivityThread.java:6710) 23 at java.lang.reflect.Method.invoke(Native Method) 24 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 25 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 262020-03-09 00:42:55.740 10628-10628/com.example.ta I/Process: Sending signal. PID: 10628 SIG: 9

該当のソースコード

以下のコードがMainActivity.javaです。

JAVa

1package com.example.t; 2 3 4import androidx.appcompat.app.AppCompatActivity; 5 6 7import android.os.Bundle; 8import android.app.PendingIntent; 9import android.content.Intent; 10import android.nfc.NfcAdapter; 11import android.nfc.Tag; 12 13import android.widget.Toast; 14import android.util.Log; 15import java.nio.ByteBuffer; 16 17 18 19public class MainActivity extends AppCompatActivity { 20 21 // 定数 22 private final byte[] TARGET_SYSTEM_CODE = new byte[]{(byte) 0x80, (byte) 0x22}; 23 private final byte[] TARGET_SERVICE_CODE = new byte[]{(byte) 0x9B, (byte) 0x1B}; 24 private final int TARGET_SIZE = 4; 25 26 27 // アダプタを扱うための変数 28 private NfcAdapter mNfcAdapter; 29 30 31 @Override 32 protected void onCreate(Bundle savedInstanceState) { 33 super.onCreate(savedInstanceState); 34 setContentView(R.layout.activity_main); 35 36 37 38 // アダプタのインスタンスを取得 39 mNfcAdapter = NfcAdapter.getDefaultAdapter(this); 40 } 41 42 @Override 43 protected void onResume() { 44 45 super.onResume(); 46 47 // NFCがかざされたときの設定 48 Intent intent = new Intent(this, this.getClass()); 49 intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 50 51 // ほかのアプリを開かないようにする 52 PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0); 53 mNfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null); 54 55 } 56 57 @Override 58 protected void onPause() { 59 super.onPause(); 60 61 // Activityがバックグラウンドになったときは、受け取らない 62 mNfcAdapter.disableForegroundDispatch(this); 63 } 64 65 @Override 66 protected void onNewIntent(Intent intent) { 67 NfcReader nfcReader; 68 nfcReader = new NfcReader(); 69 super.onNewIntent(intent); 70 71 // NFCのTAGを取得 72 Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 73 74 byte[][] data =nfcReader.readTag(tag, TARGET_SYSTEM_CODE, TARGET_SERVICE_CODE, TARGET_SIZE); 75 76 Log.d("Hoge","Tag Discovered!"); 77 78 79 80 81 // 読み取れなかった場合は終了 82 if (data == null) { 83 Toast.makeText(this, "error", Toast.LENGTH_SHORT).show(); 84 return; 85 } 86 Log.d("Hoge","date Discovered!"); 87 // 変換 88 byte[] balanceData = new byte[]{data[0][4],data[0][3], data[0][2], data[0][1], data[0][0]}; 89 int balance = ByteBuffer.wrap(balanceData).getInt(); 90 91 // 表示 92 Toast.makeText(this,balance,Toast.LENGTH_LONG).show(); 93 94 } 95

以下がNfcReader.javaです。

Java

1package com.example.t; 2import android.nfc.Tag; 3import android.nfc.tech.NfcF; 4import android.util.Log; 5 6import java.io.ByteArrayOutputStream; 7import java.io.IOException; 8import java.util.Arrays; 9 10 11public class NfcReader { 12 13 public byte[][] readTag(Tag tag, byte[] targetSystemCode , byte[] targetServiceCode, int size ) { 14 NfcF nfc = NfcF.get(tag); 15 if (nfc == null) { 16 return null; 17 } 18 19 try { 20 nfc.connect(); 21 22 23 // polling コマンドを作成 24 byte[] polling = polling(targetSystemCode ); 25 26 // コマンドを送信して結果を取得 27 byte[] pollingRes = nfc.transceive(polling); 28 29 // System 0 のIDmを取得(1バイト目はデータサイズ、2バイト目はレスポンスコード、IDmのサイズは8バイト) 30 byte[] targetIDm = Arrays.copyOfRange(pollingRes, 2, 10); 31 32 Log.d("Hoge","IDM Discovered!"); 33 34 // Read Without Encryption コマンドを作成 35 byte[] req = readWithoutEncryption(targetIDm, size, targetServiceCode); 36 37 // コマンドを送信して結果を取得 38 byte[] res = nfc.transceive(req); 39 Log.d("Hoge","Tag covered!"); 40 nfc.close(); 41 42 // 結果をパースしてデータだけ取得 43 return parse(res); 44 } catch (Exception e) { 45 Log.e(String.valueOf(tag), e.getMessage() , e); 46 } 47 return null; 48 } 49 /* 50 * Pollingコマンドの取得。 51 * @param systemCode byte[] 指定するシステムコード 52 * @return Pollingコマンド 53 * @throws IOException 54 */ 55 56 private byte[] polling(byte[] targetSystemCode ) { 57 ByteArrayOutputStream bout = new ByteArrayOutputStream(6); 58 59 bout.write(0x00); // データ長バイトのダミー 60 bout.write(0x00); // コマンドコード:0X00 61 bout.write(targetSystemCode [0]); // systemCode 62 bout.write(targetSystemCode [1]); // systemCode 63 bout.write(0x01); // リクエストコード:01h(システムコード要求) 64 bout.write(0x00); // タイムスロット 65 66 byte[] msg = bout.toByteArray(); 67 msg[0] = (byte) msg.length; // 先頭1バイトはデータ長 68 return msg; 69 } 70 /* 71 * Read Without Encryptionコマンドの取得。 72 * @param idm 指定するシステムのID 73 * @param size 取得するデータの数 74 * @return Read Without Encryptionコマンド 75 * @throws IOException 76 */ 77 private byte[] readWithoutEncryption(byte[] targetIDm, int size, byte[] targetServiceCode) throws IOException { 78 ByteArrayOutputStream bout = new ByteArrayOutputStream(100); 79 80 bout.write(0x00); // データ長バイトのダミー 81 bout.write(0x06); // コマンドコード 82 bout.write(targetIDm); // IDm 8byte 83 bout.write(1); // サービス数の長さ(以下2バイトがこの数分繰り返す) 84 85 // サービスコードの指定はリトルエンディアンなので、下位バイトから指定します。 86 bout.write( targetServiceCode[1]); // サービスコード下位バイト 87 bout.write( targetServiceCode[0]); // サービスコード上位バイト 88 bout.write(size); // ブロック数 89 90 // ブロック番号の指定 91 for (int i = 0; i < size; i++) { 92 bout.write(0x80); // ブロックエレメント上位バイト 「Felicaユーザマニュアル抜粋」の4.3項参照 93 bout.write(i); // ブロック番号 94 } 95 96 byte[] msg = bout.toByteArray(); 97 msg[0] = (byte) msg.length; // 先頭1バイトはデータ長 98 return msg; 99 } 100 101 /* 102 * Read Without Encryption応答の解析。 103 * @param res byte[] 104 * @return 文字列表現 105 */ 106 private byte[][] parse(byte[] res) { 107 // res[10] エラーコード。0x00の場合が正常 108 if (res[10] != 0x00) 109 throw new RuntimeException("Read Without Encryption Command Error"); 110 111 // res[12] 応答ブロック数 112 // res[13 + n * 16] 実データ 16(byte/ブロック)の繰り返し 113 int size = res[12]; 114 byte[][] data = new byte[size][16]; 115 for (int i = 0; i < size; i++) { 116 byte[] tmp = new byte[16]; 117 int offset = 13 + i * 16; 118 for (int j = 0; j < 16; j++) { 119 tmp[j] = res[offset + j]; 120 } 121 122 data[i] = tmp; 123 } 124 return data; 125 } 126 127}

試したこと

エラーメッセージより以下の文章が原因と考えているのですが、どのように対策したらよいか教えてほしいです。

java

1Toast.makeText(this,balance,Toast.LENGTH_LONG).show();

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

得た数字をそのまま表示したいのであれば、文字列化する必要があるかと思います。

java

1Toast.makeText(this,Integer.toString(balance),Toast.LENGTH_LONG).show();

NfcReaderとか、そのメソッドから得られる値の意味が分からないので推測ですが…

投稿2020/03/08 17:11

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kouki-12

2020/03/08 22:11

変更しましたが、エラーメッセージは消えませんでした。あと、Nfcreader.javaのプログラムを追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問