Unity 接入 Android ShareSDK

来源:互联网 发布:完美数c语言编程 编辑:程序博客网 时间:2024/05/17 22:27

Unity 接入 Android ShareSDK

网上已经很多关于Unity 接入 ShareSDK 的例子,大多使用的是 ShareSDK For Unity3d 直接导入到Unity 中使用,下面使用 Android 的 ShareSDK 接入到 Unity3d 中

ShareSDK官网
进入 SDK下载页,现在 ShareSDK For Android
这里写图片描述

下载 SDK 选择需要的 平台
这里写图片描述

找到 开发文档,有比较全操作说明
这里写图片描述

下载后解压打开 ShareSDK for Android 文件夹
这里写图片描述

文件中附带一个快速集成工具 QuickIntegrater.jar,
打开 QuickIntegrater.jar,如果无法正常打开,网上搜一下如何解决
上一步下载时选择的平台库才会出现在下面供选择
这里写图片描述
选择需要的平台, 确认
会生成一个 Sample 的工程
这里写图片描述

Sample 下包含四个文件夹, assets,libs,res,src

开始Android 工程
打开 Android Studio
new -> Module
这里写图片描述

选择 Android Library
这里写图片描述

这里写图片描述

这里写图片描述

首先将自带的 src-> androidTest, src -> test 等无用的删除

打开 Open Module Setting 将不需要的依赖删除
这里写图片描述
build.gradle 中 dependencies 只剩一行,这一行配置就表示自动依赖libs下的所有 .jar 库了,不需要一个一个手动选择依赖了,就是省事

dependencies {    implementation fileTree(dir: 'libs', include: ['*.jar'])}

打开上面的 Sample,将文件夹中的内容对应的放入 sharesdkdemo 中
如果 工程中没有的目录,则在相应的位置创建一个即可

Sample\assets\ShareSDK.xml 放入 sharesdkdemo ->src->main->assets 下

Sample\libs 下的所有 .jar 放入 sharesdkdemo -> libs 下

Sample\res 下所有文件放入 sharesdkdemo -> src -> main -> res 下相应文件夹

Sample\src\cn 放入 sharesdkdemo ->main -> java

最终如下
这里写图片描述

在 src -> main -> java -> com.sharesdkdemo.demo 下创建一个 ShareSDKSingle.java 不需要继承任何类,如下

package com.sharesdkdemo.demo;public class ShareSDKSingle {}

引入库 import cn.sharesdk.onekeyshare.OnekeyShare;
完成 ShareSDKSingle 代码

