NfcAdapter.getDefaultAdapter(this) returns null in emulator

I am trying to test ForegroundDispatch (http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/nfc/ForegroundDispatch.html) in emulator API 10 (Android 2.3.3).

When i call NfcAdapter.getDefaultAdapter(this), i get null. Why is this so?

Code:

public class ForegroundDispatch extends Activity {
private NfcAdapter mAdapter;
private PendingIntent mPendingIntent;
private IntentFilter[] mFilters;
private String[][] mTechLists;
private TextView mText;
private int mCount = 0;

@Override
public void onCreate(Bundle savedState) {
    super.onCreate(savedState);

    setContentView(R.layout.foreground_dispatch);
    mText = (TextView) findViewById(R.id.text);
    mText.setText("Scan a tag");

    mAdapter = NfcAdapter.getDefaultAdapter(this);

    // Create a generic PendingIntent that will be deliver to this activity. The NFC stack
    // will fill in the intent with the details of the discovered tag before delivering to
    // this activity.
    mPendingIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

    // Setup an intent filter for all MIME based dispatches
    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    try {
        ndef.addDataType("*/*");
    } catch (MalformedMimeTypeException e) {
        throw new RuntimeException("fail", e);
    }
    mFilters = new IntentFilter[] {
            ndef,
    };

    // Setup a tech list for all NfcF tags
    mTechLists = new String[][] { new String[] { NfcF.class.getName() } };
}

@Override
public void onResume() {
    super.onResume();
    mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists); //CRASHES HERE BECAUSE mAdapter IS NULL
}

@Override
public void onNewIntent(Intent intent) {
    Log.i("Foreground dispatch", "Discovered tag with intent: " + intent);
    mText.setText("Discovered tag " + ++mCount + " with intent: " + intent);
}

@Override
public void onPause() {
    super.onPause();
    mAdapter.disableForegroundDispatch(this);
 }
  }

My manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.neka.znacka"
  android:versionCode="1"
  android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.NFC"></uses-permission>
<uses-feature android:name="android.hardware.nfc" android:required="true" />

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".Uvodna"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name="Simulator">
    </activity>

</application>

Any ideas?


You really can't do anything interesting with the emulator and NFC. You don't want to be using the TAG_DISCOVERED action since that is the action of last resort. The intents that get generated on a real device cannot be faked like they are in the NFCDemo demo. The NFCDemo was released with 2.3, before the better support for NFC in 2.3.3. It's too bad. Maybe there will be some options in the future but for now we're all stuck with having to acquire an NFC-capable device to do anything with NFC.


I think you are looking for this NFC Emulator for android. You'll need to create a new avd with this as the target. This appears to be promising, have a look at it.

Edit: Works best/only on windows environment :(


I'd venture a guess that the emulator has no NFC adapter or NFC capabilities at all.

public static NfcAdapter getDefaultAdapter (Context context) Since: API Level 10

Helper to get the default NFC Adapter.

Most Android devices will only have one NFC Adapter (NFC Controller).

This helper is the equivalent of:

NfcManager manager = (NfcManager) context.getSystemService(Context.NFC_SERVICE); NfcAdapter adapter = manager.getDefaultAdapter();

Parameters context the calling application's context Returns

* the default NFC adapter, or null if no NFC adapter exists

Edit:

Looks like you can do some things to play with it. Check out the NFCDemo, looks like you can generate fake scans of tags.

链接地址: http://www.djcxy.com/p/51188.html

上一篇: 在渲染为pdf时,Matplotlib不显示阴影

下一篇: NfcAdapter.getDefaultAdapter(this)在模拟器中返回null