如何为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_ACTIONaction的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
相关产品推荐
相关产品推荐

