点击分享,若手机中多个应用支持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
今日推荐
周排行