Я просто пытаюсь прочитать содержимое тега. Но чем дольше я это изучаю, тем больше чувствую себя единственным, кто не понимает, как это работает.Как сканировать тег с помощью NFC?
Просматривая сайт developer.android.com, я нашел следующий метод:
public String readTag(Tag tag) {
MifareUltralight mifare = MifareUltralight.get(tag);
try {
mifare.connect();
byte[] payload = mifare.readPages(4);
return new String(payload, Charset.forName("US-ASCII"));
} catch (IOException e) {
Log.e(TAG, "IOException while writing Scanner message...", e);
} finally {
if (mifare != null) {
try {
mifare.close();
}
catch (IOException e) {
Log.e(TAG, "Error closing tag...", e);
}
}
}
return null;
}
Теперь, прежде чем я могу использовать, что мне нужно, чтобы инициализировать некоторые вещи:
public void configScanner()
{
Intent intent = getIntent();
tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndef.addDataType("*/*"); /* Handles all MIME based dispatches. You should specify only the ones that you need. */
}
catch (MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
}
intentFiltersArray = new IntentFilter[] {ndef, };
techListsArray = new String[][] { new String[] { Ndef.class.getName() } };
}
Тогда я просто попробуйте выполнить его.
public void scanClick(View v)
{
textview1.setText(readTag(tag));
}
Я также добавил некоторые вещи в манифесте, и мой собственный XML-файл
Manifest:
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>
<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/scan" />
scan.xml
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.IsoDep</tech>
<tech>android.nfc.tech.NfcA</tech>
<tech>android.nfc.tech.NfcB</tech>
<tech>android.nfc.tech.NfcF</tech>
<tech>android.nfc.tech.NfcV</tech>
<tech>android.nfc.tech.Ndef</tech>
<tech>android.nfc.tech.NdefFormatable</tech>
<tech>android.nfc.tech.MifareClassic</tech>
<tech>android.nfc.tech.MifareUltralight</tech>
</tech-list>
</resources>
Однако, когда я исполняю код я получаю сбой при выполнении readTag(tag)
. Я просто не понимаю, как заставить этот материал работать.
По требованию: выход LogCat:
04-11 17:13:07.650: E/AndroidRuntime(672): FATAL EXCEPTION: main
04-11 17:13:07.650: E/AndroidRuntime(672): java.lang.IllegalStateException: Could not execute method of the activity
04-11 17:13:07.650: E/AndroidRuntime(672): at android.view.View$1.onClick(View.java:3591)
04-11 17:13:07.650: E/AndroidRuntime(672): at android.view.View.performClick(View.java:4084)
04-11 17:13:07.650: E/AndroidRuntime(672): at android.view.View$PerformClick.run(View.java:16966)
04-11 17:13:07.650: E/AndroidRuntime(672): at android.os.Handler.handleCallback(Handler.java:615)
04-11 17:13:07.650: E/AndroidRuntime(672): at android.os.Handler.dispatchMessage(Handler.java:92)
04-11 17:13:07.650: E/AndroidRuntime(672): at android.os.Looper.loop(Looper.java:137)
04-11 17:13:07.650: E/AndroidRuntime(672): at android.app.ActivityThread.main(ActivityThread.java:4745)
04-11 17:13:07.650: E/AndroidRuntime(672): at java.lang.reflect.Method.invokeNative(Native Method)
04-11 17:13:07.650: E/AndroidRuntime(672): at java.lang.reflect.Method.invoke(Method.java:511)
04-11 17:13:07.650: E/AndroidRuntime(672): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
04-11 17:13:07.650: E/AndroidRuntime(672): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
04-11 17:13:07.650: E/AndroidRuntime(672): at dalvik.system.NativeStart.main(Native Method)
04-11 17:13:07.650: E/AndroidRuntime(672): Caused by: java.lang.reflect.InvocationTargetException
04-11 17:13:07.650: E/AndroidRuntime(672): at java.lang.reflect.Method.invokeNative(Native Method)
04-11 17:13:07.650: E/AndroidRuntime(672): at java.lang.reflect.Method.invoke(Method.java:511)
04-11 17:13:07.650: E/AndroidRuntime(672): at android.view.View$1.onClick(View.java:3586)
04-11 17:13:07.650: E/AndroidRuntime(672): ... 11 more
04-11 17:13:07.650: E/AndroidRuntime(672): Caused by: java.lang.NullPointerException
04-11 17:13:07.650: E/AndroidRuntime(672): at android.nfc.tech.MifareUltralight.get(MifareUltralight.java:94)
04-11 17:13:07.650: E/AndroidRuntime(672): at com.example.android_test.MainActivity.readTag(MainActivity.java:108)
04-11 17:13:07.650: E/AndroidRuntime(672): at com.example.android_test.MainActivity.scanClick(MainActivity.java:155)
04-11 17:13:07.650: E/AndroidRuntime(672): ... 14 more
Вы можете разместить вывод LogCat? –
Хорошо, что там написано, что такое ошибка и что ее вызывает. Я мало знаю об этих конкретных ошибках, поэтому я предлагаю вам немного поискать InvocationTargetException –