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 秒,超过需要裁剪。

以上就是本章分享的全部内容了哈。 代码全部经过本人测试的,如有问题,欢迎👇提问。