¿Cómo pasar la intención de Android a nadie más que a mi propia aplicación?
Tengo una cierta intención ( NDEF_DISCOVERED
), algunos de los cuales no puedo manejar correctamente, así que quiero redirigir a los que el controlador nfc por defecto de android.
Así que tomo la intención, setComponent(null)
, y luego startActivity(intent)
- Cómo obtener ayuda para el lector Emulación de tarjeta basada en host
- Cómo almacenar datos en Secure Element en android
- Emulación de tarjeta NFC de Android con UID fijo
- "Nueva etiqueta recopilada" en lugar de leer etiquetas de aplicación - NFC android
- ACS ACR122 SDK Android Peer-to-Peer apoyo?
Pero .. siempre vuelve a mi aplicación en un bucle infinito de lanzamiento intencional.
¿Hay alguna manera de enviar una intención a alguien, excepto a mi aplicación? ¿O enviarlo al controlador nfc predeterminado de android?
EDIT: Así que utilicé la respuesta de vikram para consultar al gestor de paquetes de posibles actividades para manejar mi intención, luego realizar un bucle y encontrar la actividad con la máxima prioridad (quién no soy yo) y envió una intención explícita a ellos.
- NFC: ¿Cuál es la diferencia entre S-beam y Android beam?
- Cómo utilizar NFC API con google chrome para android
- NfcAdapter.getDefaultAdapter devuelve null, cuando se inicia la aplicación android en BOOT_COMPLETED intención
- Servicio de inicio de Android NFC
- Cómo enviar una cadena simple de android a android sobre nfc?
- ¿Cómo puedo enviar un mensaje de HostApduService a una actividad?
- Comunicación NFC de Android con Mifare DESFire EV1
- Error de suma de comprobación al aprovisionar Android Lollipop
Un cuadro de diálogo / popup de selector personalizado será mejor para usted en este caso. En lugar de iniciar una intención, utilice PackageManager
para queryIntentActivities(Intent, int)
. Desde la List<ResolveInfo>
que queryIntentActivities(Intent, int)
devuelve, filtre su propia aplicación usando el nombre de packageName
:
String packageName = ""; for(ResolveInfo resInfo : resolvedInfoList) { packageName = resInfo.activityInfo.applicationInfo.packageName; // Exclude `packageName` from the dialog/popup that you show }
Editar 1 :
El código siguiente creará y mostrará un PopupWindow
siempre que se showList()
. El archivo de diseño xml utilizado para devolver popupView
contiene nada más que un LinearLayout
(R.layout.some_popup_view):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/llPopup" android:orientation="vertical" > </LinearLayout>
Este código es sólo una demostración simple. Para que sea algo cercano a utilizable, es probable que tenga que agregar un ListView
con un adaptador personalizado a este PopupWindow
. En OnClickListener
para ListView
, recuperará el nombre del paquete de la aplicación en la que el usuario hace clic y generará una intención para iniciar esa actividad. A partir de ahora, el código sólo muestra cómo filtrar su propia aplicación utilizando un selector personalizado. En el bloque if
, reemplace "com.example.my.package.name"
con el nombre del paquete de su aplicación.
public void showList() { View popupView = getLayoutInflater().inflate(R.layout.some_popup_view, null); PopupWindow popupWindow = new PopupWindow(popupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); LinearLayout llPopup = (LinearLayout) popupView.findViewById(R.id.llPopup); PackageManager pm = getPackageManager(); Intent intent = new Intent(); // In my case, NfcAdapter.ACTION_NDEF_DISCOVERED was not returning anything //intent.setAction(NfcAdapter.ACTION_NDEF_DISCOVERED); intent.setAction(NfcAdapter.ACTION_TECH_DISCOVERED); List<ResolveInfo> resolvedInfoList = pm.queryIntentActivities(intent, 0); String packageName = ""; for(ResolveInfo resInfo : resolvedInfoList) { packageName = resInfo.activityInfo.applicationInfo.packageName; // Exclude `packageName` from the dialog/popup that you show if (!packageName.equals("com.example.my.package.name")) { TextView tv = new TextView(this); tv.setText(packageName); llPopup.addView(tv); } } popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0); }
Hay también otra opción que hacer un selector propio aquí (selector de búsqueda diferente puede confundir al usuario)
public void rethrowIntentExcludingSelf() { final ComponentName component = new ComponentName(this, getClass()); this.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); final Intent intent = this.getIntent(); intent.setComponent(null); this.startActivity(intent); new android.os.Handler().postDelayed( new Runnable() { @Override public void run() { getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); } },250); }
Lo estoy usando – y funciona bien – simplemente no me gusta esta constante de magia 250 – pero no veo otra forma.
- ¿Cómo mostrar la notificación en la barra de estado?
- Cómo liberar jstring en un bucle correctamente?