java - 检查 nfc 标签是否在附近

标签 java android nfc

我希望我的手机能够检测附近(靠近其表面)是否有 nfc 标签 以下代码没有错误,但一旦我运行该应用程序,它就会崩溃。如果你们中的某个人可以查看我的代码并检查是否有我没有看到的内容,那将非常有帮助。下面是运行时错误。

public class AccessControlActivity extends AppCompatActivity {

    NfcAdapter nfcAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_access_control);

         nfcAdapter = NfcAdapter.getDefaultAdapter(this);
        // Checks if there is NFC function
        if(nfcAdapter != null && nfcAdapter.isEnabled()) {
            //Toast.makeText(this, "NFC works", Toast.LENGTH_SHORT).show();
        }
        else {
            Toast.makeText(this, "NFC is not available!", Toast.LENGTH_SHORT).show();
            //finish();
        }


    }


    @Override
    protected  void onNewIntent(Intent intent) {
        Toast.makeText(this, "NFC intent received", Toast.LENGTH_LONG).show();
        super.onNewIntent(intent);
    }

    @Override
    protected void onResume() {
        Intent intent = new Intent(this, AccessControlActivity.class);
        intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
        IntentFilter[] intentFilters = new IntentFilter[]{};

        nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFilters, null);


        super.onResume();
    }

    @Override
    protected void onPause() {
        nfcAdapter.disableForegroundDispatch(this);


        super.onPause();
    }
}

运行时错误如下所示:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.nfc.netvision, PID: 5484
    java.lang.RuntimeException: Unable to resume activity {com.nfc.netvision/com.nfc.netvision.AccessControlActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.nfc.NfcAdapter.enableForegroundDispatch(android.app.Activity, android.app.PendingIntent, android.content.IntentFilter[], java.lang.String[][])' on a null object reference
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4341)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4373)
        at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2043)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7464)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:955)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.nfc.NfcAdapter.enableForegroundDispatch(android.app.Activity, android.app.PendingIntent, android.content.IntentFilter[], java.lang.String[][])' on a null object reference
        at com.nfc.netvision.AccessControlActivity.onResume(AccessControlActivity.java:116)
        at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1456)
        at android.app.Activity.performResume(Activity.java:8125)
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4331)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4373) 
        at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52) 
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2043) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:216) 
        at android.app.ActivityThread.main(ActivityThread.java:7464) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:955) 
I/Process: Sending signal. PID: 5484 SIG: 9

最佳答案

因此,您检查 onCreate 中的 nfcAdapter != null 并仅显示一个 toast ,然后您的应用程序将盲目地尝试并使用可能的 null onResume 中的 适配器。

这将解释 onResume 中的尝试调用虚拟方法 在空对象引用上作为变量nfcAdapteronResume

中可能为 null

您应该在 onResume 中再次检查 null

此外,您的 Intent 过滤器看起来也不正确,它们的代码要么导致没有 Intent 发送给您,要么相反导致所有 Intent 发送给您,包括非 NFC Intent。

当出现任何类型的标签时,会调用更正常的代码。

    @Override
    protected void onResume() {
        super.onResume();

        IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
        IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        try {
            ndefDetected.addDataType("*/*");
        } catch (IntentFilter.MalformedMimeTypeException e) {}
        IntentFilter techDetected = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
        IntentFilter[] nfcIntentFilter = new IntentFilter[]{ndefDetected,techDetected,tagDetected};

        PendingIntent pendingIntent = PendingIntent.getActivity(
                this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
        if(nfcAdapter!= null)
            nfcAdapter.enableForegroundDispatch(this, pendingIntent, nfcIntentFilter, null);

    }

    @Override
    protected void onPause() {
        super.onPause();
        if(nfcAdapter!= null)
            nfcAdapter.disableForegroundDispatch(this);
    }

关于java - 检查 nfc 标签是否在附近,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61250800/

相关文章:

java - 未处理的异常类型NoSuchFieldException(java反射)

android - 权限被拒绝 : Initializing repo for building Android source

android - 如何在 MIFARE Ultralight EV1 标签上设置和取消设置密码?

android - 最受支持的 Java 日期/时间类

android - 将邮件地址解析为联系人姓名

java - 使用 javax.smartcardio 读取 NFC Mifare Ultralight 卡

Android Mifare Classic 身份验证 key A 不工作

java - 将 C++ 类转换为等效的 Java 类

java - 是否可以在不使用CharacterEscapeHandler的情况下使用CDATA在JAXB中进行编码和解码

java - eclipse 。类路径引用的存档不存在