3

对于以下 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 或 SMS 它会执行 Action A,但如果客户选择 Facebook,它会执行 Action B?

谢谢!

4

3 回答 3

1

您正在寻找的是类似于 usingstartActivityForResult()并希望目标应用程序将设置结果,以便您可以收到有意义Intent dataonActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data){}

然而; 不幸的是,这并不可靠,并且不适用于大多数应用程序。

我已经用包括 SMS、Google+、Facebook、Gmail 和 ColorNote 在内的多个应用程序对其进行了测试;对于他们所有人,我都进入data=nulll了我的状态,onActivityResult除了ColorNote我得到了一个有效Intent data的动作,比如content://note.socialnmobile.provider.colornote/notes/41

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

于 2013-02-15T18:11:56.573 回答
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,但希望这会给您提供如何创建对话框的想法。

于 2013-02-15T18:18:33.213 回答
0

我想问是否可以以客户选择的方式进行编码,例如。whatsapp 或 SMS 它会执行 Action A,但如果客户选择 Facebook,它会执行 Action B?

不,有两个原因:

  1. AnIntent只有一个动作,并且startActivity()(和createChooser())只采取一个Intent

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

如果您希望允许用户共享多种类型的内容(例如,短字符串或长字符串),请让用户选择要共享的内容。如果用户希望在 Facebook 中使用短字符串而不是较长的字符串,那是用户的决定,而不是您的决定。

于 2013-02-15T17:33:39.817 回答