web-dev-qa-db-fra.com

Comment personnaliser l'intention de partage dans Android?

Maintenant, je peux utiliser l'intention de partage pour ouvrir la boîte de dialogue de partage

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

mais j'ai besoin que la boîte de dialogue n'apparaisse pas et ne partage pas directement avec un réseau social par exemple (FB ou Twitter)

des conseils pour faire ça?

28
Zak

Non tu ne peux pas. Les intentions sont censées fonctionner de cette façon. Si vous devez forcer une application particulière à s'ouvrir, utilisez des intentions explicites si les applications cibles les prennent en charge. Sans connaître les noms de package ou les noms de composants des applications cibles, ou le type ou le type MIME de données, vous ne pouvez pas forcer une application particulière à travailler sur des intentions généralisées.

7
Kumar Bibek

Il existe un moyen d'ouvrir directement l'intention souhaitée. Vous pouvez obtenir la liste des intentions et n'en ouvrir qu'une seule.

Voir ce code:

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"));
    }
}

Si vous voulez ouvrir Twitter, faites-le:

initShareIntent("twi");

si facebook:

initShareIntent("face");

si courrier:

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

Si vous voulez afficher une liste d'intentions qui correspondent au type, au lieu d'utiliser le premier mach, consultez cet article: Application Android Intent pour Twitter

79
Derzu

D'abord, répertoriez toutes les applications à partager.

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;
}

Ensuite, sélectionnez-en un

    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);
    }

Voici un exemple de projet . J'espère que cela vous aidera.

4
BruceDu

Vous pouvez obtenir tous les clients de messagerie en utilisant ACTION_SENDTO comme

        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;
        }

puis créez votre propre sélecteur (dialogue avec la liste des applications fondées). Lorsque l'utilisateur clique sur un élément, vous pouvez le faire comme ceci.

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

Peut-être que cela vous aidera.

1
Raman Branavitski