NFC应用程序在enableForegroundDispatch上崩溃

时间:2015-10-27 14:22:22

标签: java android nfc

我正在尝试使用教程在我的应用程序中使用NFC前台调度 herehere。从我可以推断出所有其他功能似乎正在起作用的只是NFC forground调度系统不起作用。

在我的onCreate中,我检查NFC是否存在并初始化待处理的Intents和过滤器并获得NFC适配器:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Set some stuff
    mTV = (TextView) findViewById(R.id.textView);
    mButt = (Button) findViewById(R.id.button);
    //mNfcAd = NfcAdapter.getDefaultAdapter(this);
    //Init elsewhere
    getAdapter();

    //Hide button until its needed
    mButt.setVisibility(View.INVISIBLE);

    //Make sure NFC actually exists.....
    if (mNfcAd == null) {
        //Not going to work without NFC
        Toast.makeText(this, "This device does not support NFC\nGet used to the pen and paper for now :/", Toast.LENGTH_LONG).show();
        finish();
        return;
    }

    Intent nfcIntent = new Intent(this, getClass());
    nfcIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

    nfcPendingIntent =
            PendingIntent.getActivity(this, 0, nfcIntent, 0);

    IntentFilter tagIntentFilter =
            new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    try {
        tagIntentFilter.addDataType("text/plain");
        intentFiltersArray = new IntentFilter[]{tagIntentFilter};
    }
    catch (Throwable t) {
        t.printStackTrace();
    }

    //Init the prefs
    initPrefs();

}

public void initPrefs() {
    prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
}

private NfcAdapter getAdapter(){
    if(mNfcAd ==null){
        NfcManager manager = (NfcManager) getSystemService(NFC_SERVICE);
        mNfcAd = manager.getDefaultAdapter();
    }
    return mNfcAd;
}

然后我继续检查NFC是否已启用(如果没有显示显示NFC设置的按钮),以及检查应用程序是否处于首次运行状态。在onResume()的末尾,我(尝试)为适配器启用Foreground Dispatch。

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

    //Define the mButt action
    mButt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent dialogIntent = new Intent(Settings.ACTION_NFC_SETTINGS);
            dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(dialogIntent);
        }
    });
            //If NFC exists, check if its turned on
    if (!mNfcAd.isEnabled()) {
        Toast.makeText(this, "You have NFC, but you haven't enabled it...", Toast.LENGTH_LONG).show();
        mTV.setText("NFC not enabled");
        mButt.setVisibility(View.VISIBLE);
    }
    //Check if first run
    if (prefs.getInt("firstTime", 1) == 1 ||
            prefs.getString("fullName", null) == null ||
            prefs.getString("house", null) == null) {
        Intent intent = new Intent(this, First_Run.class);
        startActivity(intent);
        prefs.edit().putInt("firstTime", 0);
        prefs.edit().putString("fullName", getIntent().getExtras().getString("fullName"));
        prefs.edit().putString("house", getIntent().getExtras().getString("house"));
        prefs.edit().apply();
    }
    getAdapter().enableForegroundDispatch(this, nfcPendingIntent, intentFiltersArray, null);
    handleIntent(getIntent());
}

错误是:

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

然而,所有的论据似乎都被初始化了;
它在onResume中被调用,因此创建了活动上下文;
nfcPendingIntent和intentFiltersArray在onCreate中初始化;
我没有技术列表所以我使用null作为最终参数;
适配器本身在getAdapter中初始化。

我目前正在梳理其他教程以查看可以使用的不同方法,但我真的希望将其修复。

清单:

<?xml version="1.0" encoding="utf-8"?>

<uses-feature
    android:name="android.hardware.nfc"
    android:required="true" />

<uses-permission android:name="android.permission.NFC" />

<application
    android:fullBackupContent="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>
    </activity>

    <activity
        android:name=".First_Run"
        android:label="@string/title_activity_first__run">
    </activity>
</application>

1 个答案:

答案 0 :(得分:-1)

尝试创建NfcAdapter对象,如下所示。

NfcAdapter mNfcAdapter = NfcAdapter.getDefaultAdapter(this);