美文网首页
基于友盟的第三方分享

基于友盟的第三方分享

作者: 唐_夏影 | 来源:发表于2018-12-06 01:28 被阅读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("分享取消了")
            }
        }
    
    }
    
    

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

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

    相关文章

      网友评论

          本文标题:基于友盟的第三方分享

          本文链接:https://www.haomeiwen.com/subject/nezgcqtx.html