【Unity】ShareSDK接入

直奔主题、复制粘贴式接入SDK方法!本章只是起一个向导作用!代码部分就不贴了,如果有人还是不懂,我会贴一下。

一、以“新浪微博”认证、用户信息获取、分享信息为例说明(入门)

找到ShadreSDK的Unity集成文档 

根据官方文档说明操作

【Unity】ShareSDK接入_第1张图片

第一步获取AppKey、第二部下载SDK完成后,第三部导入SDK后,上图的说明是特别要注意的,点进绿圈按说明操作。

本人在这里遇到一个问题,导入工程到eclipse后,出现缺失gen文件问题,解决方法:

【Unity】ShareSDK接入_第2张图片【Unity】ShareSDK接入_第3张图片

此方法并不适用于所有人,问题出在我之前选的是Google APIs作为Porject Build Target(无语)。

接着,再根据ShareSDK官方文档说明流程继续走,直到将工程打开将ShareSDK脚本拖放到物体身后,根据第一步生成的Appkey和App secret修改后,还需要本章所说的新浪微博(Sinaweibo)的App key和App secret。

【Unity】ShareSDK接入_第4张图片

如何获取新浪微博的Appkey和App  secret呢?

ShareSDK各社交平台申请APPkey 的网址及申请流程汇总(全部在这里面)

新浪微博开发者获取AppkeyAppscret(新浪微博开放平台,怕上面的url不见了就贴这里咯)

上面的这2个url都失效了的话就自己百度找找吧。

进入新浪微博开放平台后,本例是移动应用故进行如下流程创建一个应用。

【Unity】ShareSDK接入_第5张图片(接着就是按着步骤走,我就不截图了)

注意!!!应用平台只选android,我目前只会android,iphone的创建应用流程会多一个步骤的!这个我不太清楚。就是下面这些Apple ID: Bundle ID。

【Unity】ShareSDK接入_第6张图片

其中,Android包名是指之前改写AndroidMainfest.xml的那个包名, Android签名是用MD5签名生成工具生成的,这个工具在

【Unity】ShareSDK接入_第7张图片

MD5签名工具是一个apk,要放到真机手机上进行生成签名的,而且你要先把你UNITY工程发布APK到这个真机手机上,运行一次后,才使用这个签名工具根据包名生成签名!(我日佐狗啊!)

之后的信息随便填填就OK了。还有本人发现,这些信息是不用填的,虽然它写着必填。。。

【Unity】ShareSDK接入_第8张图片

创建成功后,去到我的应用选择你刚才创建的应用,然后修改这里一定要改成下面一样的!!不然认证会失败!!

【Unity】ShareSDK接入_第9张图片

这个授权回调页是ShareSDK上的下图url

【Unity】ShareSDK接入_第10张图片(不要改动这个url!)

然后你就可以用了,注意,要先认证,再做别的事情!认证代码在官方案例有。我代码要不要给出来呢。。。思考一下感觉还是不用,因为我的代码也是的官方文档复制过来的。反正,要注意先认证!!还有就是你不能在UNITY运行时候进行测试这些SDK功能,而是要发布到真机或模拟器上进行测试!

二、使用认证后反馈信息显示用户ID、用户名、用户头像

