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

如何为Etar Calender开发扩展实现创建事件发送至WhatsApp或Messenger

为Etar Calendar开发事件分享扩展的实现步骤

前期准备工作

  • 确认你使用的Android Studio版本为Flamingo及以上,Gradle版本匹配Etar的官方构建配置,避免编译报错
  • 提前在模块配置中声明两个必要权限:android.permission.READ_CALENDAR(读取日历事件数据)、android.permission.QUERY_ALL_PACKAGES(Android 11及以上版本检测目标分享应用是否安装)

接入Etar的扩展接口

Etar默认支持外部扩展挂载,不需要修改Etar本身的源码,只需要在你开发的扩展模块的AndroidManifest.xml中注册对应的Intent Filter,就会自动出现在Etar事件详情的操作菜单中。

Etar会自动扫描所有注册了org.etar.calendar.EVENT_ACTION action的Activity,将其识别为事件扩展操作入口

<activity android:name=".EventShareActivity">
    <intent-filter>
        <action android:name="org.etar.calendar.EVENT_ACTION" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="vnd.android.cursor.item/event" />
    </intent-filter>
</activity>

如果你不想做独立扩展APK,也可以直接把上述逻辑加到Etar源码的功能模块中

获取选中的日历事件详情

在扩展入口Activity的onCreate方法中,接收Etar传递的事件ID,从系统日历Provider中查询事件的完整信息:

// 读取Etar传递的选中事件ID
val eventId = intent.data?.lastPathSegment?.toLongOrNull() ?: return
val projection = arrayOf(
    Events.TITLE,
    Events.DTSTART,
    Events.DTEND,
    Events.DESCRIPTION,
    Events.EVENT_LOCATION
)
var shareContent = ""
// 查询事件详情
contentResolver.query(
    ContentUris.withAppendedId(Events.CONTENT_URI, eventId),
    projection,
    null,
    null,
    null
)?.use { cursor ->
    if (cursor.moveToFirst()) {
        val title = cursor.getString(cursor.getColumnIndexOrThrow(Events.TITLE))
        val startTime = Date(cursor.getLong(cursor.getColumnIndexOrThrow(Events.DTSTART)))
        val endTime = Date(cursor.getLong(cursor.getColumnIndexOrThrow(Events.DTEND)))
        val desc = cursor.getString(cursor.getColumnIndexOrThrow(Events.DESCRIPTION)) ?: "无备注"
        // 拼接要分享的文本内容
        shareContent = "📅 日历事件:$title\n⏰ 时间:${startTime} 至 ${endTime}\n📝 备注:$desc"
    }
}

实现跨平台分享逻辑

不需要集成WhatsApp或Messenger的官方SDK,用系统隐式Intent跳转即可实现分享,不需要申请平台侧开发者账号,开发成本更低

  • 分享到WhatsApp的实现代码:
val whatsappIntent = Intent(Intent.ACTION_SEND).apply {
    type = "text/plain"
    setPackage("com.whatsapp")
    putExtra(Intent.EXTRA_TEXT, shareContent)
}
if (whatsappIntent.resolveActivity(packageManager) != null) {
    startActivity(whatsappIntent)
} else {
    Toast.makeText(this, "未安装WhatsApp", Toast.LENGTH_SHORT).show()
}
  • 分享到Messenger的实现代码:
val messengerIntent = Intent(Intent.ACTION_SEND).apply {
    type = "text/plain"
    setPackage("com.facebook.orca")
    putExtra(Intent.EXTRA_TEXT, shareContent)
}
if (messengerIntent.resolveActivity(packageManager) != null) {
    startActivity(messengerIntent)
} else {
    Toast.makeText(this, "未安装Messenger", Toast.LENGTH_SHORT).show()
}

测试验证

  • 将扩展模块打包安装到测试设备,同时安装目标分享应用
  • 打开Etar新建一个测试日历事件,进入事件详情页的更多操作列表,即可看到你开发的分享扩展入口,点击即可触发对应的分享逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:24:05