package com.sharesdkdemo.demo;import android.app.Activity;import android.content.Context;import android.widget.Toast;import cn.sharesdk.onekeyshare.OnekeyShare;public class ShareSDKSingle {    private static ShareSDKSingle instance;  // 单利    // 暂存 UnityPlayerActivity 的 Context    private Context unityContext;    // 暂存 UnityPlayerActivity 的 Activity    private Activity unityActivity;    public ShareSDKSingle()    {    }    // 获取单利    public static ShareSDKSingle getInstance()    {        if (instance == null)        {            instance = new ShareSDKSingle();        }        return instance;    }    public void  init(Context _context)    {        // 获取到 UnityPlayerActivity 的 Context 和 Activity        unityContext = _context.getApplicationContext();        unityActivity = (Activity) _context;    }    // 将官网提供的事例代码直接复制过来    public void showShare() {        final OnekeyShare oks = new OnekeyShare();        //关闭sso授权        oks.disableSSOWhenAuthorize();        // title标题,印象笔记、邮箱、信息、微信、人人网和QQ空间等使用        oks.setTitle("标题");        // titleUrl是标题的网络链接,QQ和QQ空间等使用        oks.setTitleUrl("http://sharesdk.cn");        // text是分享文本,所有平台都需要这个字段        oks.setText("我是分享文本");        // imagePath是图片的本地路径,Linked-In以外的平台都支持此参数        //oks.setImagePath("/sdcard/test.jpg");//确保SDcard下面存在此张图片        // url仅在微信(包括好友和朋友圈)中使用        oks.setUrl("http://sharesdk.cn");        // comment是我对这条分享的评论,仅在人人网和QQ空间使用        oks.setComment("我是测试评论文本");        // site是分享此内容的网站名称,仅在QQ空间使用        //oks.setSite(getString(R.string.app_name));        // siteUrl是分享此内容的网站地址,仅在QQ空间使用        oks.setSiteUrl("http://sharesdk.cn");        // 启动分享GUI,将 UnityPlayerActivity 的 Context 传递进去        oks.show(unityContext);        // 必须要在UnityActivity UI 主线程中调用显示 UI        unityActivity.runOnUiThread(new Runnable() {            @Override            public void run() {                Toast.makeText(unityContext, "打开分享", Toast.LENGTH_SHORT).show();                oks.show(unityContext);            }        });    }}

然后找到开发文档中 配置 Android Manifest.xml,

最初 AndroidManifest.xml 如下
这里写图片描述

按照文档开始添加

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.sharesdkdemo.demo" >    <!-- 添加必要的权限 -->    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>    <uses-permission android:name="android.permission.GET_TASKS" />    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <!-- 短信验证登陆功能需要添加次权限来自动填充验证码,用不到可以去掉 -->    <uses-permission android:name="android.permission.RECEIVE_SMS" />    <!-- 以MobApplication作为项目Application -->    <application        android:name="com.mob.MobApplication">        <!-- 其它的activity -->        <!-- ShareSDK的activity -->        <activity            android:name="com.mob.tools.MobUIShell"            android:theme="@android:style/Theme.Translucent.NoTitleBar"            android:configChanges="keyboardHidden|orientation|screenSize"            android:windowSoftInputMode="stateHidden|adjustResize" >            <!-- 调用新浪原生SDK,需要注册的回调activity -->            <intent-filter>                <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>            <!--集成line客户端登录授权,需要添如下格式的过滤器-->            <intent-filter>                <data android:scheme="line.1477692153" />                <action android:name="android.intent.action.VIEW"/>                <category android:name="android.intent.category.BROWSABLE" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>            <!-- ShareSDK<strong>3.1.0版本之前</strong>才需要在MobUIShell下面注册此意图,3.1.0版本之后(包含3.1.0)不需要注册此intent-->            <intent-filter>                <data android:scheme="tencent100371282" />                <action android:name="android.intent.action.VIEW" />                <category android:name="android.intent.category.BROWSABLE" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>        </activity>        <!-- 填写您从Mob开发者后台中得到的Appkey和AppSecret -->        <meta-data android:name="Mob-AppKey" android:value="232e58178a2a1"/>        <meta-data android:name="Mob-AppSecret" android:value="bf84d52d60e0ebadf780615b9a95222f"/>        <activity            android:name="cn.sharesdk.tencent.qq.ReceiveActivity"            android:launchMode="singleTask"            android:noHistory="true">            <intent-filter>                <action android:name="android.intent.action.VIEW" />                <category android:name="android.intent.category.DEFAULT" />                <category android:name="android.intent.category.BROWSABLE" />                <data android:scheme="tencent100371282" />            </intent-filter>        </activity>        <activity            android:name="cn.sharesdk.demo.wxapi.WXEntryActivity"            android:theme="@android:style/Theme.Translucent.NoTitleBar"            android:configChanges="keyboardHidden|orientation|screenSize"            android:exported="true"            android:screenOrientation="portrait" />        <activity            android:name="cn.sharesdk.demo.yxapi.YXEntryActivity"            android:theme="@android:style/Theme.Translucent.NoTitleBar"            android:configChanges="keyboardHidden|orientation|screenSize"            android:exported="true"            android:screenOrientation="portrait" />        <!-- 支付宝分享回调 -->        <activity            android:name="cn.sharesdk.demo.apshare.ShareEntryActivity"            android:theme="@android:style/Theme.Translucent.NoTitleBar"            android:configChanges="keyboardHidden|orientation|screenSize"            android:exported="true"/>        <!--钉钉分享回调-->        <activity            android:name="cn.sharesdk.demo.ddshare.DDShareActivity"            android:launchMode="singleInstance"            android:exported="true">            <intent-filter>                <action android:name="android.intent.action.VIEW"></action>                <category android:name="android.intent.category.DEFAULT"></category>            </intent-filter>        </activity>    </application></manifest>

上面很多配置都是 ShareSDK 官网上的默认配置,实际项目中需要自己到相应平台去申请审核需要的 AppKey,AppKeyID 之类的数据,

AndroidManifest.xml 中找到
这个地方, Appkey 和 AppSecret 需要在 ShareSDK官网申请,
登录 ShareSDK 账号进入后台
添加应用
这里写图片描述

自动生成 Appkey 和 App Secret
在左边选择需要接入的 功能,在此只选择了 ShareSDK,只有选择的功能才能在真正上线的 APP 使用

然后将这个 library 库 Module 依赖到一个 主 Module app中,
app 为一个空的 Android Library
app 中添加了 Unity classes.jar,一个 MainActivity.java 继承于 UnityPlayerActivity

app -> open module setting 添加对 sharesdkdemo 的依赖
这里写图片描述

这里写图片描述

这里写图片描述

MainActivity.java 中添加对 sharesdkdemo 的调用

package com.testSdk.demo;import android.os.Bundle;import android.widget.Toast;import com.unity3d.player.UnityPlayer;import com.unity3d.player.UnityPlayerActivity;import com.sharesdkdemo.demo.ShareSDKSingle;public class MainActivity extends UnityPlayerActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        ShareSDKSingle shareSDKSingle = ShareSDKSingle.getInstance();        shareSDKSingle.init(MainActivity.this);    }    public void showShare()    {        ShareSDKSingle.getInstance().showShare();    }}

app Module 中 AndroidManifest.xml 配置如下

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.testSdk.demo">    <application        android:allowBackup="true"        android:label="@string/app_name"        android:icon="@drawable/app_icon"        android:supportsRtl="true"        >        <activity android:name="com.testSdk.demo.MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>

准备完成,执行 Build -> Rebuild Project 生成 aar
将 app Module 和 sharesdkdemo Module 生成的 aar 拷贝到 Unity 工程 Plugins\Android 下,用解压文件打开 aap-debug.jar 将 libs 下 classes.jar 删除,将 app-debug.jar 中 AndroidManifest.xml 拷贝出来放到 Plugins\Android 下

这里写图片描述

开始 C#代码

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class TestXunFei : MonoBehaviour {    public Text text;    public Button shareBtn;    // Use this for initialization    void Start () {        shareBtn.onClick.AddListener(ShareOnClick);    }    private void ShareOnClick()    {        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))        {            using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))            {                ShowText("showShare enter");                jo.Call("showShare");            }        }    }    private void ShowText(string _str)    {        text.text = _str;    }}

打包 APK,成功
安装到模拟器上测试
这里写图片描述

点击 Share 按钮弹出分享窗口
这里写图片描述

点击空白位置分享窗口隐藏
点击QQ弹出 QQ 登录界面
这里写图片描述

登录后选择要分享的好友
这里写图片描述

这里写图片描述

点击返回,回到 Unity 游戏场景,显示分享成功
这里写图片描述

打开刚才被分享的 QQ
这里写图片描述

到此使用 Android ShareSDK 接入 Unity 测试成功,不想使用 ShareSDK for Unity 原因是,ShareSDK For Unity 很多参数需要在Unity C# 代码中配置,不方便