Obtener la aplicación seleccionada de Intent.createChooser

Estoy intentando capturar el resultado de Intent.createChooser para saber qué aplicación seleccionó un usuario para compartir.

Sé que ha habido un montón de mensajes relacionados con esto:

  • ¿Cómo saber qué aplicación escogió el usuario al usar un selector de intenciones?
  • Https://stackoverflow.com/questions/6137592/how-to-know-the-action-choosed-in-a-intent-createchooser?rq=1
  • Cómo obtener la selección de usuario de startActivityForResult (Intent.createChooser (fileIntent, "Abrir archivo utilizando …"), APP_PICKED) ;?
  • Captura e interceptación de ACTION_SEND intents en Android

Pero estos puestos son algo antiguos, y espero que pueda haber algunos nuevos desarrollos.

Estoy tratando de implementar una acción compartida sin tenerla presente en el menú. La solución más cercana a lo que quiero es proporcionada por ClickClickClack que sugieren la implementación de un selector de aplicaciones personalizadas, pero que parece pesado. Además, parece que podría haber algunos ganchos de Android para obtener la aplicación elegida, como ActivityChooserModel.OnChooseActivityListener .

Tengo el código siguiente en mi MainActivity, pero el método onShareTargetSelected nunca se llama.

  Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, shareMessage()); sendIntent.setType("text/plain"); Intent intent = Intent.createChooser(sendIntent, getResources().getText(R.string.share_prompt)); ShareActionProvider sap = new ShareActionProvider(this); sap.setShareIntent(sendIntent); sap.setOnShareTargetSelectedListener(new ShareActionProvider.OnShareTargetSelectedListener() { @Override public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) { System.out.println("Success!!"); return false; } }); startActivityForResult(intent, 1); 

A partir del nivel API 22 ahora es realmente posible. En Android 5.1 se createChooser (Intent target, CharSequence title, IntentSender sender) un método ( createChooser (Intent target, CharSequence title, IntentSender sender) ) que permite recibir los resultados de la elección del usuario. Cuando proporciona un IntentSender para createChooser , el remitente será notificado por el diálogo del selector con el ComponentName elegido por el usuario. Se proporcionará en el extra llamado EXTRA_CHOSEN_COMPONENT int el IntentSender que se notifica .

Estoy intentando capturar el resultado de Intent.createChooser para saber qué aplicación seleccionó un usuario para compartir.

Eso no es posible.

Otras soluciones de "elección", como ShareActionProvider , pueden ofrecer más. No he examinado la Intent entregada a onShareTargetSelected() para ver si contiene el ComponentName del destino elegido, aunque los documentos sugieren que debería.

Y, si por alguna razón no lo hace, le invitamos a intentar fork ShareActionProvider para agregar los ganchos que desea.

La razón por la cual createChooser() no se puede manejar de esta manera es simplemente porque la "elección" se está haciendo por un proceso separado del tuyo.

Tengo el código siguiente en mi MainActivity, pero el método onShareTargetSelected nunca se llama.

ShareActionProvider va en la barra de acción. No se puede crear una instancia, llamar a un par de setters y esperar que algo suceda.

  • ¿Qué es el modo de selección de selección modal?
  • Android: Cómo obtener la posición del texto desde el evento táctil
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.