Fediverse Redirect
一套用于在首选的 Mastodon 或 Lemmy 客户端中自动启动 Fediverse 链接的简单应用套件。
使用场景
Mastodon 和 Lemmy 都是联邦社交媒体的示例。这在很大程度上是好事,原因有很多,但它确实有一个明显的缺点:深度链接支持。
当你在浏览器中点击一个 Twitter 链接,你的手机打开 Twitter 应用而不是 Twitter 网站来查看帖子时,这就是深度链接的一个例子。联邦社交媒体的麻烦在于三个方面:
- 有许多运行相同或可互操作软件的不同实例,位于不同的地址。
- Android 只允许应用开发者在编译时声明支持的深度链接域名:用户无法添加自定义域名,且域名只能通过应用更新添加。许多开发者可以理解地不想维护一个包含数千个域名的列表。
- Android 真的没有为单个应用支持多个不同的深度链接域名而设计。
Fediverse Redirect 旨在解决前两个问题,并部分解决第三个问题。
通过使用 Fediverse Observer 作为数据源,Fediverse Redirect 可以维护一个最新的活跃域名列表。
下载应用后,你可以选择你的客户端应用,然后启用所有支持的域名,这样当你点击一个被识别的链接时,它会被传递给正确的 Fediverse Redirect 变体。
Fediverse Redirect 变体随后会将链接直接发送到所选的客户端应用,由其进行处理。
由于 Fediverse Redirect 的目的仅仅是更改受支持链接的打开位置,因此维护受支持的域名并非需要在其他功能和修复之外额外完成的繁琐工作;它实际上就是该应用所做的全部事情。
客户端开发人员确实需要为 Fediverse Redirect 支持他们做一些工作,但这是一次性的,说明如下。
截图
下载
Fediverse Redirect 根据您想要使用的社交媒体网络有不同的变体。请在下方下载适用于您所需社交网络的相应 APK。
GitHub
IzzyOnDroid
支持的域名
目前,Fediverse Observer 上的大多数域名均受支持。
Fediverse Redirect 支持大多数活跃且存活的实例,但会排除已停止运行的实例以及近期没有任何活动的实例。这是为了尽可能缩短列表长度并避免崩溃。
Fediverse Redirect 还支持 web+activity+http、web+activity+https 和 web+ap URL 方案。预期其后将跟随完整的帖子或个人资料 URL。
示例:
// Post
web+ap://androiddev.social/@wander1236/110699242324667418
// Profile
web+ap://androiddev.social/@wander1236
设置
如果某些域名未启用由 Fediverse Redirect 变体处理,应用会通知您并提供启用它们的按钮。
可以逐个启用每个受支持的域名,但这很繁琐。相反,Fediverse Redirect 可以使用 Shizuku 一次性自动启用所有链接。Shizuku 的设置略显复杂,但在 Android 11 及更高版本上可以完全在设备上进行。它仅在初始设置或启用应用更新中添加的域名时需要使用一次。
或者,您可以使用 LinkSheet 让受支持的域名在 Fediverse Redirect 中打开。LinkSheet 需要被设置为您的默认浏览器,然后作为 Android 内置链接处理选项的一个更全面且更易用的版本发挥作用。
使用
打开所选的 Fediverse Redirect 变体并选择您偏好的客户端。
客户端支持
不幸的是,许多 Fediverse 客户端没有让 Fediverse Redirect 与之交互的方式。
Fediverse Redirect 依赖于客户端具备能够解析并打开 Fediverse 链接的链接分享目标。
诸如 Tusky 之类的客户端确实拥有分享目标,但它们仅可用于创建新帖子,且共享的链接将作为内容。其他客户端则完全没有分享目标。
Mastodon Redirect 目前支持以下客户端:
- Elk (PWA: Stable or Canary).
- Fedilab (F-Droid or Play Store).
- Mastodon.
- Megalodon.
- Moshidon (Stable or Nightly).
- Phanpy (PWA: Stable or Dev).
- Subway Tooter.
- Tooot.
- Trunks (Native or Web).
Lemmy Redirect 目前支持以下客户端:
以及以下自动发现客户端:
PeerTube Redirect 目前支持以下客户端:
Fedilab (F-Droid 或 Play Store)(目前已禁用,因为链接处理功能已损坏)。Grayjay (Stable、Unstable 或 Play Store)(目前已禁用,因为 PeerTube 插件仅识别 Grayjay 的实例域名,并且使用错误的 URL 格式来检查兼容性)。- NewPipe (Release 或 Debug-Main)。
- Tubular (Release 或 Debug-Main)。
如果你喜欢的客户端不在列表中,请考虑在其代码仓库或问题跟踪器中创建一个 issue,并链接到下面的部分,但请先搜索现有的 issue,包括已关闭的 issue。骚扰开发人员对任何人都没有帮助。
添加客户端支持
如果你是 Fediverse 客户端的开发者,并希望在你的应用中添加对 Fediverse Redirect 的支持,以下是操作方法。
自动
你可以通过过滤自定义 Intent 并将数据解析为 URL,让 Fediverse Redirect 自动发现你的应用。
创建可发现的目标。
在你的 AndroidManifest.xml 中,在相关的 Activity 标签内添加以下 intent filter:
Mastodon Redirect:
<intent-filter>
<action android:name="dev.zwander.mastodonredirect.intent.action.OPEN_FEDI_LINK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Lemmy Redirect:
<intent-filter>
<action android:name="dev.zwander.lemmyredirect.intent.action.OPEN_FEDI_LINK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
PeerTube Redirect:
<intent-filter>
<action android:name="dev.zwander.peertuberedirect.intent.action.OPEN_FEDI_LINK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
在 Activity 本身内部:
override fun onCreate(savedInstanceState: Bundle?) {
// ...
val url = intent?.data?.toString()
// Validate `url`.
// Pass it to your internal link parser to find the post ID and such.
// Open in your thread/profile viewer component.
}
手动操作
高层流程相当简单:为你的应用暴露一种启动方式,使其能够接受一个 URL,并尝试将其解析为 fediverse 链接,以打开帖子或个人资料。有几种方法可以实现这一点。
一旦你实现了支持,请随时提交 issue 或 PR,以便将其添加到 Fediverse Redirect。
创建一个分享目标。
注意:这将导致你的应用出现在分享菜单中,当用户选择分享任何文本时,而不仅仅是链接。如果你的应用已经有一个用于将共享文本粘贴到新帖子草稿中的分享目标,那么复用该目标并添加一个选项来打开共享链接(而不是仅创建新帖子)可能更合理。
查看 Moshidon 作为示例。
在你的 AndroidManifest.xml 中,在相关的 Activity 标签内添加以下 intent filter:
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/*"/>
</intent-filter>
在 Activity 内部:
override fun onCreate(savedInstanceState: Bundle?) {
// ...
if (intent?.action == Intent.ACTION_SHARE) {
val sharedText = intent.getStringExtra(Intent.EXTRA_TEXT)
// Validate that `sharedText` is a URL.
// Pass it to your internal link parser to find the post ID and such.
// Open in your thread/profile viewer component.
}
}
创建视图目标。
这与共享目标类似,但不会直接显示在用户的共享菜单中。
在你的 AndroidManifest.xml 中,在相关的 Activity 标签内添加以下 intent filter:
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="https" />
<data android:scheme="http" />
<data android:host="*" />
</intent-filter>
在 Activity 内部:
override fun onCreate(savedInstanceState: Bundle?) {
// ...
val url = intent?.data?.toString()
// Validate `url`.
// Pass it to your internal link parser to find the post ID and such.
// Open in your thread/profile viewer component.
}
构建
要构建 Fediverse Redirect,你需要两样东西:
- 最新的 Android Studio Canary 构建版本。
一个 修改过的 Android SDK,其中暴露了隐藏 API。
下载与 Fediverse Redirect 当前 compile.sdk 值(在 gradle.properties 中查找)对应的修改版 SDK,并按照上述链接中提供的说明进行安装。
贡献
如果你想为另一个应用添加支持:
- 找到相关变体的
LaunchStrategy.kt文件。例如,如果你想为 Lemmy Redirect 添加一个应用的支持,请打开lemmyredirect/src/main/java/dev/zwander/lemmyredirect/util/LaunchStrategy.kt。 - 前往该变体的
strings.xml文件,并在其中添加该应用的名称。 - 创建一个继承自相关
LaunchStrategyRootGroup类的新数据对象(对于 Lemmy,它将是LemmyLaunchStrategyRootGroup)。基类接受的参数是你添加的字符串资源的引用。 - 在该对象内部,创建另一个继承自相关
LaunchStrategy类的对象。这需要提供一个键(对该应用唯一)和一个变体标签引用。 - 重写
createIntents()函数并返回一个 Intent 列表以尝试启动。通常,只需要一个 Intent。 - 确保使用
@Keep注释这两个对象。
Fediverse Redirect 将自动识别新类并将其显示为一个选项。
查看文件中的其他对象以获取示例。
错误报告
Fediverse Redirect 使用 Bugsnag 进行错误报告。