Проверьте, не рядом ли тег nf c - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу, чтобы мой телефон обнаружил наличие тега nf c поблизости (вблизи его поверхности). Следующий код не содержит ошибок, но, как только я запускаю приложение, он вылетает. Было бы очень полезно, если бы кто-то из вас мог просмотреть мой код и проверить, есть ли что-то, чего я не вижу. Внизу ниже - ошибка времени выполнения.

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

1 Ответ

0 голосов
/ 16 апреля 2020

Таким образом, вы проверяете, что nfcAdapter != null в onCreate и просто показывает тост, ваше приложение затем вслепую go и пытается использовать возможно null адаптер в onResume.

Это объясняет Attempt to invoke virtual method on a null object reference в onResume, так как переменная nfcAdapter, вероятно, null в onResume

Вы должны снова проверить null в onResume

Кроме того, ваши фильтры Intent также выглядят неправильно, они кодируют либо то, что вам не нужно отправлять Intent, либо противоположную причину, в том числе не NF C Intents, которые вам отправляют.

Более нормальный код, который вызывается при представлении тега любого типа, будет.

    @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);
    }
...