0

我必须编写一个简单的应用程序来读取 ISO B 卡

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tag_viewer);
    mTagContent = (LinearLayout) findViewById(R.id.list);
    mTitle = (TextView) findViewById(R.id.title);
    resolveIntent(getIntent());
}



void resolveIntent(Intent intent) {
    // Parse the intent
    String action = intent.getAction();
    Log.e(TAG, "toto ");
    if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
    try{
            myTag.connect();
            if (myTag.isConnected()){
                byte[] response = myTag.transceive(command);
                //logText(new String(response));
                Log.e(TAG, "Result " + response);
            }
            myTag.close();

        }catch (IOException e) {
               e.printStackTrace();
        }

    } else {
        Log.e(TAG, "Unknown intent " + intent);
        finish();
        return;
    }
}

我的问题是我没有成功进入测试 if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action))。我系统地有“未知的意图”。

关于清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.nfc">
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
>
       <activity android:name="TagViewer"
        android:theme="@android:style/Theme.NoTitleBar"
    >
    <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.TECH_DISCOVERED"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
            <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/nfc_tech_filter" />
    </activity>
</application>
<uses-sdk android:minSdkVersion="9" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />

谢谢你的帮助。

4

2 回答 2

0

您需要创建一个 NfcAdapter 对象

 private NfcAdapter mNfcAdapter;

而不是在 onCreate 方法中将对象与您的 NFC 关联

mNfcAdapter = NfcAdapter.getDefaultAdapter(this);

在启动应用程序之前做一些检查,以确保手机有 NFC

if (mNfcAdapter == null) { 
  // Stop here, we definitely need NFC
  Toast.makeText(this, "This device doesn't support NFC.", Toast.LENGTH_LONG).show();
  finish();
  return;
}

在 onResume 方法上启用 Dispatch

@Override
public void onResume() {
  super.onResume();
  Intent intent = new Intent(activity.getApplicationContext(), activity.getClass());
  PendingIntent pendingIntent = PendingIntent.getActivity(activity.getApplicationContext(), 0, intent, 0);
  mNfcAdapter.enableForegroundDispatch(activity, pendingIntent, null, null);
}

在 onPause 方法上禁用 Dispatch

@Override
protected void onPause() {
  mNfcAdapter.disableForegroundDispatch(activity);
}

最后重写onNewIntent方法来处理intent

@Override
protected void onNewIntent(Intent intent) {
  //handle intent here
}

在您的情况下,在 onNewIntent 方法中调用“resolveIntent(intent)”,而不是按照这篇文章处理 IsoDep 标签:从 NFC 标签 (IsoDep) 读取数据

于 2014-09-12T23:36:24.850 回答
0

您的问题似乎是,您在 onCreate 方法中调用了 resolveIntent。

这应该可以解决问题:

    @Override
protected void onNewIntent(Intent pIntent) {
    super.onNewIntent(pIntent);

    resolveIntent(pIntent);

}

要获取标记对象,我只是在使用

Tag tagFromIntent = pIntent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

        NfcA tag = NfcA.get(tagFromIntent);

在我的 onNewIntent 方法中

不幸的是,我无法为 NfcB 验证这一点。

于 2012-12-17T15:43:02.667 回答