2011-09-21 19 views
19

Desidero utilizzare Android Intent.ACTION_SEND per condividere rapidamente qualcosa. Così ho preso un elenco di condivisione come questo: Sharing intent listCome sapere quale intento è selezionato in Intent.ACTION_SEND?

Ma voglio condividere contenuti diversi per ogni azione, come ad esempio:

  • Se la condivisione via e-mail/Gmail, il contenuto deve essere "Condividi via email ".

  • Se la condivisione da Facebook, il contenuto deve essere "Condividi su Facebook".

Quindi, è possibile farlo?

+0

dov'è il problema? si invia l'intento in base all'elemento cliccato ?! dov'è il problema –

+0

ah, voglio dire come posso sapere quale Intent è selezionato per eseguire un'azione di condivisione? – anticafe

+0

così male, secondo http://stackoverflow.com/questions/6137592/how-to-know-the-action-choosed-in-a-intent-createchooser e http://stackoverflow.com/questions/4417019/ how-to-get-the-user-selection-from-startactivityforresultintent-createchooserfi, non riesco a trovare l'intento che l'utente sceglie. – anticafe

risposta

26

Non è possibile ottenere tali informazioni.

A meno che non si crei la propria implementazione della finestra di dialogo per la selezione delle attività.

Per creare tale finestra di dialogo è necessario utilizzare PackageManager e la sua funzione queryIntentActivities(). La funzione restituisce List<ResolveInfo>.

ResolveInfo contiene alcune informazioni su un'attività (resolveInfo.activityInfo.packageName), e con l'aiuto di PackageManager è possibile ottenere altre informazioni (utile per visualizzare l'attività nella finestra di dialogo) - icona dell'applicazione disegnabile, etichetta applicazione, ....

Visualizza i risultati in un elenco in una finestra di dialogo (o in un'attività definita come finestra di dialogo). Quando viene fatto clic su un elemento, crea un nuovo Intent.ACTION_SEND, aggiungi il contenuto desiderato e aggiungi il pacchetto dell'attività selezionata (intent.setPackage(pkgName)).

5

Non sono sicuro se si sta ancora cercando una risposta, ma ClickClickClack ha un'implementazione di esempio di come è possibile intercettare l'intento ACTION_SEND e scegliere il nome del pacchetto in base al fuori e alcune caratteristiche che cosa succede. In coinvolge la maggior parte dei passaggi menzionati da Tomik.

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

Un aspetto potente su questa implementazione è che si può aggiungere di analisi per le chiamate.

+0

questo è una brillante implementazione – TomaszRykala

11

Non c'è metodo diretto per accedere a tali tipo di informazione ....

Fase 1: Dentro il codice prima di tutto è necessario dichiarare un adattatore che conterrà la visualizzazione personalizzata di lista per essere condivisi su ...

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

Fase 2: Ora avete creare un gonfiatore di layout per la scheda (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 

Passaggio 3: Crea il tuo XML di layout ty pe per mostrare la visualizzazione elenco nella finestra di dialogo (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 
+0

Si consiglia inoltre di modificare alert.show() per essere circondato da un IF per evitare più clic. if (! alert.isShowing()) {alert.show(); } – jmnwong

1

Utilizzando Tomik grande risposta io sono in grado di produrre la mia lista quota personalizzato utilizzando PackageManager loadLabel e 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())); 
     } 
    } 

} 
Problemi correlati