androidshareactionprovider

How to exclude the application itself from Android share (ShareActionProvider)


I made a share function in a App called GovDic. But in the share list, the application itself appeared. How to exclude it from the share?

I need share text/plain content to other App, also other App can share text/plain content to this App.

manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.comp548.govdic">

    ...

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        ...

        <activity android:name=".OrgDetailActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>

            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity"/>
        </activity>
    </application>

</manifest>

menu:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:id="@+id/menu_item_share"
        app:showAsAction="ifRoom"
        android:title="@string/share"
        app:actionProviderClass="android.support.v7.widget.ShareActionProvider" />
</menu>

activity:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate menu resource file.
    getMenuInflater().inflate(R.menu.detail_menu, menu);

    // Locate MenuItem with ShareActionProvider
    MenuItem menuItem = menu.findItem(R.id.menu_item_share);

    // Fetch and store ShareActionProvider
    ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem);

    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.setType(Constant.MIME_TYPE_TEXT_PLAIN);
    shareIntent.putExtra(Intent.EXTRA_TEXT, etDescription.getText().toString());

    shareActionProvider.setShareIntent(shareIntent);

    // Return true to display menu
    return true;
}

enter image description here


Solution

  • these functions can help you achieve you want. just pass your package name

    public static void shareExludingApp(Context ctx, String packageNameToExclude, android.net.Uri imagePath, String text) {
    
            List<Intent> targetedShareIntents = new ArrayList<Intent>();
            Intent share = new Intent(android.content.Intent.ACTION_SEND);
            share.setType("image/*");
            File file = new File(imagePath.getPath());
            List<ResolveInfo> resInfo = ctx.getPackageManager().queryIntentActivities(createShareIntent(text, file), 0);
            if (!resInfo.isEmpty()) {
                for (ResolveInfo info : resInfo) {
                    Intent targetedShare = createShareIntent(text, file);
    
                    if (!info.activityInfo.packageName.equalsIgnoreCase(packageNameToExclude)) {
                        targetedShare.setPackage(info.activityInfo.packageName);
                        targetedShareIntents.add(targetedShare);
                    }
                }
    
                Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0),
                        "Select app to share");
                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
                        targetedShareIntents.toArray(new Parcelable[]{}));
                ctx.startActivity(chooserIntent);
            }
    
        }
    
        private static Intent createShareIntent(String text, File file) {
            Intent share = new Intent(android.content.Intent.ACTION_SEND);
            share.setType("image/*");
            if (text != null) {
                share.putExtra(Intent.EXTRA_TEXT, text);
            }
            share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
            return share;
        }