¿Cómo puedo enviar una cadena a través de NFC mientras Screen-Pinning?

Estoy tratando de enviar una String través de NFC mientras mi aplicación está usando pinning de pantalla . No funciona: la transferencia no ocurre; Pero si desactivo la pantalla pinning la transferencia de los trabajos de la String .

Puedo desactivar la fijación de la pantalla para un poco y luego realizar la transferencia, pero eso es un riesgo de seguridad.

¿Cómo puedo hacer esto?


Aquí está todo el código si quieres probarlo. Todo lo que necesitas hacer es habilitar la captura de pantalla manualmente a través de la configuración de la aplicación (por lo que es menos código y todavía produce el mismo resultado). He probado esto con dos Nexus 7, ambos con Android 5.0.

Usted no tiene que leer todo este código, esta pregunta probablemente puede ser resuelto si sabe algo que puedo agregar a mi manifiesto que permitiría NFC mientras pinning de pantalla.


AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.androidnfc" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.NFC"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.androidnfc.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> </activity> </application> </manifest> 

MainActivity.java

 public class MainActivity extends Activity implements CreateNdefMessageCallback, OnNdefPushCompleteCallback { TextView textInfo; EditText textOut; NfcAdapter nfcAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textInfo = (TextView)findViewById(R.id.info); textOut = (EditText)findViewById(R.id.textout); nfcAdapter = NfcAdapter.getDefaultAdapter(this); nfcAdapter.setNdefPushMessageCallback(this, this); nfcAdapter.setOnNdefPushCompleteCallback(this, this); } @Override protected void onResume() { super.onResume(); Intent intent = getIntent(); String action = intent.getAction(); if(action.equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) { Parcelable[] parcelables = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); NdefMessage inNdefMessage = (NdefMessage)parcelables[0]; NdefRecord[] inNdefRecords = inNdefMessage.getRecords(); NdefRecord NdefRecord_0 = inNdefRecords[0]; String inMsg = new String(NdefRecord_0.getPayload()); textInfo.setText(inMsg); } } @Override protected void onNewIntent(Intent intent) { setIntent(intent); } @Override public void onNdefPushComplete(NfcEvent event) { final String eventString = "onNdefPushComplete\n" + event.toString(); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), eventString, Toast.LENGTH_LONG).show(); } }); } @Override public NdefMessage createNdefMessage(NfcEvent event) { String stringOut = textOut.getText().toString(); byte[] bytesOut = stringOut.getBytes(); NdefRecord ndefRecordOut = new NdefRecord( NdefRecord.TNF_MIME_MEDIA, "text/plain".getBytes(), new byte[] {}, bytesOut); NdefMessage ndefMessageout = new NdefMessage(ndefRecordOut); return ndefMessageout; } } 

diseño

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.example.androidnfc.MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:textStyle="bold" /> <EditText android:id="@+id/textout" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/info" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

No estoy seguro de si esto realmente responde a su pregunta, pero me gustaría resumir mis conclusiones:

Al probar su ejemplo en Android 5.0.1 (LRX22C en Nexus 4), el lado receptor automáticamente desacopla la pantalla al recibir el mensaje NDEF y (re-) inicia la actividad. Por lo tanto, parece que el filtro de intención que está registrado en el manifiesto tiene prioridad sobre el pinning de la pantalla (manual?).

Soy consciente de que esto no coincide exactamente con las experiencias descritas en la pregunta. Me pregunto si esto se debe a la versión de Android diferentes (5.0 vs 5.0.1) o debido al uso de pinning de pantalla manual en lugar de la programación de pinning de pantalla …

En mi configuración de prueba, pude resolver el problema (es decir, evitar que la actividad se desencolle automáticamente) mediante el uso del sistema de despacho de primer plano para registrar la actividad para recibir su mensaje NDEF:

En su método onResume() cree una intención pendiente como esta y habilite el envío de primer plano:

 PendingIntent pi = this.createPendingResult(0x00A, new Intent(), 0); nfcAdapter.enableForegroundDispatch(this, pi, null, null); 

A continuación, recibirá las intenciones de notificarle sobre las etiquetas descubiertas a través del método onActivityResult() la actividad:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 0x00A: onNewIntent(data); break; } } 

Por otra parte, tiene que deshabilitar el envío de primer plano en su método onPause() :

 nfcAdapter.disableForegroundDispatch(this); 
  • ACR122U - Leer los datos NFC enviados desde el teléfono Android
  • La detección de etiquetas NFC no llama aNewIntent y está iniciando desde la actividad principal
  • Escribir etiquetas NFC para que funcione con Android y Windows Phone8
  • Enviar URL desde Android a Windows Phone a través de NFC da enlace a Play Store
  • Comunicación P2P NFC entre Galaxy S3 y ACR122
  • ¿Cómo puede mi aplicación averiguar qué modo NFC está habilitado?
  • ¿Cómo encuesta de Android para dispositivos NFC
  • Cómo permitir sólo la interacción NFC con dispositivos que tienen la misma aplicación / actividad en ejecución
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.