IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Mob ShareSdk 三方登录、三方分享 -> 正文阅读

[移动开发]Mob ShareSdk 三方登录、三方分享

我记得上一次使用 Mob 还是在 2017年 的时候,当时可能是做了一个分享的功能,一回头都过去5年多了… 没想到新公司的新项目,沿用的是 Mob 提供的 三方登录三方分享 ,有些怀念的感觉,所以记录一下逝去的时光 ~

一切均以 Mob 官方文档 为准,毕竟作为开发者要按照平台要求去集成

平台注册 - 配置信息

  1. Mob 找到技术文档 - 开始集成指导

在这里插入图片描述

  1. Mob 文档中心 - 集成ShareSDK

在这里插入图片描述

  1. 创建应用

将我们的应用首先注册到Mob平台,因为SDK初始化时需要提供这些配置信息 - 内部包含:AppID、AppSecret

在这里插入图片描述

创建 - 结果示例

内部包含:AppID、AppSecret

在这里插入图片描述

  1. 第三方平台注册指南

不论是三方登录、三方分享,本质都是我们app需要跳转到三方,调用一些数据或者功能,所以需要注册三方平台的账户,例如QQ、微信等等 → 请到对应的三方平台进行账户、应用注册

在这里插入图片描述

创建 - 结果示例

内部包含:AppID、AppSecret

在这里插入图片描述


项目实战 - 开始集成

关于通过Mob集成三方的方式,主要以 快速开始 - Android快速集成客户端SDK - 集成指南 为准!!!

此篇生效结果时间 - 2022年8月19日

在集成的过程中,官网提供这张图挺形象的,有利于了解其背后的实现过程

在这里插入图片描述

gradle 配置

  1. build.gradle(Project)
buildscript {
    repositories {
        // 1.添加MobSDK Maven地址
        maven {
            url "https://mvn.mob.com/android"
        }
        ...
    }
    dependencies {
        ...
        // 2.注册MobSDK
        classpath "com.mob.sdk:MobSDK:2018.0319.1724"
    }
}
  1. build.gradle(app)
//userName是小程序的原始ID,path是小程序内的页面路径;(提示:如果不需要可直接删除)
MobSDK {
    appKey "mob注册app的key"
    appSecret "mob注册app的appSecret"
    ShareSDK {
        loopShare true
        ffmpeg true
        devInfo {
            Wechat {
                id 1
                sortId 1
                appId "微信注册app的key"
                appSecret "微信注册app的appSecret"
                callbackUri "http://sharesdk.cn"
                userName "小程序的原始ID"
                path "小程序内的页面路径"
                withShareTicket true
                miniprogramType 0
                bypassApproval false
                enable true
            }
        }
    }
}
  1. gradle.properties中添加代码
 MobSDK.spEdition=FP

图示

在这里插入图片描述

代码混淆

ShareSDK已经做了混淆处理,再次混淆会导致不可预期的错误,请在你的混淆脚本中添加如下的配置,跳过对ShareSDK的混淆操作

在这里插入图片描述

实战使用

我们经常集成三方平台的SDK,大多都是Application内进行初始化,但是Mob这方便可能有点小不同

Android这些年对用户的隐私保护越来越高,对开发的兼容适配要求也越来越高,所以在调用 Mob SDK 前,最好让用户确定隐私授权Mob 是这样告知告知开发者的

