java - NFC 编写器的 Android 代码

标签 java android nfc

嗨,这是我的 java 文件......我正在开发一个 nfc writer 应用程序......下面是我的 java 代码文件

包com.example.nfc_tag_writer;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences.Editor;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcAdapter.CreateNdefMessageCallback;
import android.nfc.NfcAdapter.OnNdefPushCompleteCallback;
import android.nfc.NfcEvent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.Toast;
import java.nio.charset.Charset;

public class SendTextViaNFCActivity extends Activity implements CreateNdefMessageCallback, OnNdefPushCompleteCallback {

    private static final int MESSAGE_SENT = 1;
    String CURSOR_HERE;
    String SAVED_TEXT;
    String beamText;
    private final Handler mHandler;
    NfcAdapter mNfcAdapter;
    EditText myText;
class AnonymousClass_1 extends Handler {
    final /* synthetic */ SendTextViaNFCActivity this$0;

    AnonymousClass_1(SendTextViaNFCActivity r1_SendTextViaNFCActivity) {
        super();
        this$0 = r1_SendTextViaNFCActivity;
    }

    public void handleMessage(Message msg) {
        switch(msg.what) {
        case MESSAGE_SENT:
            Toast.makeText(this$0.getApplicationContext(), "Message sent!", MESSAGE_SENT).show();
        }
    }
}


public SendTextViaNFCActivity() {
    super();
    SAVED_TEXT = "SAVED_TEXT";
    CURSOR_HERE = "###CURSOR_HERE###";
    beamText = "";
    mHandler = new AnonymousClass_1(this);
}

public NdefRecord createMimeRecord(String mimeType, byte[] payload) {
    return new NdefRecord((short) 2, mimeType.getBytes(Charset.forName("US-ASCII")), new byte[0], payload);
}

public NdefMessage createNdefMessage(NfcEvent event) {
    NdefRecord[] r2_NdefRecord_A = new NdefRecord[2];
    r2_NdefRecord_A[0] = createMimeRecord("application/com.example.android.beam", myText.getText().toString().getBytes());
    r2_NdefRecord_A[1] = NdefRecord.createApplicationRecord("diewland.nfc.text");
    return new NdefMessage(r2_NdefRecord_A);
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.send_text_via_nfc);
    myText = (EditText) findViewById(R.id.my_text);
    mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
    if (mNfcAdapter == null) {
        myText.setText("NFC is not available on this device.");
        myText.setEnabled(false);
    }
    mNfcAdapter.setNdefPushMessageCallback(this, this, new Activity[0]);
    mNfcAdapter.setOnNdefPushCompleteCallback(this, this, new Activity[0]);
}

public boolean onCreateOptionsMenu(Menu menu) {
    if (mNfcAdapter == null) {
        return super.onCreateOptionsMenu(menu);
    } else {
        getMenuInflater().inflate(R.menu.options, menu);
        return true;
    }
}

public void onNdefPushComplete(NfcEvent arg0) {
    mHandler.obtainMessage(MESSAGE_SENT).sendToTarget();
}

public void onNewIntent(Intent intent) {
    setIntent(intent);
}

public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
    case R.id.menu_settings:
        startActivity(new Intent("android.settings.NFCSHARING_SETTINGS"));
        return true;
    case R.id.menu_reset:
        myText.setText("");
        return true;
    case R.id.menu_share:
        if (!"".equals(myText.getText().toString())) {
            Intent sendIntent = new Intent();
            sendIntent.setAction("android.intent.action.SEND");
            sendIntent.putExtra("android.intent.extra.TEXT", myText.getText().toString());
            sendIntent.setType("text/plain");
            startActivity(Intent.createChooser(sendIntent, "Share via"));
            return true;
        } else {
            return true;
        }
    }
    return super.onOptionsItemSelected(item);
}

protected void onPause() {
    super.onPause();
    myText.getText().insert(myText.getSelectionStart(), CURSOR_HERE);
    Editor editor = getPreferences(0).edit();
    editor.putString(SAVED_TEXT, myText.getText().toString());
    editor.commit();
}

public void onResume() {
    super.onResume();
    Intent intent = getIntent();
    String type = intent.getType();
    if (!"android.intent.action.SEND".equals(intent.getAction()) || type == null) {
        if ("android.nfc.action.NDEF_DISCOVERED".equals(getIntent().getAction())) {
            processIntent(getIntent());
        }
        String restoredText = getPreferences(0).getString(SAVED_TEXT, null);
        if (restoredText != null) {
            myText.setText(restoredText.replaceAll(CURSOR_HERE, beamText));
        }
    } else if ("text/plain".equals(type)) {
        myText.setText(intent.getStringExtra("android.intent.extra.TEXT"));
    }
    myText.setSelection(myText.getText().length());
}

