android sharingIntent用于不同的动作

时间:2013-02-15 17:20:43

标签: android android-intent share

对于以下shareIntent:

Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);         
sharingIntent.setType("text/plain");
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
startActivity(Intent.createChooser(sharingIntent, "to share this!"));   

该应用程序将弹出具有共享功能的应用程序列表:

我想问一下,如果客户选择例如,是否可以编码。 whatsapp或短信它会做行动A,但如果客户选择Facebook,它会做行动B?

谢谢!

3 个答案:

答案 0 :(得分:1)

您正在寻找的内容类似于使用startActivityForResult(),并希望目标应用程序设置结果,以便您可以在Intent data

中收到有意义的onActivityResult
protected void onActivityResult(int requestCode, int resultCode, Intent data){}

然而;遗憾的是,可靠,并且不适用于大多数应用。

我使用多种应用进行了测试,包括短信,Google +,Facebook,Gmail和ColorNote;对于所有这些人我在我的data=nulll onActivityResult获得ColorNote除了Intent data我获得有效的content://note.socialnmobile.provider.colornote/notes/41 {{1}}

所以它真的取决于目标应用程序,并且没有其他可靠的方法我知道允许您的应用知道用户选择哪个应用程序来共享数据。

答案 1 :(得分:1)

以下是我之前做过的分享选项的一个例子

更新:

public class CustomShareDialogActivity extends Activity {

private ArrayList< AppToSendOption > appsOptions = new ArrayList< AppToSendOption >();

@Override
protected void onCreate( Bundle arg0 ) {
    super.onCreate( arg0 );
    setContentView( R.layout.show_share_dialog );
    final Button button = (Button)findViewById( R.id.button1 );
    button.setOnClickListener( new View.OnClickListener() {

        @Override
        public void onClick( View v ) {
            getListOfShareApps();
            showShareDialog();              
        }
    } );

}

private void getListOfShareApps() {
    if( !appsOptions.isEmpty() ){ return; }

    Intent sendOption = new Intent();
    sendOption.setType( "application/*" );
    sendOption.setAction( Intent.ACTION_SEND_MULTIPLE );
    List< ResolveInfo > ris = getPackageManager().queryIntentActivities( sendOption, 0 );

    for ( ResolveInfo ri : ris ) {
        Drawable icon = ri.loadIcon( getPackageManager() );
        String appname = ( String ) ri.loadLabel( getPackageManager() );
        String packagename = ri.activityInfo.packageName;
        String classname = ri.activityInfo.name;
        appsOptions.add( new AppToSendOption( icon, appname, packagename, classname ) );
    }
}

private void showShareDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder( this );
    ArrayAdapter< AppToSendOption > adapter01 = new SendOptionsAdapter( this, appsOptions );
    builder.setTitle( "Options" )
            .setSingleChoiceItems( adapter01, -1, new OnClickListener() {

        @Override
        public void onClick( DialogInterface dialog, int which ) {
            AppToSendOption app = appsOptions.get( which );
            String packagename = app.getPackagename();
            String classname = app.getClassname();
            // Right here, check the package name to see which app is selected, and do the appropriate
            // action.
            Toast.makeText( getApplicationContext(), packagename + ", " + classname, Toast.LENGTH_SHORT).show();
            dialog.dismiss();
        }
    } ).setNegativeButton( "Cancel", null ).show();

}

private class AppToSendOption {

    Drawable icon;
    String appname;
    String packagename;
    String classname;

    public AppToSendOption( Drawable icon, String appname, String packagename, String classname ) {
        this.icon = icon;
        this.appname = appname;
        this.packagename = packagename;
        this.classname = classname;
    }

    Drawable getIcon() {
        return icon;
    }

    String getAppname() {
        return appname;
    }

    String getPackagename() {
        return packagename;
    }

    String getClassname() {
        return classname;
    }
}

public class SendOptionsAdapter extends ArrayAdapter< AppToSendOption > {
    private List< AppToSendOption > apps;
    private LayoutInflater inflater;
    private static final int RESOURCE = R.layout.send_option_dialog;

    class ViewHolder {
        TextView text;
        ImageView icon;
    }

    public SendOptionsAdapter( Context context, List< AppToSendOption > objects ) {
        super( context, RESOURCE, objects );
        inflater = LayoutInflater.from( context );
        apps = objects;
    }

    @Override
    public View getView( int position, View convertView, ViewGroup parent ) {
        ViewHolder holder;
        if ( convertView == null ) {
            holder = new ViewHolder();
            convertView = inflater.inflate( RESOURCE, null );
            holder.text = ( TextView ) convertView.findViewById( R.id.textView_appname );
            holder.text.setTextColor( Color.BLACK );
            holder.icon = ( ImageView ) convertView.findViewById( R.id.imageView_appicon );
            holder.icon.setAdjustViewBounds( true );
            holder.icon.setScaleType( ScaleType.CENTER_INSIDE );
            convertView.setTag( holder );
        } else {
            holder = ( ViewHolder ) convertView.getTag();
        }
        holder.icon.setImageDrawable( apps.get( position ).getIcon() );
        holder.text.setText( apps.get( position ).getAppname() );

        return convertView;
    }
}


}

这是send_option_dialog的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<ImageView
    android:id="@+id/imageView_appicon"
    android:layout_width="42dp"
    android:layout_height="42dp"
    android:layout_gravity="center"
    android:layout_marginBottom="15dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="5dp"
    android:layout_marginTop="15dp" >
</ImageView>

<TextView
    android:id="@+id/textView_appname"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginLeft="2dp"
    android:lines="1"
    android:textColor="#fff"
    android:textSize="20sp" >
</TextView>

这不完美,您可以考虑使用DialogFragment,但希望这会让您了解如何创建对话框。

答案 2 :(得分:0)

  

我想问一下,如果客户选择例如,是否可以编码。 whatsapp或短信它会做行动A,但如果客户选择Facebook,它会做行动B?

不,有两个原因:

  1. Intent只有一个操作,而startActivity()(和createChooser())只占用一个Intent

  2. 没有“whatsapp”。没有“短信”。没有“Facebook”。有些应用程序具有不同的软件包名称,您无法可靠地确定特定软件包名称是“whatsapp”,“SMS”还是“Facebook”。例如,有数百个(如果不是数千个)SMS客户端。

  3. 如果您想允许用户共享多种类型的内容(例如,短字符串或长字符串),请让用户选择要共享的内容。如果用户希望使用带有Facebook的短字符串而不是更长的字符串,那就是用户的决定,而不是你的。