点击分享,若手机中多个应用支持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; }
自定义分享列表项
最新推荐文章于 2023-09-10 10:26:50 发布