接口调用
回传用户隐私授权结果(submitPolicyGrantResult
为保证您的App在集成MobSDK之后能够满足工信部相关合规要求,您应确保App安装首次冷启动且取得用户阅读您《隐私政策》授权之后,调用MobSDK.submitPolicyGrantResult回传隐私协议授权结果
反之,如果用户不同意您App《隐私政策》授权,则不能调用MobSDK.submitPolicyGrantResult回传隐私协议授权结果。 相关隐私声明请参考合规指南

故我认知为有以下几个场景可以直接进行MobSDK.submitPolicyGrantResult初始化

  • 用户同意隐私协议后设置 MobSDK.submitPolicyGrantResult(true);

在这里插入图片描述

  • Application 内直接设置 MobSDK.submitPolicyGrantResult(true);
  • 调用三方登录、三方分享时设置 MobSDK.submitPolicyGrantResult(true);
三方登陆

mob的三方登陆可以直接 → 在鉴权完成之后,获取到用户信息,以及 token

    /**
     * mob 微信登录
     * */
    fun weChatMobLogin(context: Activity, listener: WxListener) {
        /**
         * 回传用户隐私授权结果
         * @param isGranted     用户是否同意隐私协议
         * @param callback      接口执行结果,可为null
         * 如果已经在其他地方进行过初始化,则可以删除此行,主要为了避免问题
         */
        MobSDK.submitPolicyGrantResult(true, null)
		//获取设置对应的对应平台(这里是微信)
        val wechat = ShareSDK.getPlatform(Wechat.NAME)
        //判定客户端是否可用
        if (wechat.isClientValid) {
            //客户端可用
            Log.d("ShareSDK", "可用客户端")
        }else{
            Toast.makeText(context, "微信未安装,请先安装微信", Toast.LENGTH_LONG).show();
        }
    	
    	//判断指定平台是否已经完成授权
        if (wechat.isAuthValid) {
            wechat.removeAccount(true);
        }
        
        wechat.platformActionListener = object : PlatformActionListener {
            override fun onComplete(platform: Platform, i: Int, hashMap: HashMap<String?, Any?>?) {
                listener.onComplete(platform.db.token)
                /*platform.getDb().exportData()获取用户公共信息*/
                Log.d("ShareSDK", "onComplete ---->  登录成功" + platform.db.exportData())
            }

            override fun onError(platform: Platform?, i: Int, throwable: Throwable) {
                Log.d("ShareSDK", "onError ---->  登录失败$throwable")
                Log.d("ShareSDK", "onError ---->  登录失败" + throwable.stackTrace.toString())
                Log.d("ShareSDK", "onError ---->  登录失败" + throwable.message)
            }

            override fun onCancel(platform: Platform?, i: Int) {
                Log.d("ShareSDK", "onCancel ---->  登录取消")
            }
        }
        //单点登录,设置为false,优先采用客户端授权
         wechat.SSOSetting(false)
        //获取(指定账号)用户信息,直接设置成null
        wechat.showUser(null)
        //抖音登录适配安卓9.0
        ShareSDK.setActivity(context);
        //获取登录用户的信息,如果没有授权,会先授权,然后获取用户信息
        wechat.authorize()
    }
三方分享

内部的俩个方法没啥区别,都能用

   /**
     * 微信示例 - 自我测试示例
     * */
    fun shareWx() {
        val sp = Platform.ShareParams()
        sp.title = "测试分享的标题"
        sp.titleUrl = "http://sharesdk.cn" // 标题的超链接
        sp.text = "测试分享的文本"
        sp.imageUrl = "http://www.someserver.com/测试图片网络地址.jpg"
        sp.site = "发布分享的网站名称"
        sp.siteUrl = "发布分享网站的地址"
        val wx = ShareSDK.getPlatform(Wechat.NAME)
        // 设置分享事件回调(注:回调放在不能保证在主线程调用,不可以在里面直接处理UI操作)
        wx.platformActionListener = object : PlatformActionListener {
            override fun onError(arg0: Platform, arg1: Int, arg2: Throwable) {
                // 分享失败的回调,arg:平台对象,arg1:表示当前的动作(9表示分享),arg2:异常信息
                Log.d("ShareSDK", "分享失败的回调")
            }

            override fun onComplete(
                arg0: Platform?,
                arg1: Int,
                p2: java.util.HashMap<String, Any>?,
            ) {
                // 分享成功的回调
                Log.d("ShareSDK", "分享成功的回调")

            }

            override fun onCancel(arg0: Platform, arg1: Int) {
                // 取消分享的回调
                Log.d("ShareSDK", "取消分享的回调")

            }
        }
        // 执行图文分享
        wx.share(sp)
    }

    /**
     * 微信分享(项目所用) - mob客户提供 
     * */
     fun wechatShare() {
        //隐私协议授权 
        MobSDK.submitPolicyGrantResult(true);
        val sp = Platform.ShareParams()
        sp.title = "开心就好"
        sp.text = "测试"
        sp.url = "http://f.moblink.mob.com/pro/scene/novel/?id=0&mobid=7670310798648901632""
        sp.imageUrl = "分享图片.png"
        //分享图片的类型webp 缩略图
        sp.shareType = Platform.SHARE_WEBPAGE
        //分享的平台,此处为微信
        val WX = ShareSDK.getPlatform(Wechat.NAME)
        //分享回调
        WX.platformActionListener = object : PlatformActionListener {
            override fun onComplete(
                platform: Platform?,
                i: Int,
                hashMap: java.util.HashMap<String?, Any?>?,
            ) {
                Log.d("ShareSDK", "onComplete ---->  分享成功")
            }

            override fun onError(platform: Platform, i: Int, throwable: Throwable) {
                Log.d("ShareSDK", "onError ---->  分享失败" + throwable.stackTrace.toString())
                Log.d("ShareSDK", "onError ---->  分享失败" + throwable.message)
            }

            override fun onCancel(platform: Platform, i: Int) {
                Log.d("ShareSDK", "onCancel ---->  分享取消")
            }
        }
        //分享
        WX.share(sp)
    }
封装工具
package com.xxx.xx.utils

import android.app.Activity
import android.content.Context
import android.util.Log
import android.widget.Toast
import cn.sharesdk.framework.Platform
import cn.sharesdk.framework.PlatformActionListener
import cn.sharesdk.framework.ShareSDK
import cn.sharesdk.onekeyshare.OnekeyShare
import cn.sharesdk.wechat.friends.Wechat
import com.mob.MobSDK

object WxPlatformUtil {

    interface WxListener {
        fun onComplete(code:String)
    }

    /**
     * mob 微信登录
     * */
    fun weChatMobLogin(context: Activity, listener: WxListener) {
        /**
         * 回传用户隐私授权结果
         * @param isGranted     用户是否同意隐私协议
         * @param callback      接口执行结果,可为null
         */
        MobSDK.submitPolicyGrantResult(true, null)

        val wechat = ShareSDK.getPlatform(Wechat.NAME)
        //判定客户端是否可用
        if (wechat.isClientValid) {
            //客户端可用
            Log.d("ShareSDK", "可用客户端")
        }else{
            Toast.makeText(context, "微信未安装,请先安装微信", Toast.LENGTH_LONG).show();
        }
        
    	//判断指定平台是否已经完成授权
        if (wechat.isAuthValid) {
            wechat.removeAccount(true);
        }
        
        wechat.platformActionListener = object : PlatformActionListener {
            override fun onComplete(platform: Platform, i: Int, hashMap: HashMap<String?, Any?>?) {
                listener.onComplete(platform.db.token)
                /*platform.getDb().exportData()获取用户公共信息*/
                Log.d("ShareSDK", "onComplete ---->  登录成功" + platform.db.exportData())
            }

            override fun onError(platform: Platform?, i: Int, throwable: Throwable) {
                Log.d("ShareSDK", "onError ---->  登录失败$throwable")
                Log.d("ShareSDK", "onError ---->  登录失败" + throwable.stackTrace.toString())
                Log.d("ShareSDK", "onError ---->  登录失败" + throwable.message)
            }

            override fun onCancel(platform: Platform?, i: Int) {
                Log.d("ShareSDK", "onCancel ---->  登录取消")
            }
        }
        //单点登录,设置为false,优先采用客户端授权
         wechat.SSOSetting(false)
        //获取(指定账号)用户信息,直接设置成null
        wechat.showUser(null)
        //抖音登录适配安卓9.0
        ShareSDK.setActivity(context);
        //获取登录用户的信息,如果没有授权,会先授权,然后获取用户信息
        wechat.authorize()
    }


    /**
     * 微信示例 - 自我测试示例
     * */
    fun shareWx() {
        val sp = Platform.ShareParams()
        sp.title = "测试分享的标题"
        sp.titleUrl = "http://sharesdk.cn" // 标题的超链接
        sp.text = "测试分享的文本"
        sp.imageUrl = "http://www.someserver.com/测试图片网络地址.jpg"
        sp.site = "发布分享的网站名称"
        sp.siteUrl = "发布分享网站的地址"
        val wx = ShareSDK.getPlatform(Wechat.NAME)
        // 设置分享事件回调(注:回调放在不能保证在主线程调用,不可以在里面直接处理UI操作)
        wx.platformActionListener = object : PlatformActionListener {
            override fun onError(arg0: Platform, arg1: Int, arg2: Throwable) {
                // 分享失败的回调,arg:平台对象,arg1:表示当前的动作(9表示分享),arg2:异常信息
                Log.d("ShareSDK", "分享失败的回调")
            }

            override fun onComplete(
                arg0: Platform?,
                arg1: Int,
                p2: java.util.HashMap<String, Any>?,
            ) {
                // 分享成功的回调
                Log.d("ShareSDK", "分享成功的回调")

            }

            override fun onCancel(arg0: Platform, arg1: Int) {
                // 取消分享的回调
                Log.d("ShareSDK", "取消分享的回调")

            }
        }
        // 执行图文分享
        wx.share(sp)
    }

    /**
     * 微信分享 - mob客户提供 用了
     * */
    var shareUrl = "http://f.moblink.mob.com/pro/scene/novel/?id=0&mobid=7670310798648901632"
    //通过微信分享链接
     fun wechatShare() {
        MobSDK.submitPolicyGrantResult(true);
        val sp = Platform.ShareParams()
        //sp.text = "测试"
        sp.title = "开心就好"
        sp.url = shareUrl
        sp.imageUrl = "分享图片.png"
        sp.shareType = Platform.SHARE_WEBPAGE
        val WX = ShareSDK.getPlatform(Wechat.NAME)
        WX.platformActionListener = object : PlatformActionListener {
            override fun onComplete(
                platform: Platform?,
                i: Int,
                hashMap: java.util.HashMap<String?, Any?>?,
            ) {
                Log.d("ShareSDK", "onComplete ---->  分享成功")
            }

            override fun onError(platform: Platform, i: Int, throwable: Throwable) {
                Log.d("ShareSDK", "onError ---->  分享失败" + throwable.stackTrace.toString())
                Log.d("ShareSDK", "onError ---->  分享失败" + throwable.message)
            }

            override fun onCancel(platform: Platform, i: Int) {
                Log.d("ShareSDK", "onCancel ---->  分享取消")
            }
        }
        WX.share(sp)
    }

    /**
     * 自找平台分享方法 - 备用
     * */
    private fun showShare(platform: String?) {
        val oks = OnekeyShare()
        //指定分享的平台,如果为空,还是会调用九宫格的平台列表界面
        if (platform != null) {
            oks.setPlatform(platform)
        }
        // title标题,印象笔记、邮箱、信息、微信、人人网和QQ空间使用
        oks.setTitle("标题")
        // titleUrl是标题的网络链接,仅在Linked-in,QQ和QQ空间使用
        oks.setTitleUrl("http://sharesdk.cn")
        // text是分享文本,所有平台都需要这个字段
        oks.text = "我是分享文本"
        //分享网络图片,新浪微博分享网络图片需要通过审核后申请高级写入接口,否则请注释掉测试新浪微博
        oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/02/26/owWpLZo_638x960.jpg")
        // url仅在微信(包括好友和朋友圈)中使用
        oks.setUrl("http://sharesdk.cn")
        //启动分享
        oks.show(MobSDK.getContext())
    }

}
使用方式
  • 三方登陆
   WxPlatformUtil.weChatMobLogin(this,object : WxPlatformUtil.WxListener {
                    override fun onComplete(code: String) {
                        code.isNullOrEmpty().let {
                            if (!it){
                            	//这里逻辑自己定义就好
                                mViewModel.wxLogin(code)
                            }
                        }
                    }
                })
  • 三方分享
  WxPlatformUtil.wechatShare()
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:27:25  更:2022-09-13 11:32:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 5:52:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码