基于友盟的第三方分享

2018-12-06  本文已影响71人  唐_夏影

近期在广州找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>

ShareActivity声明匿名内部类,分享功能需要我们有读取外部存储的权限,这个权限在我们的umeng库中已经存在了,不过如果是6.0以上,必须经过权限的动态处理才行

读取外部存储.png
/**
 * 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)底部带白色背景的分享面板

接着在按钮1的点击事件里面使用,mShareAction?.open(),运行程序

底部,图标带白色背景.png
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("分享取消了")
        }
    }

}

好了,到这里我们关于友盟社会化分享的知识就分享的差不多了,希望能对你有帮助

总得来说友盟的第三方登录,分享代码难度善可,就是签名的打包啊,平台的申请步骤,友盟集成的步骤比较多一点

上一篇下一篇

猜你喜欢

热点阅读