自定义分享列表项

    点击分享,若手机中多个应用支持android.content.Intent.ACTION_SEND或者android.content.Intent.ACTION_SEND_MULTIPLE,通常系统是通过ChooserActivity或ResolverActivity中来过滤中系统中支持的应用,并以分享列表的形式展示。 
    如果想要自定义分享列表项,那么需要通过context.getPackageManager().queryIntentActivities获取支持的应用信息列表,然后包名等信息来进行过滤,然后调用ChooserActivity,并传递Intent.EXTRA_INITIAL_INTENTS的值,实现如下:
chooserIntent = Intent.createChooser(new Intent(), context.getString(R.string.share_via));
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{}));

    下面是分享txt文件时,分享项中过滤掉Drive应用SendTextToClipboardActivity的完整代码:
public static Intent buildSendFile(Context context, ArrayList<FileInfo> files) {
    ArrayList<Uri> uris = new ArrayList<>();
    String mimeType = "*/*";
    for (FileInfo file : files) {
        if (file.IsDir)
            continue;
        File fileIn = new File(file.filePath);

        Uri uri;
        //版本号大于23时,采用FileProvider形式
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            uri = FileProvider.getUriForFile(context, context.getPackageName() + ".provider", fileIn);
        } else {
            if (files.size() > 10) {
                uri = Uri.fromFile(fileIn);
            } else {
                uri = IntentBuilder.getUriFromFile(context, fileIn);
            }
        }
        uris.add(uri);
    }

    if (uris.size() == 0)
        return null;

    boolean multiple = uris.size() > 1;
    Intent intent = new Intent(multiple ? android.content.Intent.ACTION_SEND_MULTIPLE
            : android.content.Intent.ACTION_SEND);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    if (multiple) {
        if (uris.size() > 100) {
            Utils.showToast(context, R.string.error_transaction_too_large);
            return null;
        }

        for (int i = 0; i < files.size(); i++) {
            String curMimeType = Utils.getMultipleMimeType(context, new File(files.get(i).filePath), Utils.MIMETYPE_OPERATE_MODE_SHARE);
            if (TextUtils.isEmpty(curMimeType)) {
                continue;
            }
            if ("*/*".equals(mimeType)) {
                mimeType = curMimeType;
            } else if ("*/*".equals(curMimeType)) {
                mimeType = "*/*";
                break;
            } else if (!curMimeType.equals(mimeType)) {
                mimeType = "*/*";
                break;
            }
        }
        intent.setType(mimeType);

        intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
    } else {
        mimeType = Utils.getMIMEType(context, new File(files.get(0).filePath), Utils.MIMETYPE_OPERATE_MODE_SHARE);
        intent.setType(mimeType);
        intent.putExtra(Intent.EXTRA_STREAM, uris.get(0));
    }

    Intent chooserIntent = Intent.createChooser(intent, context.getString(R.string.share_via));

    if ("text/plain".equals(mimeType)) {
        List<ResolveInfo> resInfo = context.getPackageManager().queryIntentActivities(intent, 0);
        if (!resInfo.isEmpty()) {
            List<Intent> targetedShareIntents = new ArrayList<>();
            for (ResolveInfo info : resInfo) {
                ActivityInfo activityInfo = info.activityInfo;
                if (activityInfo.packageName.contains("com.google.android.apps.docs")
                        && activityInfo.name.contains("SendTextToClipboardActivity")) {
                    continue;
                }

                Intent targeted = new Intent(intent);
                targeted.setPackage(activityInfo.packageName);
                targeted.setClassName(activityInfo.packageName, activityInfo.name);
                targetedShareIntents.add(targeted);
            }

            int shareSize = targetedShareIntents.size();
            if (shareSize > 0) {
                chooserIntent = Intent.createChooser(new Intent(), context.getString(R.string.share_via));
                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
                        targetedShareIntents.toArray(new Parcelable[]{}));
            }
        }
    }

    return chooserIntent;
}

猜你喜欢

转载自blog.csdn.net/lei19880402/article/details/81480013