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 はアクション A を実行しますが、顧客が Facebook を選択した場合はアクション B を実行しますか?

ありがとう!

4

3 に答える 3

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 に答える
1

あなたが探しているのは、使用するようなものであり、ターゲットアプリケーションが結果を設定して、意味のstartActivityForResult()ある結果を受け取ることができることを願っていますIntent dataonActivityResult

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

でも; 残念ながら、これは信頼性が低く、ほとんどのアプリでは機能しません。

SMS、Google+、Facebook、Gmail、ColorNote などの複数のアプリでテストしました。そして、それらすべてについて、次のようなアクションで有効になっているものを除いてdata=nulll、私は自分の中に入っていますonActivityResultColorNoteIntent datacontent://note.socialnmobile.provider.colornote/notes/41

したがって、それは実際にはターゲットアプリケーションに依存し、ユーザーがデータを共有するために選択したアプリケーションをアプリが認識できるようにする信頼できる方法は他にありません。

于 2013-02-15T18:11:56.573 に答える
0

顧客が選択した場合などの方法でコーディングすることが可能かどうかを尋ねたいと思います。whatsapp または SMS はアクション A を実行しますが、顧客が Facebook を選択した場合はアクション B を実行しますか?

いいえ、次の 2 つの理由からです。

  1. AnIntentは 1 つのアクションしか持たず、startActivity()(およびcreateChooser()) は 1 つしか取りませんIntent

  2. 「whatsapp」はありません。「SMS」はありません。「フェイスブック」はありません。さまざまなパッケージ名を持つアプリがあり、特定のパッケージ名が「whatsapp」か「SMS」か「Facebook」かを確実に判断する方法はありません。たとえば、SMS クライアントは、数千とは言わないまでも数百あります。

ユーザーが複数の種類のもの (たとえば、短い文字列または長い文字列) を共有できるようにする場合は、何を共有するかをユーザーが選択できるようにします。ユーザーが Facebook で長い文字列の代わりに短い文字列を使用したい場合、それはユーザーの決定であり、あなたの決定ではありません。

于 2013-02-15T17:33:39.817 に答える