permisos - En Android M, ¿cómo configurar las capacidades de "compartir directamente"(imagen, texto) y cómo consultar los elementos?
multiples permisos android studio (2)
Tengo una comprensión diferente de este futuro.
Hasta ahora, cuando el usuario quería compartir algo, se le pedía que eligiera la aplicación con la que desea compartir, y luego esta aplicación manejaba el recurso compartido.
Ahora, en lugar de que el usuario elija la aplicación, elegirá el contenido de la aplicación que manejará el recurso compartido. Cada una de esas opciones está encapsulada en android.service.chooser.ChooserTargetService
.
Como ve en la imagen, muestra algunos productos de ChooserTargetService
, el usuario ve algunos contactos sin almorzar o compartir por el momento.
Creo que su diálogo podría activarse de la misma manera.
Fondo
Según una nueva función en Android M (enlace aquí ), las aplicaciones externas a su aplicación pueden ofrecer una intención de compartir directa a una de sus actividades, permitiendo, por ejemplo, una aplicación de chat para compartir el contenido a un contacto exacto, para que pueda elija tanto la aplicación de chat como el contacto al mismo tiempo (un paso en lugar de 2). Esto se puede mostrar en esta imagen:
O, al menos eso es lo que he entendido por eso.
La pregunta
Tengo 2 preguntas con respecto a esta nueva característica:
En la descripción, solo muestran qué incluir en el manifiesto, y mencionan el uso de "ChooserTargetService". ¿Qué se debe hacer para proporcionar los textos y las imágenes?
Me gustaría saber cómo hacer lo contrario: ¿cómo puedo consultar todos los elementos de "compartir directamente" (imágenes, textos e intenciones) y ser capaz de mostrarlos en un cuadro de diálogo personalizado?
Quiero hacerlo porque tengo un diálogo personalizado, que permite elegir qué compartir y cómo, y no solo a través de qué aplicación.
Pregunta 1
En la descripción, solo muestran qué incluir en el manifiesto, y mencionan el uso de "ChooserTargetService". ¿Qué se debe hacer para proporcionar los textos y las imágenes?
Comience por extender ChooserTargetService
. Deberá devolver una List
de ChooserTarget
y la forma de crear esos objetivos depende exclusivamente de usted.
public class YourChooserTargetService extends ChooserTargetService {
@Override
public List<ChooserTarget> onGetChooserTargets(ComponentName targetActivityName, IntentFilter matchedFilter) {
final List<ChooserTarget> targets = new ArrayList<>();
for (int i = 0; i < length; i++) {
// The title of the target
final String title = ...
// The icon to represent the target
final Icon icon = ...
// Ranking score for this target between 0.0f and 1.0f
final float score = ...
// PendingIntent to fill in and send if the user chooses this target
final PendingIntent action = ...
targets.add(new ChooserTarget(title, icon, score, action));
}
return targets;
}
}
AndroidManifest
Ahora deberá declarar su ChooserTargetService
en su AndroidManifest
y hacer dos cosas:
- Enlace el
Service
utilizando el permisoandroid.permission.BIND_CHOOSER_TARGET_SERVICE
- Incluye un
IntentFilter
con la acciónandroid.service.chooser.ChooserTargetService
Por ejemplo:
<service
android:name=".YourChooserTargetService"
android:label="@string/yourLabel"
android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
<intent-filter>
<action android:name="android.service.chooser.ChooserTargetService" />
</intent-filter>
</service>
En la Activity
que manejará la Intent
, deberá agregar la etiqueta de meta-data
android.service.chooser.chooser_target_service
. Por ejemplo:
<activity android:name=".YourShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<meta-data
android:name="android.service.chooser.chooser_target_service"
android:value=".YourChooserTargetService" />
</activity>
A partir de aquí, es principalmente una cuestión de llamar a Intent.createChooser
y luego manejar los datos si el usuario elige su aplicación.
final Intent target = new Intent(Intent.ACTION_SEND);
target.setType("text/plain");
target.putExtra(Intent.EXTRA_TITLE, "Your title");
target.putExtra(Intent.EXTRA_TEXT, "Your text");
startActivity(Intent.createChooser(target, "ChooserTargetService Example"));
Resultados
Cosas para notar
El puntaje de clasificación para cada ChooserTarget
se usa para ordenar los objetivos, pero solo se usa si la UI decide usarlo. Según ChooserTarget.getScore
La interfaz de usuario que muestra el objetivo puede tener en cuenta este puntaje cuando clasifique y combine objetivos de múltiples fuentes
Además, hasta donde yo sé, esta función aún no está implementada en la vista previa de Android MNC. El ChooserActivity
contiene un TODO
para ello:
TODO: Mantener orden por puntajes de clasificación
Al crear un nuevo android.graphics.drawable.Icon
, necesitará usar uno de los inicializadores static
.
Icon.createWithBitmap();
Icon.createWithContentUri()
Icon.createWithData()
Icon.createWithFilePath()
Icon.createWithResource()
Pregunta 2
Me gustaría saber cómo hacer lo contrario: ¿cómo puedo consultar todos los elementos de "compartir directamente" (imágenes, textos e intenciones) y ser capaz de mostrarlos en un cuadro de diálogo personalizado?
Los datos suministrados a ChooserTargetService.onGetChooserTargets
son dinámicos. Entonces, no hay una forma directa de acceder a esos artículos, hasta donde yo sé.