核心代码
1
2
3
4
5
6
| Intent sharingIntent = new Intent(Intent.ACTION_SEND);
// "text/plain" 和 "text/html" 区别:html 类型 可以识别加粗等标签
// 当需要分享图文时可以使用 "image/*"
sharingIntent.setType("text/html");
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, Html.fromHtml("<b>This is the text shared.</b>"));
startActivity(Intent.createChooser(sharingIntent, "Share using"));
|
封装使用
比如分享链接到 Facebook
ResolveInfo 可以获取包名, icon 和 Label ,通过包名限制分享的应用。可以通过 label 进一步筛选分享到应用中的选项
1
| AppUtils.shareUrl(this, bean.share_link, null, "facebook")
|
分享图片流程:使用 Glide 把图片转为 Bitmap 再插入到相册中 最后转为 uri 来进行分享,如果想让插入的图片显示还需要发送广播,这里不需要
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
| public static void shareUrl(Context context, String content, Object img, String packageName) {
boolean appFound = false;
Intent sharingIntent = new Intent(Intent.ACTION_SEND);
sharingIntent.putExtra(Intent.EXTRA_TEXT, content);
sharingIntent.setType("text/plain");
List<ResolveInfo> matches = context.getPackageManager().queryIntentActivities(sharingIntent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo info : matches) {
if (info.activityInfo.packageName.contains(packageName)) {
sharingIntent.setPackage(info.activityInfo.packageName);
appFound = true;
break;
}
}
if (!appFound) {
ToastUtils.show(context.getString(R.string.app_not_found));
return;
}
try {
if (img == null) {
context.startActivity(sharingIntent);
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// glide 的 CustomTarget 回调中可以获取图片宽高
Glide.with(context).asBitmap()
.load(img).into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
//0-100 100则没有压缩 压缩格式为 PNG 则无效,因为 PNG 是无损压缩
resource.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
try {
bytes.close();
} catch (IOException e) {
e.printStackTrace();
}
String path = MediaStore.Images.Media.insertImage(context.getContentResolver(), resource, "Title", null);
Uri imageUri = Uri.parse(path);
sharingIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
sharingIntent.setType("image/*");
context.startActivity(sharingIntent);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
}
}
} catch (Exception e) {
ToastUtils.show(context.getString(R.string.app_not_found));
Log.e("shareUrl", e.getMessage());
}
}
|
AndroidManifest 增加如下代码,兼容 Android 11 的隐私软件包可见性
1
2
3
4
5
6
7
8
| <queries>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent>
</queries>
<!--如果要查全部应用,如根据包名查询是否安装应用加QUERY_ALL_PACKAGES权限-->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
|
参考
官方文档
多种分享类型参考
https://www.jianshu.com/p/88f166dd43b7
压缩可以随便看看这个