android - putextra - ¿Cómo saber qué intento se selecciona en Intent.ACTION_SEND?
intentfilter android (4)
Con la gran respuesta de Tomik, puedo crear mi propia lista de recursos compartidos personalizada utilizando PackageManager loadLabel y LoadIcon:
public class MainActivity extends FragmentActivity
{
ArrayList<Drawable> icons;
ArrayList<String> labels;
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
setContentView(R.layout.activity_main);
icons=new ArrayList<Drawable>();
labels=new ArrayList<String>();
PackageManager manager=getPackageManager();
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
List<ResolveInfo> activities=manager.
queryIntentActivities(intent,0);
for(int i=0;i<activities.size();i++)
{
ApplicationInfo appInfo=null;
try {
appInfo=manager.getApplicationInfo(activities.get(i).activityInfo.packageName,0);
labels.add(name=appInfo.loadLabel(getPackageManager()).toString());
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
icons.add(appInfo.loadIcon(getPackageManager()));
}
}
}
Quiero usar Android Intent.ACTION_SEND para compartir algo rápidamente. Así que tengo una lista para compartir como esta:
Pero quiero compartir contenido diferente para cada acción, como:
Si se comparte por correo electrónico / Gmail, el contenido debe ser "Compartir por correo electrónico".
Si se comparte por Facebook, el contenido debe ser "Compartir por Facebook".
Entonces, ¿es posible hacer eso?
No estoy seguro si todavía está buscando una respuesta, pero ClickClickClack tiene una implementación de ejemplo de cómo puede interceptar la intención de ACTION_SEND y elegir el nombre del paquete basado en ciertas características y ciertas características que terminan sucediendo. En implica la mayoría de los pasos mencionados por Tomik.
http://clickclickclack.wordpress.com/2012/01/03/intercepting-androids-action_send-intents/
Un aspecto poderoso de esta implementación es que puede agregar análisis a sus llamadas.
No hay un método directo para acceder a este tipo de información ...
Paso 1: En primer lugar, dentro de su código, debe declarar un adaptador que contendrá su vista personalizada de la lista para compartir en ...
//sharing implementation
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
// what type of data needs to be send by sharing
sharingIntent.setType("text/plain");
// package names
PackageManager pm = getPackageManager();
// list package
List<ResolveInfo> activityList = pm.queryIntentActivities(sharingIntent, 0);
objShareIntentListAdapter = new ShareIntentListAdapter(CouponView.this,activityList.toArray());
// Create alert dialog box
AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
builder.setTitle("Share via");
builder.setAdapter(objShareIntentListAdapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
ResolveInfo info = (ResolveInfo) objShareIntentListAdapter.getItem(item);
// if email shared by user
if(info.activityInfo.packageName.contains("Email")
|| info.activityInfo.packageName.contains("Gmail")
|| info.activityInfo.packageName.contains("Y! Mail")) {
PullShare.makeRequestEmail(COUPONID,CouponType);
}
// start respective activity
Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setClassName(info.activityInfo.packageName, info.activityInfo.name);
intent.setType("text/plain");
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, ShortDesc+" from "+BusinessName);
intent.putExtra(android.content.Intent.EXTRA_TEXT, ShortDesc+" "+shortURL);
intent.putExtra(Intent.EXTRA_TITLE, ShortDesc+" "+shortURL);
((Activity)context).startActivity(intent);
}// end onClick
});
AlertDialog alert = builder.create();
alert.show();
Paso 2: Ahora has creado un diseño de inflado para tu adaptador (ShareIntentListAdapter.java)
package com.android;
import android.app.Activity;
import android.content.pm.ResolveInfo;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class ShareIntentListAdapter extends ArrayAdapter{
private final Activity context;
Object[] items;
public ShareIntentListAdapter(Activity context,Object[] items) {
super(context, R.layout.social_share, items);
this.context = context;
this.items = items;
}// end HomeListViewPrototype
@Override
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.social_share, null, true);
// set share name
TextView shareName = (TextView) rowView.findViewById(R.id.shareName);
// Set share image
ImageView imageShare = (ImageView) rowView.findViewById(R.id.shareImage);
// set native name of App to share
shareName.setText(((ResolveInfo)items[position]).activityInfo.applicationInfo.loadLabel(context.getPackageManager()).toString());
// share native image of the App to share
imageShare.setImageDrawable(((ResolveInfo)items[position]).activityInfo.applicationInfo.loadIcon(context.getPackageManager()));
return rowView;
}// end getView
}// end main onCreate
Paso 3: Cree su tipo de diseño xml para mostrar la vista de lista en el cuadro de diálogo (social_share.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/categoryCell"
android:layout_width="match_parent"
android:layout_height="30dip"
android:background="@android:color/white" >
<TextView
android:id="@+id/shareName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginBottom="15dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="15dp"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#000000"
android:textStyle="bold" />
<ImageView
android:id="@+id/shareImage"
android:layout_width="35dip"
android:layout_height="35dip"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:contentDescription="@string/image_view" />
</RelativeLayout>
// vKj
No se puede obtener dicha información.
A menos que cree su propia implementación del diálogo para la selección de la actividad.
Para crear dicho cuadro de diálogo, debe utilizar PackageManager
y su función queryIntentActivities()
. La función devuelve List<ResolveInfo>
.
ResolveInfo
contiene cierta información sobre una actividad ( resolveInfo.activityInfo.packageName
), y con la ayuda de PackageManager
puede obtener otra información (útil para mostrar la actividad en el cuadro de diálogo): icono dibujable de la aplicación, etiqueta de la aplicación, ....
Muestre los resultados en una lista en un diálogo (o en una actividad con el estilo de diálogo). Cuando se haga clic en un elemento, cree un nuevo Intent.ACTION_SEND, agregue el contenido que desee y agregue el paquete de la actividad seleccionada ( intent.setPackage(pkgName)
).