基于友盟的第三方分享
近期在广州找Android开发的工作,我是19届毕业生,有可以内推或介绍的联系我,不胜感激,我请吃饭啊~
很久之前写了篇友盟第三方登录的,现在接着写友盟的第三方分享,关于集成库方面不再赘述,所以之前集成库那一步操作要懂
教程使用的是kotlin语言,不熟悉kotlin语言的伙伴可以去看看我文章的教程推荐
注意,分享的功能即使没有登录也可以分享,它们有联系的地方只是他们都用同一个库而已
准备部分
我们只需要在xml界面写一个按钮,点击按钮就调起和分享框就可以了_,这里我们加个Anko的依赖,用来弹吐司(用了Anko就离不开它了,嘻嘻)
//Anko
implementation "org.jetbrains.anko:anko-commons:0.10.5"
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".module.share.ShareActivity">
<Button
android:id="@+id/btnShare"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="调起分享面板"
/>
</LinearLayout>
读取外部存储.pngShareActivity声明匿名内部类,分享功能需要我们有读取外部存储的权限,这个权限在我们的umeng库中已经存在了,不过如果是6.0以上,必须经过权限的动态处理才行
/**
* Created by 舍长 on 2018/12/03.
* 友盟社会化分享
*/
class ShareActivity : AppCompatActivity() {
private var mShareAction: ShareAction? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_share)
//判断是否已经获取到了权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//没有的话弹出权限获取框
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 1)
}
//匿名内部类实现点击事件
btnShare.setOnClickListener {
shares()
}
}
/**
* 调起分享面板
*/
private fun shares() {
}
}
到这里我们的准备就完成了了
分享案例
1)分享链接
接着我们在share方法里面写调出分享面板的方法
/**
* Created by 舍长 on 2018/12/03.
* 友盟社会化分享
*/
class ShareActivity : AppCompatActivity() {
private var mShareAction: ShareAction? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_share)
//判断是否已经获取到了权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//没有的话弹出权限获取框
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 1)
}
//匿名内部类实现点击事件
btnShare.setOnClickListener {
shares()
}
}
/**
* 调起分享面板
*/
private fun shares() {
//配置分享面板
mShareAction = ShareAction(this)
.withText("你好,世界")
.setDisplayList(
//传入展示列表
SHARE_MEDIA.QQ,//QQ
SHARE_MEDIA.QZONE,//QQ
SHARE_MEDIA.WEIXIN, //微信
SHARE_MEDIA.WEIXIN_CIRCLE,//微信朋友圈
SHARE_MEDIA.WEIXIN_FAVORITE//微信收藏
).setShareboardclickCallback(object : ShareBoardlistener {
override fun onclick(snsPlatform: SnsPlatform?, share_media: SHARE_MEDIA?) {
val web = UMWeb("https://www.jianshu.com/u/8c6b4be8770b")//你要分享的url
web.mText = "tonjie的博客"//分享内容的标题
web.description = "tonjies的博客,会每周分享一些开发知识"//分享内容的描述
web.setThumb(UMImage(this@ShareActivity, R.drawable.book))//分享内容的缩略图
ShareAction(this@ShareActivity)
.withMedia(web)
.setPlatform(share_media)//设置分享的平台
.setCallback(shareListener)
.share()
}
})
mShareAction?.open()//开始分享
}
//分享的回调
private val shareListener = object : UMShareListener {
//开始分享,platform为平台类型
override fun onStart(platform: SHARE_MEDIA) {
L.d("开始分享,分享的平台是:$platform");
}
//分享成功
override fun onResult(platform: SHARE_MEDIA) {
toast("分享成功")
}
//分享失败
override fun onError(platform: SHARE_MEDIA, t: Throwable) {
toast("分享失败,失败的原因是$t")
}
//分享取消了
override fun onCancel(platform: SHARE_MEDIA) {
toast("分享取消了")
}
}
}
分享案例.gif运行一下程序,查看效果
到这里,我们的分享就完成了,简单吧,友盟封装的太好了,我们也可以分享其他的内容,比如本地图片,网络图片,音乐(音乐的分享的要求是.mp3后缀的地址,然后你可以点击你分享的后的缩略图播放)
2)分享图片
接下来看分享本地和网络图片的代码,基本代码都一样,只是那里把分享类型改一下就可以了
/**
* 调起分享面板
*/
private fun shares() {
//配置分享面板
mShareAction = ShareAction(this)
.withText("你好,世界")
.setDisplayList(
//传入展示列表
SHARE_MEDIA.QQ,//QQ
SHARE_MEDIA.QZONE,//QQ
SHARE_MEDIA.WEIXIN, //微信
SHARE_MEDIA.WEIXIN_CIRCLE,//微信朋友圈
SHARE_MEDIA.WEIXIN_FAVORITE//微信收藏
).setShareboardclickCallback(object : ShareBoardlistener {
override fun onclick(snsPlatform: SnsPlatform?, share_media: SHARE_MEDIA?) {
//分享链接
// shareUrl(share_media)
//分享的图片
val imageUrl = UMImage(this@ShareActivity, "https://s.yimg.com/xd/api/res/1.2/Hq_PBh70vP17cUVnaLeWTw--/YXBwaWQ9eXR3YXVjdGlvbnNlcnZpY2U7aD0yMDAwO3E9ODU7cm90YXRlPWF1dG87dz0xMzMz/https://s.yimg.com/ob/image/c4bf19f0-93c8-463f-83a8-8eae5d648b88.jpg")
imageUrl.setThumb(UMImage(this@ShareActivity, R.drawable.book))//缩略图
ShareAction(this@ShareActivity)
.withMedia(imageUrl)
.setPlatform(share_media)//设置分享的平台
.setCallback(shareListener)
.share()
}
})
mShareAction?.open()//开始分享
}
分享图片时有点慢,可能和图片大小有关
3)分享音乐
分享音乐的代码
//分享音乐
val music = UMusic("http://pj67ii310.bkt.clouddn.com/lijun.mp3")
music.title = "This is music title"
music.setThumb(UMImage(this@ShareActivity, R.drawable.book))
music.description = "my description"
music.setmTargetUrl("http://mobile.umeng.com/social")
ShareAction(this@ShareActivity).withMedia(music)
.setPlatform(SHARE_MEDIA.QQ)
案例的演示就到这里了
面板位置
上面的案例演示调起的,是一个页面位置在底部,平台图标带白色背景的分享菜单,友盟除了在页面底部的菜单,也支持在中部页面的菜单
我们新建一个MenuActivity,在xml布局中添加4个按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".module.share.MenuActivity">
<!--* 1,底部带白色背景图标-->
<Button
android:id="@+id/btn_01"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="底部带白色背景图标" />
<!--* 2,底部不带白色背景图标-->
<Button
android:id="@+id/btn_02"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="底部不带白色背景图标" />
<!--* 3,中部带白色背景图标-->
<Button
android:id="@+id/btn_03"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="中部带白色背景图标" />
<!--* 3,中部不带白色背景图标-->
<Button
android:id="@+id/btn_04"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="中部不带白色背景图标" />
</LinearLayout>
初始化控件
import kotlinx.android.synthetic.main.activity_menu.*
import org.jetbrains.anko.toast
/**
* 测试友盟不同位置分享框的Activity
* 1,底部带白色背景图标
* 2,底部不带白色背景图标
* 3,中部带白色背景图标
* 3,中部不带白色背景图标
*/
class MenuActivity : AppCompatActivity(), View.OnClickListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_menu)
//获得权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//没有的话弹出权限获取框
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 1)
}
//初始化控件
initView()
}
/**
* 初始化控件
*/
private fun initView() {
btn_01.setOnClickListener(this)
btn_02.setOnClickListener(this)
btn_03.setOnClickListener(this)
btn_04.setOnClickListener(this)
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.btn_01 -> {
toast("1")
}
R.id.btn_02 -> {
toast("2")
}
R.id.btn_03 -> {
toast("3")
}
R.id.btn_04 -> {
toast("4")
}
}
}
}
接着我们声明shareAction类
private var mShareAction: ShareAction? = null
因为我们接着会重复用到它,所以选择在initView中初始化它
/**
* 初始化控件
*/
private fun initView() {
btn_01.setOnClickListener(this)
btn_02.setOnClickListener(this)
btn_03.setOnClickListener(this)
btn_04.setOnClickListener(this)
//配置分享面板
mShareAction = ShareAction(this)
.withText("你好,世界")
.setDisplayList(
//传入展示列表
SHARE_MEDIA.QQ,//QQ
SHARE_MEDIA.QZONE,//QQ
SHARE_MEDIA.WEIXIN, //微信
SHARE_MEDIA.WEIXIN_CIRCLE,//微信朋友圈
SHARE_MEDIA.WEIXIN_FAVORITE//微信收藏
).setShareboardclickCallback(object : ShareBoardlistener {
override fun onclick(snsPlatform: SnsPlatform?, share_media: SHARE_MEDIA?) {
val web = UMWeb("https://www.jianshu.com/u/8c6b4be8770b")//你要分享的url
web.mText = "tonjie的博客"//分享内容的标题
web.description = "tonjies的博客,会每周分享一些开发知识"//分享内容的描述
web.setThumb(UMImage(this@MenuActivity, R.drawable.book))//分享内容的缩略图
ShareAction(this@MenuActivity)
.withMedia(web)
.setPlatform(share_media)//设置分享的平台
.setCallback(shareListener)
.share()
}
})
}
回调代码
//分享的回调
private val shareListener = object : UMShareListener {
//开始分享,platform为平台类型
override fun onStart(platform: SHARE_MEDIA) {
L.d("开始分享,分享的平台是:$platform");
}
//分享成功
override fun onResult(platform: SHARE_MEDIA) {
L.d("分享成功")
toast("分享成功")
}
//分享失败
override fun onError(platform: SHARE_MEDIA, t: Throwable) {
toast("分享失败,失败的原因是$t")
}
//分享取消了
override fun onCancel(platform: SHARE_MEDIA) {
toast("分享取消了")
}
}
1)底部带白色背景的分享面板
底部,图标带白色背景.png接着在按钮1的点击事件里面使用,mShareAction?.open(),运行程序
2)底部不带白色背景的分享页面
稍微修改一下代码
var config: ShareBoardConfig = ShareBoardConfig()
config.setMenuItemBackgroundShape(ShareBoardConfig.BG_SHAPE_NONE)//底部菜单,图标无白色圆圈
mShareAction?.open(config)
底部,图标不带白色背景.png现在的分享面板的图标就没有白色背景了
3)中部,图标带白色背景的分享面板
第三种,在页面中部,图标带白色背景的面板
var config: ShareBoardConfig = ShareBoardConfig()
config.setShareboardPostion(ShareBoardConfig.SHAREBOARD_POSITION_CENTER)
config.setMenuItemBackgroundShape(ShareBoardConfig.BG_SHAPE_CIRCULAR)//中部菜单,有白色圆圈
mShareAction?.open(config)
中部面板.png
4)中部,图标不带白色背景的分享面板
其实就是修改一下setMenuItemBackgroundShape的参数
val config = ShareBoardConfig()
config.setShareboardPostion(ShareBoardConfig.SHAREBOARD_POSITION_CENTER)
config.setMenuItemBackgroundShape(ShareBoardConfig.BG_SHAPE_NONE)//中部菜单,无白色圆圈
mShareAction?.open(config)
底部,图标不带白色背景.png
完整代码
/**
* 测试友盟不同位置分享框的Activity
* 1,底部带白色背景图标
* 2,底部不带白色背景图标
* 3,中部带白色背景图标
* 3,中部不带白色背景图标
*/
class MenuActivity : AppCompatActivity(), View.OnClickListener {
private var mShareAction: ShareAction? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_menu)
//获得权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//没有的话弹出权限获取框
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 1)
}
//初始化控件
initView()
}
/**
* 初始化控件
*/
private fun initView() {
btn_01.setOnClickListener(this)
btn_02.setOnClickListener(this)
btn_03.setOnClickListener(this)
btn_04.setOnClickListener(this)
//配置分享面板
mShareAction = ShareAction(this)
.withText("你好,世界")
.setDisplayList(
//传入展示列表
SHARE_MEDIA.QQ,//QQ
SHARE_MEDIA.QZONE,//QQ
SHARE_MEDIA.WEIXIN, //微信
SHARE_MEDIA.WEIXIN_CIRCLE,//微信朋友圈
SHARE_MEDIA.WEIXIN_FAVORITE//微信收藏
).setShareboardclickCallback(object : ShareBoardlistener {
override fun onclick(snsPlatform: SnsPlatform?, share_media: SHARE_MEDIA?) {
val web = UMWeb("https://www.jianshu.com/u/8c6b4be8770b")//你要分享的url
web.mText = "tonjies的博客"//分享内容的标题
web.description = "tonjies的博客,会每周分享一些开发知识"//分享内容的描述
web.setThumb(UMImage(this@MenuActivity, R.drawable.book))//分享内容的缩略图
ShareAction(this@MenuActivity)
.withMedia(web)
.setPlatform(share_media)//设置分享的平台
.setCallback(shareListener)
.share()
}
})
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.btn_01 -> {
// toast("1")
mShareAction?.open()
}
R.id.btn_02 -> {
// toast("2")
var config: ShareBoardConfig = ShareBoardConfig()
config.setMenuItemBackgroundShape(ShareBoardConfig.BG_SHAPE_NONE)//底部菜单,图标无白色圆圈
mShareAction?.open(config)
}
R.id.btn_03 -> {
// toast("3")
var config: ShareBoardConfig = ShareBoardConfig()
config.setShareboardPostion(ShareBoardConfig.SHAREBOARD_POSITION_CENTER)
config.setMenuItemBackgroundShape(ShareBoardConfig.BG_SHAPE_CIRCULAR)//中部菜单,有白色圆圈
mShareAction?.open(config)
}
R.id.btn_04 -> {
// toast("4")
val config = ShareBoardConfig()
config.setShareboardPostion(ShareBoardConfig.SHAREBOARD_POSITION_CENTER)
config.setMenuItemBackgroundShape(ShareBoardConfig.BG_SHAPE_NONE)//中部菜单,无白色圆圈
mShareAction?.open(config)
}
}
}
//分享的回调
private val shareListener = object : UMShareListener {
//开始分享,platform为平台类型
override fun onStart(platform: SHARE_MEDIA) {
L.d("开始分享,分享的平台是:$platform");
}
//分享成功
override fun onResult(platform: SHARE_MEDIA) {
L.d("分享成功")
toast("分享成功")
}
//分享失败
override fun onError(platform: SHARE_MEDIA, t: Throwable) {
toast("分享失败,失败的原因是$t")
}
//分享取消了
override fun onCancel(platform: SHARE_MEDIA) {
toast("分享取消了")
}
}
}
好了,到这里我们关于友盟社会化分享的知识就分享的差不多了,希望能对你有帮助
总得来说友盟的第三方登录,分享代码难度善可,就是签名的打包啊,平台的申请步骤,友盟集成的步骤比较多一点