2011-03-04 56 views
7

我想测试ForegroundDispatch(http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/nfc/ForegroundDispatch。 html)在模拟器API 10(Android 2.3.3)中。NfcAdapter.getDefaultAdapter(this)在模拟器中返回null

当我调用NfcAdapter.getDefaultAdapter(this)时,我得到空。这是为什么?

代码:

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); 
} 
    } 

我的清单:

<?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> 

任何想法?

回答

0

我猜测模拟器根本没有NFC适配器或NFC功能。

公共静态NfcAdapter getDefaultAdapter(上下文的背景下) 自:API等级10

助手获取默认的NFC适配器。

大多数Android设备将只有一个NFC适配器(NFC控制器) 。

此助手是等价的:

NfcManager经理=(NfcManager) context.getSystemService(Context.NFC_SERVICE); NfcAdapter适配器= manager.getDefaultAdapter();

参数方面的呼吁 应用程序的情况下返回

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

编辑:

看起来像你可以做一些事情与它玩。看看NFCDemo,看起来像你可以生成标签的假扫描。

+0

所以没有办法在Android模拟器与NFC玩 – DixieFlatline 2011-03-04 17:47:23

+0

@DixieFlatline貌似可以嘲笑它更新了答案 – 2011-03-04 17:50:12

+0

我alredy使用fakeTagsActivity?。来模拟标签,但我有问题获得nfc适配器(=抽象的芯片,读取标签) – DixieFlatline 2011-03-04 17:55:31

2

你真的不能做任何事情与仿真器和NFC有趣。您不希望使用TAG_DISCOVERED操作,因为这是最后一招的操作。在真实设备上生成的意图不能像NFCDemo演示中那样伪造。 NFCDemo在2.3.3发布之前就已经发布了,而在2.3.3更好地支持NFC之前。这太糟糕了。也许未来会有一些选择,但现在我们都坚持不得不购买一台支持NFC的设备来处理NFC。

0

您可以修改NFCDemo代码(在清单和Eclipse项目中将其打到API级别10),然后让它生成NDEF_DISCOVERED意图,并通过附加内容将NDEF消息附加到意图。

这可以让你开发一些NFC(特别是NDEF等),而没有真正的硬件。

2

我认为你正在寻找这个NFC Emulator for android。 您需要创建一个新的avd作为目标。这看起来很有希望,请看看它。

编辑:工作最好/只适用于Windows环境:(

相关问题