web-dev-qa-db-ja.com

Androidで共有意図をカスタマイズする方法は?

これで、共有インテントを使用して共有ダイアログを開くことができます

    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_TEXT, link);  
    startActivity(Intent.createChooser(intent, "Share with"));

ダイアログが表示されないようにして、たとえば1つのソーシャルネットワーク(FBまたはTwitter)と直接共有する必要があります

それを行う方法のアドバイスはありますか?

28
Zak

いいえ、できません。インテントはこのように動作するはずです。特定のアプリを強制的に開く必要がある場合、ターゲットアプリがそれらをサポートしている場合は、明示的なインテントを使用します。ターゲットアプリのパッケージ名またはコンポーネント名、またはデータのタイプまたはMIMEタイプを知らなければ、特定のアプリに強制的に一般化されたインテントを処理させることはできません。

7
Kumar Bibek

目的のインテントを直接開く方法があります。インテントのリストを取得して、1つだけを開くことができます。

このコードを参照してください:

private void initShareIntent(String type) {
    boolean found = false;
    Intent share = new Intent(Android.content.Intent.ACTION_SEND);
    share.setType("image/jpeg");

    // gets the list of intents that can be loaded.
    List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(share, 0);
    if (!resInfo.isEmpty()){
        for (ResolveInfo info : resInfo) {
            if (info.activityInfo.packageName.toLowerCase().contains(type) || 
                    info.activityInfo.name.toLowerCase().contains(type) ) {
                share.putExtra(Intent.EXTRA_SUBJECT,  "subject");
                share.putExtra(Intent.EXTRA_TEXT,     "your text");
                share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(myPath)) ); // Optional, just if you wanna share an image.
                share.setPackage(info.activityInfo.packageName);
                found = true;
                break;
            }
        }
        if (!found)
            return;

        startActivity(Intent.createChooser(share, "Select"));
    }
}

Twitterを開きたい場合は、次のようにします。

initShareIntent("twi");

facebookの場合:

initShareIntent("face");

メールの場合:

initShareIntent("mail"); // or "gmail"

タイプに一致するインテントのリストを表示したい場合は、最初のマッハを使用するつもりで、この投稿を参照してください: AndroidアプリケーションのTwitterアプリケーション

79
Derzu

まず、共有するすべてのアプリをリストします。

private Java.util.List<ResolveInfo> showAllShareApp() {
    Java.util.List<ResolveInfo> mApps = new ArrayList<ResolveInfo>();
    Intent intent = new Intent(Intent.ACTION_SEND, null);
    intent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
    intent.setType("text/plain");
    PackageManager pManager = getPackageManager();
    mApps = pManager.queryIntentActivities(intent,
            PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
    return mApps;
}

次に、1つ選択します

    private void share(ResolveInfo appInfo) {
        Intent sendIntent = new Intent();
        sendIntent.setAction(Intent.ACTION_SEND);
        sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
        if (appInfo != null) {
            sendIntent
                    .setComponent(new ComponentName(
                            appInfo.activityInfo.packageName,
                            appInfo.activityInfo.name));
        }
        sendIntent.setType("text/plain");
//        startActivity(Intent.createChooser(sendIntent, "Share"));
        startActivity(sendIntent);
    }

ここにサンプルプロジェクトがあります

4
BruceDu

ACTION_SENDTOを使用して、すべてのメールクライアントを取得できます

        Intent getMailClients = new Intent(Intent.ACTION_SENDTO);
        getMailClients.setData(Uri.parse("mailto:"));
        final PackageManager pm = this.getPackageManager();
        final List<ResolveInfo> emailsClients = pm.queryIntentActivities(getMailClients, 0);

        if (emailsClients.size() == 0) {
            Toast.makeText(this, "There are no email clients installed", Toast.LENGTH_LONG).show();
            return;
        }

次に、独自のチューザー(作成したアプリのリストを含むダイアログ)を作成します。ユーザーがアイテムをクリックすると、このような操作を実行できます。

        Intent sendMailIntent = new Intent(Intent.ACTION_SEND);
        sendMailIntent.setType(some type like text/plain or other you need);
        ...
        there you can set SUBJECT,EMAILTO, attach files
        ...
        final List<ResolveInfo> matches = pm.queryIntentActivities(sendMailIntent, 0);
        ResolveInfo sendingProgramm = null;
        for (final ResolveInfo info : matches) {
            if (info.activityInfo.packageName.equals(clickedResolveInfo.activityInfo.packageName)) {
                sendingProgramm = info;
                sendMailIntent
                        .setClassName(sendingProgramm.activityInfo.packageName, sendingProgramm.activityInfo.name);
                break;
            }
        }
        startActivity(sendMailIntent);

多分それはあなたを助けるでしょう。

1