Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 808
DixieFlatline Avatar asked Mar 04 '11 17:03

DixieFlatline


3 Answers

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.

like image 162
Dave MacLean Avatar answered Sep 28 '22 14:09

Dave MacLean


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 :(

like image 22
nikhil Avatar answered Sep 28 '22 14:09

nikhil


You can modify the NFCDemo code (bump it to API level 10 in the manifest and Eclipse project) and then have it generate NDEF_DISCOVERED Intents also, with NDEF messages attached to the Intent through extras.

That can allow you to develop some more for NFC (specifically NDEF etc) without having real HW.

like image 29
Andrew Mackenzie Avatar answered Sep 28 '22 15:09

Andrew Mackenzie