7

我正在开发一个应用程序,我需要读取存储在 NFC 标签中的数据,我的意思是数据是简单的整数值,例如 0、1、2、3 等。从 NFC 读取数据的功能在 Activity 类中工作正常,但我需要在后台运行应用程序,因此即使应用程序不在前台运行,我也可以从 NFC 读取数据。所以我写了一个服务类,并将函数从 Activity 移动到服务类。但它没有用。

这是“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));
此行启动服务类。

服务类是“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");
    }

}

在此onCreate()函数运行良好。问题是这一行:

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

该函数的第一个参数接受 Activity 的上下文,这就是我卡住的地方。有没有办法解决这个问题或任何替代方案。谢谢您的帮助。

4

1 回答 1

4

Android 的 NFC 功能(特别是接收标签、Beam 等的 Intent)仅适用于前台活动。

于 2013-10-28T14:43:29.853 回答