Android : Reading NFC tag in service class

2019-04-28 00:44发布

问题:

I am working on an application where i need to read the data stored in NFC tag, by data i mean is simple integer values as such 0,1,2,3 and so. The functions to read the data from NFC works fine when it's in Activity class but i need to run the application in the background so even when application is not running in foreground i can read the data from the NFC. So i wrote a service class and moved the function from the Activity to the service class. But it didn't work.

This is the "MainActivity.java"

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startService(new Intent(this, MyService.class));
    }

startService(new Intent(this, MyService.class));
This line starts the service class.

The Service class is "MyService.java"

public class MyService extends Service {

    private NfcAdapter mNfcAdapter;
    private PendingIntent mNfcPendingIntent;
    private IntentFilter[] mReadTagFilters;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
         mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
         mNfcPendingIntent = PendingIntent.getActivity(this, 0, new
         Intent(this,
         getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
         | Intent.FLAG_ACTIVITY_CLEAR_TOP), 0); 
         IntentFilter ndefDetected = new IntentFilter(
         NfcAdapter.ACTION_NDEF_DISCOVERED);
         ndefDetected.addDataScheme("http");
         IntentFilter techDetected = new IntentFilter(
         NfcAdapter.ACTION_TECH_DISCOVERED);    
         mReadTagFilters = new IntentFilter[] { ndefDetected, techDetected };    
            Log.v("service", "return from onCreate function");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    @Deprecated
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);


        Log.v("service", "onStart function");
        if (mNfcAdapter != null) {
            if (!mNfcAdapter.isEnabled()) {
                new AlertDialog.Builder(this)
                        .setTitle("NFC Dialog")
                        .setMessage("Please switch on NFC")
                        .setPositiveButton("Settings",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface arg0,
                                            int arg1) {
                                        Intent setnfc = new Intent(
                                                Settings.ACTION_WIRELESS_SETTINGS);
                                        startActivity(setnfc);
                                    }
                                })
                        .setOnCancelListener(
                                new DialogInterface.OnCancelListener() {
                                    public void onCancel(DialogInterface dialog) {
                                        dialog.dismiss(); 
                                    }
                                }).create().show();
            }
            mNfcAdapter.enableForegroundDispatch (MainActivity.mContext, mNfcPendingIntent,
                    mReadTagFilters, null);
        } else {
            Toast.makeText(this,
                    "Sorry, NFC adapter not available on your device.",
                    Toast.LENGTH_SHORT).show();
        }
        Log.v("service", "return fonStart function");
    }

}

In this the onCreate() function is running fine. The problem is this line :

 mNfcAdapter.enableForegroundDispatch (mContext, mNfcPendingIntent,
                    mReadTagFilters, null);

The first argument of the function accepts the context of an Activity and this is where i am stuck. Is there any way to solve this or any alternative. Thankyou for your help.

回答1:

Android's NFC functionality (specifically receiving Intents for tags, Beam, etc) is available to foreground activities only.