1

hy..我的任务是让我的 kitkat-nexus 充当标签。我有 ACS 122U 作为阅读器。我已阅读此站点 http://blog.opendatalab.de/hack/2013/11/07/android-host-card-emulation-with-acr122/中的程序示例。然后我在自己的 Eclipse 上尝试了代码。

主要活动 :

public class MainActivity extends Activity implements OnMessageReceived, ReaderCallback {

    private NfcAdapter nfcAdapter;
    private ListView listView;
    private IsoDepAdapter isoDepAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView)findViewById(R.id.listView);
        isoDepAdapter = new IsoDepAdapter(getLayoutInflater());
        listView.setAdapter(isoDepAdapter);
        nfcAdapter = NfcAdapter.getDefaultAdapter(this);
        Log.i("end of onCreate-----","onCreate HCE");
    }

    @Override
    public void onResume() {
        super.onResume();
        //nfcAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK,
            //  null);

        //nfcAdapter.disableReaderMode(this); //tambahan poipo
        Log.i("onResume---", "onResume");
    }

    @Override
    public void onPause() {
        super.onPause();
        nfcAdapter.disableReaderMode(this);
        Log.i("onPause---", "onPause");
    }

    @Override
    public void onTagDiscovered(Tag tag) {
        IsoDep isoDep = IsoDep.get(tag);
        IsoDepTransceiver transceiver = new IsoDepTransceiver(isoDep, this);
        Thread thread = new Thread(transceiver);
        Log.i("dibawah thread", "ontagdiscovered");
        thread.start();
    }

    @Override
    public void onMessage(final byte[] message) {
        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                isoDepAdapter.addMessage(new String(message));
                Log.i("didlmrun---", "onMessage");
            }
        });

        Log.i("diluarrun---", "onMessage");
    }

    @Override
    public void onError(Exception exception) {
        onMessage(exception.getMessage().getBytes());
    }
}

主机服务:

…………

@Override
    public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
        if (selectAidApdu(apdu)) {
            Log.i("HCEDEMO====", "Application selected====");
            return getWelcomeMessage();
        }
        else {
            Log.i("HCEDEMO======", "Received: =====" + new String(apdu));
            return getNextMessage();
        }
    }

…………

然后在清单文件中:

<uses-sdk
        android:minSdkVersion="19"
        android:targetSdkVersion="19" />

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




    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <service
            android:name=".MyHostApduService"
            android:exported="true"
            android:permission="android.permission.BIND_NFC_SERVICE" >
            <intent-filter>
                <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE" />
            </intent-filter>

            <meta-data
                android:name="android.nfc.cardemulation.host_apdu_service"
                android:resource="@xml/apduservice" />
        </service>

         <activity
            android:name="de.grundid.hcedemo.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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


        </activity>





    </application>

好的,当我运行上面的源代码时,我看到我的 acs122u 当我在它附近轻按我的 nexus 时不断闪烁。但我没有从 hostapdu 服务中看到 log.i(....)。在 eclipse log cat 中,只有一些 log.i 来自主要活动。我应该怎么做才能将该hostapdu服务绑定到主要活动,所以我的nexus可以充当标签......???提前致谢... :-)

4

0 回答 0