Подтвердить что ты не робот

Как узнать, какое намерение выбрано в Intent.ACTION_SEND?

Я хочу использовать Android Intent.ACTION_SEND для быстрого обмена чем-то. Итак, я получил список разделов следующим образом: Sharing intent list

Но я хочу разделить разные материалы для каждого действия, например:

  • При совместном использовании электронной почты /Gmail содержимое должно быть "Share by email".

  • Если вы используете Facebook, контент должен быть "Share by Facebook".

Итак, можно ли это сделать?

4b9b3361

Ответ 1

Вы не можете получить такую ​​информацию.

Если вы не создадите собственную реализацию диалога для выбора активности.

Чтобы создать такой диалог, вам нужно использовать PackageManager и его функцию queryIntentActivities(). Функция возвращает List<ResolveInfo>.

ResolveInfo содержит некоторую информацию о деятельности (resolveInfo.activityInfo.packageName), а с помощью PackageManager вы можете получить другую информацию (полезную для отображения активности в диалоговом окне) - ярлык приложения, ярлык приложения...

Отображение результатов в списке в диалоговом окне (или в виде действия в виде диалога). Когда элемент щелкнут, создайте новый Intent.ACTION_SEND, добавьте нужное содержимое и добавьте пакет выбранного действия (intent.setPackage(pkgName)).

Ответ 2

Нет прямого метода доступа к такой информации....

Шаг 1: Внутри вашего кода в первую очередь вам нужно объявить адаптер, который будет содержать ваш пользовательский вид списка, который будет использоваться совместно...

//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();

Шаг 2. Теперь вы создали надувной макет для своего адаптера (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

Шаг 3: Создайте свой тип макета xml для отображения списка в диалоговом окне (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

Ответ 3

Не уверен, что вы все еще ищете ответ, но ClickClickClack имеет пример реализации того, как вы можете перехватить намерение ACTION_SEND и выбрать на основе имени пакета и некоторых характеристик, что в итоге происходит. В этом состоит большинство шагов, упомянутых Томиком.

http://clickclickclack.wordpress.com/2012/01/03/intercepting-androids-action_send-intents/

Один мощный аспект этой реализации - вы можете добавить аналитику к своим вызовам.

Ответ 4

Использование Tomik great Отвечать Я могу создать свой собственный пользовательский общий список с помощью PackageManager loadLabel и 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()));
        }
    }

}