You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Gboard获取GIF和贴纸的URI以集成至自有应用?

实现Gboard贴纸与GIF集成并获取URI的方案

我之前做过类似的Android应用集成Gboard内容的工作,给你梳理下可行的实现步骤,分为接收用户选择的内容和关键注意事项两部分:

一、接收Gboard发送的贴纸/GIF URI

Gboard是通过Android系统的Intent机制传递用户选中的贴纸或GIF内容的,你的应用需要配置接收这类Intent并解析URI:

1. 在Manifest中注册接收组件

首先在AndroidManifest.xml里给处理内容的Activity添加Intent过滤器,指定接收ACTION_SEND动作和对应的MIME类型:

<activity android:name=".ui.StickerPickerReceiverActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <!-- 覆盖静态贴纸(image/png)和动态GIF(image/gif) -->
        <data android:mimeType="image/png" />
        <data android:mimeType="image/gif" />
    </intent-filter>
</activity>

2. 在Activity中解析获取URI

当用户在Gboard中选中贴纸/GIF并发送到你的应用时,系统会启动上述Activity,你可以在onCreate或onNewIntent中解析Intent拿到URI:

class StickerPickerReceiverActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        handleIncomingGboardContent(intent)
        finish() // 处理完可直接关闭这个中转Activity
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        intent?.let { handleIncomingGboardContent(it) }
        finish()
    }

    private fun handleIncomingGboardContent(intent: Intent) {
        if (Intent.ACTION_SEND == intent.action) {
            // 获取Gboard传递的内容URI
            val contentUri: Uri? = intent.getParcelableExtra(Intent.EXTRA_STREAM)
            contentUri ?: return

            // 拿到URI后的常见操作:
            // 1. 临时加载显示:用Glide/Picasso直接加载URI
            // Glide.with(this).load(contentUri).into(imageView)
            
            // 2. 持久化到应用私有目录(推荐,避免URI过期失效)
            val savedFile = copyUriToAppDir(contentUri)
            savedFile?.let { 
                // 后续可通过该文件路径访问内容
            }
        }
    }

    // 将URI对应的内容复制到应用私有目录
    private fun copyUriToAppDir(uri: Uri): File? {
        val mimeType = contentResolver.getType(uri) ?: "image/png"
        val fileExt = mimeType.split("/").last()
        val destFile = File(filesDir, "gboard_asset_${System.currentTimeMillis()}.$fileExt")
        
        return try {
            contentResolver.openInputStream(uri)?.use { input ->
                FileOutputStream(destFile).use { output ->
                    input.copyTo(output)
                }
            }
            destFile
        } catch (e: IOException) {
            e.printStackTrace()
            null
        }
    }
}

二、关键注意事项

  • 权限问题:Android 10及以上使用Scoped Storage,无需申请READ_EXTERNAL_STORAGE权限,直接通过ContentResolver访问URI即可;低于Android 10的版本需要添加该权限并动态申请。
  • URI时效性:Gboard提供的URI大多是临时权限的,不要直接持久化存储URI,建议复制内容到应用私有目录后使用文件路径。
  • 主动访问贴纸库的限制:目前没有公开的官方API支持主动遍历Gboard的全部贴纸/GIF。通过AccessibilityService模拟用户操作的方式属于非官方手段,可能存在兼容性问题,甚至违反Google Play政策,不建议使用。
  • 多版本兼容:不同版本的Gboard可能在Intent参数上有细微差异,建议在多个版本的Gboard上测试验证。

内容的提问来源于stack exchange,提问作者Bucky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:26:04