Instagram是海外应用分享是常见渠道,市面上主要有三种分享方式。
- Instagram Story(分享到 Instagram 限时动态)
- Instagram Direct(分享到 Instagram 私信 / 更多Instagram方式)【系统可能会唤起多种分享方式】
- Instagram Post(分享到 Instagram 贴文 / Feed)
下面我将对这三种分享方式进行一个总结,以及代码演示。
下面这个是获取媒体Uri的公共方法,后面不再赘述
public static Uri getMediaUri(Context context, File file) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// Android 7.0 及以上,使用 FileProvider
return FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", file);
} else {
// Android 7.0 以下,直接返回 Uri
return Uri.fromFile(file);
}
}
如何配置FileProvider :在AndroidManifest.xml 加上如下代码:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"
tools:replace="android:resource" />
</provider>
<!--
tools:replace="android:resource"主要用于 多模块合并 AndroidManifest.xml 时,
防止合并冲突(有相同的 provider 配置),它的作用是 允许在合并 AndroidManifest.xml 时,当前模块替换 android:resource 的值。
-->
在res/xml/file_paths.xml中添加以下代码【按需添加】,不懂可以自行查找file_paths的用法 :
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!-- 1. 允许访问设备根目录 -->
<root-path
name="root"
path="" />
<!-- 2. 允许访问内部存储 `files/` 目录 -->
<files-path
name="files"
path="." />
<!-- 3. 允许访问内部存储 `cache/` 目录 -->
<cache-path
name="cache"
path="." />
<!-- 4. 允许访问外部存储的根目录(可能会有兼容性问题,慎用)-->
<external-path
name="external"
path="." />
<!-- 5. 允许访问 `context.getExternalFilesDir(null)` 目录 -->
<external-files-path
name="external_file_path"
path="." />
<!-- 6. 允许访问 `context.getExternalCacheDir()` 目录 -->
<external-cache-path
name="external_cache_path"
path="." />
<!--
这个配置的 主要作用是让应用访问并共享外部存储下的 DCIM/Camera/ 目录内的文件,比如:
1. 拍照存储 & 共享:应用可以将照片存到 DCIM/Camera/ 目录,并通过 FileProvider 共享。
2. 视频 & 图片文件分享:其他应用(如社交媒体、邮件)可以访问 content:// 形式的 URI 来读取这些文件。
下面演示均以把资源放在DCIM/Camera/目录去演示
-->
<external-files-path
name="shared_media"
path="DCIM/Camera/"
/>
</paths>
接下来进入正文
一. Instagram Story(分享到 Instagram 限时动态
支持的内容类型:
- 图片(image/*)
- 视频(video/*)
- 贴纸(Sticker)
注意:Instagram Story 目前不支持混合分享,只能 分享图片或视频,并可附加贴纸,但不能同时分享多个媒体(如同时分享图片和视频)
1. 分享图片到 Instagram Story
public void shareImageToInstagramStory(Context context, Uri imageUri) {
Intent intent = new Intent("com.instagram.share.ADD_TO_STORY");
intent.setDataAndType(imageUri, "image/*");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
// 检查 Instagram 是否安装
if (context.getPackageManager().resolveActivity(intent, 0) != null) {
context.startActivity(intent);
} else {
Toast.makeText(context, "Instagram 未安装", Toast.LENGTH_SHORT).show();
}
}
Uri imageUri = getMediaUri(context, new File("/storage/emulated/0/DCIM/Camera/sample.jpg"));
shareImageToInstagramStory(context, imageUri);
效果:
2. 分享视频到 Instagram Story
public void shareVideoToInstagramStory(Context context, Uri videoUri) {
Intent intent = new Intent("com.instagram.share.ADD_TO_STORY");
intent.setDataAndType(videoUri, "video/*");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
if (context.getPackageManager().resolveActivity(intent, 0) != null) {
context.startActivity(intent);
} else {
Toast.makeText(context, "Instagram 未安装", Toast.LENGTH_SHORT).show();
}
}
Uri videoUri = getMediaUri(context, new File("/storage/emulated/0/DCIM/Camera/sample.mp4"));
shareVideoToInstagramStory(context, videoUri);
3. 分享贴纸 (Sticker) 到 Instagram Story
注意,你不能单独分享贴纸(Sticker) 到 Instagram Story,只能结合1,2去使用。 也就是如第四点,分享图片 / 视频 并附加贴纸所示的操作
也就是说贴纸就是贴在某个内容上的,本身无法单独存在。 下面代码我们只需要知道这行代码即可。其他的看第四点结合操作
intent.putExtra("interactive_asset_uri", stickerUri);
注意:下面这个方法直接复制也无法成功的。 请看第四点 图片结合贴纸使用。
public void shareStickerToInstagramStory(Context context, Uri stickerUri) {
Intent intent = new Intent("com.instagram.share.ADD_TO_STORY");
intent.setType("image/*");
intent.putExtra("interactive_asset_uri", stickerUri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
if (context.getPackageManager().resolveActivity(intent, 0) != null) {
context.startActivity(intent);
} else {
Toast.makeText(context, "Instagram 未安装", Toast.LENGTH_SHORT).show();
}
}
Uri stickerUri = getMediaUri(context, new File("/storage/emulated/0/DCIM/Camera/sticker.png"));
shareStickerToInstagramStory(context, stickerUri);
4. 分享图片 / 视频 并附加贴纸
注意:你不能同时分享图片和视频,但可以给图片或视频添加贴纸!
public void shareImageWithStickerToInstagramStory(Context context, Uri imageUri, Uri stickerUri) {
Intent intent = new Intent("com.instagram.share.ADD_TO_STORY");
intent.setDataAndType(imageUri, "image/*");
intent.putExtra("interactive_asset_uri", stickerUri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
if (context.getPackageManager().resolveActivity(intent, 0) != null) {
context.startActivity(intent);
} else {
Toast.makeText(context, "Instagram 未安装", Toast.LENGTH_SHORT).show();
}
}
Uri imageUri = getMediaUri(context, new File("/storage/emulated/0/DCIM/Camera/sample.jpg"));
Uri stickerUri = getMediaUri(context, new File("/storage/emulated/0/DCIM/Camera/sticker.png"));
shareImageWithStickerToInstagramStory(context, imageUri, stickerUri);
假设我的sample.jpg以及sticker.png内容是一样的,那么效果就是:
如图,相当于在1的效果基础上贴了张内容一样的贴纸。
二. Instagram Direct(分享到 Instagram 私信 / 更多Instagram方式)【系统可能会唤起多种分享方式】
注意:系统可能会唤起多种分享方式如下图
1. 分享图片到 Instagram Direct
public void shareImageToInstagramDirect(Context context, Uri imageUri) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
intent.setPackage("com.instagram.android"); // 只发送到 Instagram
intent.putExtra(Intent.EXTRA_STREAM, imageUri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
try {
context.startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(context, "Instagram 未安装", Toast.LENGTH_SHORT).show();
}
}
imageUri入参依旧是要调用我们上述的getMediaUri公共方法生成。 下面的Uri对象也一样,不再赘述。
2. 分享视频到 Instagram Direct
public void shareVideoToInstagramDirect(Context context, Uri videoUri) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("video/*");
intent.setPackage("com.instagram.android");
intent.putExtra(Intent.EXTRA_STREAM, videoUri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
try {
context.startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(context, "Instagram 未安装", Toast.LENGTH_SHORT).show();
}
}
注意:
- 仅支持 MP4 格式 的视频,不能是 .mkv 或 .avi。
- 视频大小限制:建议小于 15MB,避免 Instagram 处理失败。
3. 分享贴纸(Sticker)到 Instagram Direct
Instagram 支持使用 背景颜色 + 贴纸 的方式分享到 Direct Message。
public void shareStickerToInstagramDirect(Context context, Uri stickerUri) {
Intent intent = new Intent("com.instagram.share.ADD_TO_STORY");
intent.setPackage("com.instagram.android");
intent.putExtra("interactive_asset_uri", stickerUri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
try {
context.startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(context, "Instagram 未安装或不支持该功能", Toast.LENGTH_SHORT).show();
}
}
注意:
- stickerUri 需要是透明 PNG 图片的 content:// URI。
- 需要 Instagram 版本支持 ADD_TO_STORY,某些旧版本可能不兼容。
因此这个分享贴纸是有可能失败的。
4.分享文本
很简单,就是在intent里面设置Type为"text/plain"即可
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, shareText);
5. 混合分享
Instagram 官方不支持 一次性分享 多个媒体文件(如图片 + 贴纸 / 视频 + 图片),只能单独。
三. Instagram Post(分享到 Instagram 贴文 / Feed)
Instagram 允许应用通过 Intent 方式直接分享内容到 Instagram Feed(Post),支持以下方式:
- 单张图片
- 单个视频
- 多张图片/视频:(仅部分机型支持)
- 官方不支持混合分享(即一次性分享图片+视频或图片+贴纸),只能分享相同类型的内容。
1. 分享单张图片到 Instagram Post
public void shareImageToInstagramPost(Context context, Uri imageUri) {
Intent share = new Intent("com.instagram.share.ADD_TO_FEED");
share.setPackage("com.instagram.android");
share.setDataAndType(uri, "image/*");
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
share.putExtra(Intent.EXTRA_STREAM, uri);
try {
context.startActivity(share);
} catch (ActivityNotFoundException e) {
Toast.makeText(context, "Instagram 未安装", Toast.LENGTH_SHORT).show();
}
}
效果:
2. 分享单个视频到 Instagram Post
public void shareVideoToInstagramPost(Context context, Uri videoUri) {
Intent share = new Intent("com.instagram.share.ADD_TO_FEED");
share.setPackage("com.instagram.android");
share.setDataAndType(uri, "video/*");
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
share.putExtra(Intent.EXTRA_STREAM, uri);
try {
context.startActivity(share);
} catch (ActivityNotFoundException e) {
Toast.makeText(context, "Instagram 未安装", Toast.LENGTH_SHORT).show();
}
}
- 仅支持 MP4 格式 的视频,不能是 .mkv 或 .avi。
- 视频大小限制:建议小于 50MB,否则 Instagram 可能会失败。
- 视频时长:1 秒 ~ 60 秒,超过需要裁剪。
以上就是本章分享的全部内容了哈。 代码全部经过本人测试的,如有问题,欢迎👇提问。