直奔主题、复制粘贴式接入SDK方法!本章只是起一个向导作用!代码部分就不贴了,如果有人还是不懂,我会贴一下。
找到ShadreSDK的Unity集成文档
根据官方文档说明操作
第一步获取AppKey、第二部下载SDK完成后,第三部导入SDK后,上图的说明是特别要注意的,点进绿圈按说明操作。
本人在这里遇到一个问题,导入工程到eclipse后,出现缺失gen文件问题,解决方法:
此方法并不适用于所有人,问题出在我之前选的是Google APIs作为Porject Build Target(无语)。
接着,再根据ShareSDK官方文档说明流程继续走,直到将工程打开将ShareSDK脚本拖放到物体身后,根据第一步生成的Appkey和App secret修改后,还需要本章所说的新浪微博(Sinaweibo)的App key和App secret。
如何获取新浪微博的Appkey和App secret呢?
ShareSDK各社交平台申请APPkey 的网址及申请流程汇总(全部在这里面)
新浪微博开发者获取AppkeyAppscret(新浪微博开放平台,怕上面的url不见了就贴这里咯)
上面的这2个url都失效了的话就自己百度找找吧。
进入新浪微博开放平台后,本例是移动应用故进行如下流程创建一个应用。
注意!!!应用平台只选android,我目前只会android,iphone的创建应用流程会多一个步骤的!这个我不太清楚。就是下面这些Apple ID: Bundle ID。
其中,Android包名是指之前改写AndroidMainfest.xml的那个包名, Android签名是用MD5签名生成工具生成的,这个工具在
MD5签名工具是一个apk,要放到真机手机上进行生成签名的,而且你要先把你UNITY工程发布APK到这个真机手机上,运行一次后,才使用这个签名工具根据包名生成签名!(我日佐狗啊!)
之后的信息随便填填就OK了。还有本人发现,这些信息是不用填的,虽然它写着必填。。。
创建成功后,去到我的应用选择你刚才创建的应用,然后修改这里一定要改成下面一样的!!不然认证会失败!!
这个授权回调页是ShareSDK上的下图url
然后你就可以用了,注意,要先认证,再做别的事情!认证代码在官方案例有。我代码要不要给出来呢。。。思考一下感觉还是不用,因为我的代码也是的官方文档复制过来的。反正,要注意先认证!!还有就是你不能在UNITY运行时候进行测试这些SDK功能,而是要发布到真机或模拟器上进行测试!
其中,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天)才解决,哎。。