2011-03-04 14 views
7

Estoy tratando de probar ForegroundDispatch (http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/nfc/ForegroundDispatch. html) en el emulador API 10 (Android 2.3.3).NfcAdapter.getDefaultAdapter (this) devuelve null en el emulador

Cuando llamo a NfcAdapter.getDefaultAdapter (esto), obtengo nulo. ¿Por qué esto es tan?

Código:

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

Mi manifiesta:

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

¿Alguna idea?

Respuesta

0

Me aventuraría a adivinar que el emulador no tiene ningún adaptador NFC o capacidades NFC en absoluto.

NfcAdapter public static getDefaultAdapter (contexto Contexto) desde: Nivel API 10

ayudante para obtener el valor por defecto del adaptador de la NFC.

La mayoría de los dispositivos Android solo tendrán un adaptador NFC (controlador NFC).

Este ayudante es el equivalente de:

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

contexto

parámetros de contexto de la aplicación que llama de devoluciones

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

Editar:

parece que se puede hacer algunas cosas para jugar con él. Consulte NFCDemo, parece que puede generar escaneos falsos de etiquetas.

+0

Así que no hay manera de jugar con NFC en emulador de Android – DixieFlatline

+0

@DixieFlatline parece que se puede burlarse de ella respuesta Actualizado –

+0

todavia estoy usando fakeTagsActivity?.. para simular etiquetas, pero tengo problemas para obtener el adaptador nfc (= abstracción de un chip que lee etiquetas) – DixieFlatline

2

Realmente no puedes hacer nada interesante con el emulador y NFC. No desea utilizar la acción TAG_DISCOVERED ya que es la acción de último recurso. Las intenciones que se generan en un dispositivo real no se pueden falsificar como en la demostración de NFCDemo. El NFCDemo se lanzó con 2.3, antes del mejor soporte para NFC en 2.3.3. Es muy malo. Tal vez haya algunas opciones en el futuro, pero por ahora estamos todos atrapados con la necesidad de adquirir un dispositivo compatible con NFC para hacer cualquier cosa con NFC.

0

Puede modificar el código NFCDemo (llevarlo al nivel API 10 en el manifiesto y el proyecto Eclipse) y luego generar también NDEF_DISCOVERED Intenciones, con mensajes NDEF adjuntos a la intención a través de extras.

Eso puede permitirle desarrollar más para NFC (específicamente NDEF, etc.) sin tener HW real.

2

Creo que usted está buscando este NFC Emulator for android. Tendrá que crear un nuevo avd con esto como el objetivo. Esto parece ser prometedor, échale un vistazo.

Editar: Funciona mejor/sólo en entorno Windows :(