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 开发者_JAVA百科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 :(
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.
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.
精彩评论