¿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.
- Modo NFC Peer2Peer - Android Beam - ISO 18092
- NFC: ¿Cuál es la diferencia entre S-beam y Android beam?
- ¿Cómo podría comprobar si un dispositivo Android es compatible con SNEP o Android Ndef Push Protocol?
- Android Beam: inicia la aplicación con registro de tipo MIME
- Android NFC: protocolo SNEP y respuesta P2P
¿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>
- Android responde a PN532 InListPassiveTarget
- Cómo recibir un archivo usando NFC (Android Beam) en Android
- El diálogo de progreso no se muestra en la pantalla
- ACS ACR122 SDK Android Peer-to-Peer apoyo?
- ¿Cómo instalar Open NFC Simulator para Android?
- Lector de tarjetas NFC ACR 122 incompatible con Android 4.1 Jelly Beans?
- No se pueden enviar datos desde o hacia un Galaxy Nexus a través de LLCP
- Hacer NFC / Beam más automático
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);