如何使android应用程序收听特定的NFC芯片? [英] How to make android application listen to specific NFC chip?

查看:91
本文介绍了如何使android应用程序收听特定的NFC芯片?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个应用程序,如果碰到了NFC芯片,它将执行某些操作,我知道以下有关Android中NFC的信息如果我输入错了,请纠正我

I'm creating application that do some action if hit NFC chip , I know the following information about NFC in Android please correct me if I am wrong

  1. 您不能将NFC的操作注册到清单文件中的接收方,只能注册活动.
  2. 每个NFC芯片都有其自己的唯一ID.

我想做的是
当应用程序处于后台或关闭状态时,如果我打了ID为(例如1234)的NFC芯片,我的应用程序便会吃午餐并执行一些操作.

what I want to do is
while the Application is in the background or it's closed , if I hit NFC chip with id (ex 1234) my app lunched and do some action.

有可能吗? 如果可以,如何实现?

is that possible ? if yes, how it can be achieved?

编辑 这是我的代码,当您检查任何NFC芯片并执行此操作时,它确实会打开android.nfc.action.TECH_DISCOVERED 但当它打开时,动作为android.intent.action.MAIN MainActivity.java

edit here is my code , it does open when you check any NFC chip and get this action android.nfc.action.TECH_DISCOVERED but when it open the action is android.intent.action.MAIN MainActivity.java

    public class MainActivity extends AppCompatActivity {
    public static final String ACTION_CHECK_IN= "checked";
    public static final String ACTION_CHECK_OUT= "unchecked";
    private NfcAdapter mNfcAdapter;
    boolean isCheckedIn = false;

    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        isCheckedIn = Pref.getBoolean("check", false);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume() called with: " + "");
        String action = getIntent().getAction();
        if (action != null) {
            Log.d("MainActivity", "onCreate(" + action + ")");
            if (action.equals(NfcAdapter.ACTION_NDEF_DISCOVERED) || action.equals(NfcAdapter.ACTION_TAG_DISCOVERED) || action.equals(NfcAdapter.ACTION_TECH_DISCOVERED)) {

                if (!isCheckedIn) {
                    isCheckedIn = true;
                    Pref.putBoolean("check", true);
                    Log.d("checking","IN");
                } else {
                    isCheckedIn = false;
                    Pref.putBoolean("check", false);
                    Log.d("checking","Out");
                }

            }

        }

        if (!mNfcAdapter.isEnabled()) {

            Toast.makeText(MainActivity.this, "Please open it ", Toast.LENGTH_SHORT).show();
        }


        /**
         * It's important, that the activity is in the foreground.
         * Otherwise an IllegalStateException is thrown.
         */
        setupForegroundDispatch(this, mNfcAdapter);
    }

    @Override
    protected void onPause() {
        /**
         * Call this before onPause, otherwise an IllegalArgumentException is thrown.
         */
        stopForegroundDispatch(this, mNfcAdapter);

        super.onPause();
    }

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


    public static void setupForegroundDispatch(Activity activity, NfcAdapter adapter) {
        final Intent intent = new Intent(activity.getApplicationContext(), activity.getClass());
        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

        final PendingIntent pendingIntent = PendingIntent.getActivity(
                activity.getApplicationContext(), 0, intent, 0);

        IntentFilter[] filters = new IntentFilter[2];
        String[][] techList = new String[][]{};

        // same filter as manifest - action, category
        filters[0] = new IntentFilter();
        filters[0].addAction(NfcAdapter.ACTION_TAG_DISCOVERED);
        filters[1] = new IntentFilter();
        filters[1].addAction(NfcAdapter.ACTION_TECH_DISCOVERED);

        adapter.enableForegroundDispatch(activity, pendingIntent, filters, techList);
    }

    public static void stopForegroundDispatch(Activity activity, NfcAdapter adapter) {
        adapter.disableForegroundDispatch(activity);
    }
}

清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.srjo.pocnfcadapter">

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

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

    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">


            <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.TAG_DISCOVERED" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.nfc.action.TECH_DISCOVERED" />
            </intent-filter>

            <meta-data
                android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/filter_nfc" />

        </activity>

    </application>

</manifest>

推荐答案

首先在清单中注册您的应用

First register your app in the manifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.survivingwithandroid.nfc" >

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

然后,您应该使用前台调度(前台应用程序).最后,您使用NFCAdapter读取内容(onNewIntent). 我撰写了详细的关于NFC的帖子喜欢看看.

Then you should use foreground dispatch (foreground app). Finally you use NFCAdapter to read the content (onNewIntent). I wrote a detailed posts about NFC if you like give a look.

这篇关于如何使android应用程序收听特定的NFC芯片?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