使用 Sharesheet 进行丰富的链接共享
Android App Links 允许您的应用程序打开网页链接,而不是使用网络浏览器。处理这些深层链接已在我们的《深层链接入门课程》中介绍过。除了能够打开深层链接外,您的应用程序还应能够创建和共享指向特定内容的深层链接。
在安卓中,分享应用内的链接内容是一项重要的操作。链接分享使您的应用程序及其用户能够进行协作、交流、社交网络等活动。所有这些活动都能增加用户对应用程序的参与度,并充分发挥您的应用程序的深层链接支持。一个很好的用于分享链接内容的工具是Android Sharesheet
。
https://developer.android.com/training/sharing/send
本文将展示您为何应该使用Sharesheet
,并演示如何在链接内容中使用它。让我们开始吧!
首先,什么是Sharesheet
?安卓为选择用户或应用程序直接发送内容提供了一个应用内界面。这个界面被称为Sharesheet
,在调用具有 ACTION_SEND
操作的意图的Intent.createChooser
时显示。Sharesheet
为与其他应用程序共享数据提供了一种有效的方式,而无需使用显式意图。
下面的示例将调用Sharesheet
,向用户展示相关目标以供分享。每个用户都将拥有适合他们已安装的应用程序和联系人的表单。
val sendIntent: Intent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, "This is my text to send.")
type = "text/plain"
}
val shareIntent = Intent.createChooser(sendIntent, null)
startActivity(shareIntent)
这是一个基本的例子,我们更有可能分享比纯文本更有趣的内容。如果您的应用程序支持Android App链接,它可以直接分享到应用程序内部内容的链接。让我们看一个示例链接:“https://example.com/specials/spaghetti"。这个链接对应用程序的用户来说很明确,它是一个意大利面特价,我们可能无需修改分享表单。
然而,有时链接的目标可能不够清晰。例如,一个指向Google Doc的链接通常看起来像这样:https://docs.google.com/document/d/1TejHHDrz…NotARealLink。仅凭链接,用户可能不知道他们实际上正在分享什么信息。在这种情况下,我们应考虑添加一个更丰富的预览。
巧合的是,这也是来自Android文档的指导 https://developer.android.com/training/sharing/send。
Consider sharing a complicated URL like:
https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4.
A richer preview can reassure your users what is being shared.
对于我们的使用,更丰富的预览包括额外的标题文本和图像缩略图。我们可以通过将描述添加到Intent.EXTRA_TITLE
来设置标题文本。要在Sharesheet
中嵌入图像,我们将Intent的clipData
参数设置为通过文件提供程序提供的内容URI
。本文的其余部分将指导您通过从任意URL嵌入图像来提供在Sharesheet
中更丰富的共享内容预览。
首先: 让我们在我们的AndroidManifest.xml
文件中创建一个文件提供程序。
<provider
android:name=".AndroidFoodFileProvider"
android:authorities="com.example.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
现在,我们需要将filepaths.xml
文件添加到我们的XML资源目录中。对于我们的示例,我们将从根目录或缓存目录提供图像。这个filepaths.xml
文件将把我们的缓存根目录链接到内容URI上的/images
。
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<cache-path name="images" path="/" />
</paths>
尽管不是严格必要的,但根据FileProvider API文档的要求,我们应该为我们的应用程序创建一个存根实现。引用:“直接使用FileProvider而不是扩展它是可能的。然而,在某些设备上这种方式并不可靠,会导致崩溃。”
import androidx.core.content.FileProvider
class AndroidFoodFileProvider : FileProvider() {
}
那么这实际上做了什么?我们声明了一个文件提供程序,可以为我们缓存目录中的图像创建内容URI。我们可以调用FileProvider.getUriForFile
来创建一个URI,供共享表格用于显示图像。
import androidx.core.content.FileProvider
class AndroidFoodFileProvider : FileProvider() {
}
拥有图像的链接、标题和内容URI后,我们现在可以准备创建Intent
。
val sendIntent: Intent = Intent().apply {
val destination = "https://example.com/specials/spaghetti"
putExtra(Intent.EXTRA_TITLE, "Link Description")
val imageUri = FileProvider.getUriForFile(context, "com.example.fileprovider", File(context.cacheDir, "spaghetti.jpg"))
clipData = ClipData.newUri(context.contentResolver, "", imageUri)
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
putExtra(Intent.EXTRA_TEXT, destination)
}
val shareIntent = Intent.createChooser(sendIntent, null)
context.startActivity(shareIntent)
https://medium.com/androiddevelopers/the-deep-links-crash-course-part-1-introduction-to-deep-links-2189e509e269
https://developer.android.com/reference/androidx/core/content/FileProvider