其中,Application.persistentDataPath 在Android上代表的路径解释可自行百度知道,还有其他的请自行理解。


   ssdk.authHandler = AuthResultHandler;//认证后回调
    //认证新浪微博
   ssdk.Authorize(PlatformType.SinaWeibo);

    /// 
    /// 授权认证回调
    /// 
    void AuthResultHandler(int reqID, ResponseState state, PlatformType type, Hashtable result)
    {
        if (state == ResponseState.Success)
        {  
            Utility.WriteFile(Application.persistentDataPath, 
            "AuthSinaWeiboCallBackResult.txt", result.toJson());
            Utility.WriteFile(Application.persistentDataPath, 
            "AuthSinaWeiboDetailInfo.txt", ssdk.GetAuthInfo(PlatformType.SinaWeibo).toJson());        
            //根据获取到的用户信息设置用户头像、ID、名称
            iconImg.gameObject.SetActive(true);
            //多此一举的再次读取上面写入的文件,其实直接用result就OK了的,就是为了测试!!
            Hashtable authoResult = Utility.ReadFile(Application.persistentDataPath,
             "AuthSinaWeiboCallBackResult.txt").hashtableFromJson();
            //读取用户各种信息用文本、图片形式显示出来
            userId.text = authoResult["userID"].ToString();
            userName.text = Utility.UnicodeToString(authoResult["nickname"].ToString());
            //使用一个协程根据url用WWW加载图片并设置头像
            StartCoroutine(LoadUserIconAndSetToUserIconImg(authoResult["icon"].ToString()));
//Utility是我自己定义的类,下面这句代码是调用android的Toast.makeText()方法显示一个Tip弹窗
            Utility.MakeToast("登录成功!");
        }
        else if (state == ResponseState.Fail)
        {
            debugText.text = "fail! throwable stack = " + result["stack"] + "; error msg = " + result["msg"];
            ssdk.CancelAuthorize(type);
            Utility.MakeToast("登录失败!");
        }
        else if (state == ResponseState.Cancel)
        {
            debugText.text = "cancel !";
            ssdk.CancelAuthorize(type);
            Utility.MakeToast("取消登录");
        }
    }

    /// 
    /// 加载用户头像并设置头像
    /// 
    /// 
    /// 
    IEnumerator LoadUserIconAndSetToUserIconImg(string iconUrl)
    {
        WWW www = new WWW(iconUrl);
        Utility.MakeToast("加载url:" + iconUrl);
        yield return www;
        if (www.isDone && string.IsNullOrEmpty(www.error))
        {
            string contentType = www.responseHeaders["CONTENT-TYPE"];
            var contents = contentType.Split('/');
            if (contents[0] == "image")
            {
                if (contents[1].ToLower() == "png" || contents[1].ToLower() == "jpeg"
                    || contents[1].ToLower() == "jpg")
                {
                    Texture2D texture2D = www.texture;
                    if (texture2D != null)
                    {
                        iconImg.sprite = Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), Vector2.zero);
                    }
                }
                else//gif格式图片加载方式不同,下面是android处理方式
                {                                      
                    //尝试直接用File文件流方式加载成功,但是因为不能直接改后缀来转格式故失败!
                    //PC端转格式方式需要用到System.Drawing.dll,但是它不能在android环境下使用(失败)
                    //最后一种方法通过Android端来转格式,然后Unity再进行加载转格式后的图片(最有可能性成功的)
                    //下面Android处理方式因Resouruces文件夹加载方式不能在发布apk后进行加载(只能是编辑器模式下Assets加载下或发布PC端可以加载)
                    //将图片下载到Resouces文件夹 再用Resouces加载
                    string fileName = System.DateTime.Now.ToString("yyyyMMddhhmmssffff");
                    if (!Directory.Exists(dict))
                    {
                        Directory.CreateDirectory(dict);
                    }
                    string filePath = dict + fileName + "." + contents[1];
                    string fileJpgPath = dict + fileName + ".jpg";
                    //将gif图片写入filePath路径
                    File.WriteAllBytes(filePath, www.bytes);

                    debugText.text = "开始调用android方法转格式!";
                    //调用android的方法转格式
                    AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                    AndroidJavaObject jo = jc.GetStatic("currentActivity");
                    //gif格式转jpeg格式输出到fileJpgPath
                    jo.Call("ChangeToJpeg", filePath, fileJpgPath);            
                    try
                    {
                        using (FileStream fs = new FileStream(fileJpgPath, FileMode.Open, FileAccess.ReadWrite))
                        {
                            byte[] bytes = new byte[fs.Length];
                            fs.Read(bytes, 0, (int)fs.Length);
                            Texture2D texture2D = new Texture2D(150, 150);
                            texture2D.LoadImage(bytes);
                            iconImg.sprite = Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f));
                            Utility.MakeToast("加载完满结束!");
                        }
                    }
                    catch (Exception e)
                    {
                        debugText.text = e.Message.ToString();
                        Utility.MakeToast(e.Message.ToString());
                    }                                      
                }
            }
        }
    }
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Text.RegularExpressions;
using System;

public static class Utility {

    public static void WriteFile(string path, string name, string info)
    {
        StreamWriter writer;
        FileInfo fi = new FileInfo(path + "/" + name);
        writer = fi.CreateText();
        writer.WriteLine(info);
        writer.Close();
        writer.Dispose();
    }

    public static string ReadFile(string path, string name)
    {
        StreamReader reader;
        FileInfo fi = new FileInfo(path + "/" + name);
        reader = fi.OpenText();
        string info = reader.ReadToEnd();
        reader.Close();
        reader.Dispose();
        return info;
    }
//调用Android的Toast功能进行弹窗
    public static void MakeToast(string info)
    {
        AndroidJavaObject currentActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic("currentActivity");
        AndroidJavaClass toast = new AndroidJavaClass("android.widget.Toast");
        currentActivity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
        {
            toast.CallStatic("makeText", currentActivity, info, toast.GetStatic("LENGTH_LONG")).Call("show");
        }));
    }
  //处理中文乱码问题的,一般用户名都需要它来显示
    public static string UnicodeToString(string unicode)
    {
        Regex reg = new Regex(@"(?i)\\[uU]([0-9a-f]{4})");
        return reg.Replace(unicode, delegate (Match m)
        {
            return ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString();
        });
    }
}

Android代码:

  public void ChangeToJpeg(String filePath, String outPath) {//将图片文件转化为字节数组字符串,并对其进行Base64编码处理
        //读取图片字节数组
//        UnityPlayer.UnitySendMessage("Main Camera", "ChangeToJpegCallBack",
//                "Unity调用android: filepath"+filePath +",outPath:"+outPath);
        convertToJpg(filePath, outPath);
    }
    private static void convertToJpg(String pngFilePath, String jpgFilePath) {
        Bitmap bitmap = BitmapFactory.decodeFile(pngFilePath);
        try {
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(jpgFilePath));
            if (bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos)) {
                bos.flush();
            }
            bos.close();
        } catch (IOException e) {
//            UnityPlayer.UnitySendMessage("Main Camera", "ChangeToJpegCallBack",
//                    "");
        } finally {
            bitmap.recycle();
            bitmap = null;
        }
        //删除非JPG照片
        if (!pngFilePath.equals(jpgFilePath)) {
            File oldImg = new File(pngFilePath);
            oldImg.delete();
        }
    }

其中convertToJpg方法出自:https://blog.csdn.net/iblade/article/details/79153769(详细解释)

注意:一定要用这种方法才可以正常地显示出gif格式图片,为什么要说到gif格式图片呢,因为有些用户头像是gif的!!而我恰恰就是gif的那个,搞了很久了就此解释下。

其他相关参考资料:

较全面的ShareSdk案例

Android授权APP问题

别人已经总结过的,我就不再多说了,其他功能待测试,上面那个GIF转格式问题已经弄了很久(2天)才解决,哎。。

你可能感兴趣的:(Unity3d,接入各种SDK,Android)