¿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)

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.

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 probar api NFC?
  • Lectura de varias etiquetas NFC en Android. IsoDep-tag no leerá mientras la pantalla está desbloqueada
  • KitKat: Cómo enrutar las APDU a la tarjeta SIM
  • ¿Cuál es la tasa de bits de lectura NFC efectiva usando comandos de APDU?
  • HF-RFID vs. NFC - ¿Puede un teléfono móvil con capacidad NFC leer etiquetas RFID de alta frecuencia?
  • Mensaje "Tipo de etiqueta NFC no admitido"
  • Device Owner en Android 5.0 (y otros) sin dispositivos enraizados, aprovisionamiento de dispositivos por NFC
  • Activar un propietario de dispositivo con NFC en Android Lollipop
  • Cómo permitir sólo la interacción NFC con dispositivos que tienen la misma aplicación / actividad en ejecución
  • ¿Cómo leer y escribir las etiquetas NFC de Android?
  • ¿Es SDK para NFC lector / escritor acr122u dispositivo necesario para construir la aplicación de lectura / escritura?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.