void processIntent(Intent intent) {
    beamText = new String(((NdefMessage) intent.getParcelableArrayExtra("android.nfc.extra.NDEF_MESSAGES")[0]).getRecords()[0].getPayload());
}

}

我收到以下错误

03-19 08:09:56.989: V/NFC(767): this device does not have NFC support
03-19 08:09:56.999: D/AndroidRuntime(767): Shutting down VM
03-19 08:09:56.999: W/dalvikvm(767): threadid=1: thread exiting with uncaught exception (group=0x414c4700)
03-19 08:09:57.029: E/AndroidRuntime(767): FATAL EXCEPTION: main
03-19 08:09:57.029: E/AndroidRuntime(767): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.nfc_tag_writer/com.example.nfc_tag_writer.SendTextViaNFCActivity}: java.lang.NullPointerException
03-19 08:09:57.029: E/AndroidRuntime(767):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
03-19 08:09:57.029: E/AndroidRuntime(767):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
03-19 08:09:57.029: E/AndroidRuntime(767):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
03-19 08:09:57.029: E/AndroidRuntime(767):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
03-19 08:09:57.029: E/AndroidRuntime(767):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-19 08:09:57.029: E/AndroidRuntime(767):  at android.os.Looper.loop(Looper.java:137)
03-19 08:09:57.029: E/AndroidRuntime(767):  at android.app.ActivityThread.main(ActivityThread.java:5103)
03-19 08:09:57.029: E/AndroidRuntime(767):  at java.lang.reflect.Method.invokeNative(Native Method)
03-19 08:09:57.029: E/AndroidRuntime(767):  at java.lang.reflect.Method.invoke(Method.java:525)
03-19 08:09:57.029: E/AndroidRuntime(767):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
03-19 08:09:57.029: E/AndroidRuntime(767):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-19 08:09:57.029: E/AndroidRuntime(767):  at dalvik.system.NativeStart.main(Native Method)
03-19 08:09:57.029: E/AndroidRuntime(767): Caused by: java.lang.NullPointerException
03-19 08:09:57.029: E/AndroidRuntime(767):  at com.example.nfc_tag_writer.SendTextViaNFCActivity.onCreate(SendTextViaNFCActivity.java:75)
03-19 08:09:57.029: E/AndroidRuntime(767):  at android.app.Activity.performCreate(Activity.java:5133)
03-19 08:09:57.029: E/AndroidRuntime(767):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
03-19 08:09:57.029: E/AndroidRuntime(767):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
03-19 08:09:57.029: E/AndroidRuntime(767):  ... 11 more

请谁能帮帮我 我在 logcat 中收到错误...我无法修复它们...应用程序不幸地停止了崩溃

最佳答案

您检查了mNfcAdapter 是否为null,但即使是,之后仍尝试访问它。尝试移动这些行

mNfcAdapter.setNdefPushMessageCallback(this, this, new Activity[0]);
mNfcAdapter.setOnNdefPushCompleteCallback(this, this, new Activity[0]);

到前面的ifelse中:

if (mNfcAdapter == null) {
    myText.setText("NFC is not available on this device.");
    myText.setEnabled(false);
} else {
    mNfcAdapter.setNdefPushMessageCallback(this, this, new Activity[0]);
    mNfcAdapter.setOnNdefPushCompleteCallback(this, this, new Activity[0]);
}

关于java - NFC 编写器的 Android 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22505722/

相关文章:

java - Eclipse 看不到 Maven 项目的 GitHub 依赖项中所做的更改

java - 如何从mysql中的用户那里获取WHERE值

java - 流口水java更新

java - 分号和 'cannot resolve ...' 的奇怪问题

nfc - 使用 ACR122U NFC 读写器的 Mifare 1K NFC 标签认证失败

java - 在 JTable Column 中只选择一个复选框

php - 用于连接 MySQL 数据库的 PHP 文件放置的正确位置是什么

java - 如果每行包含不同数量的 View ,如何在 tablelayout 中制作相同大小的 View ?

authentication - Mifare 1K 认证 key

android - 在 Android 中屏幕锁定时启动 NFC