概要

测试使用ShareSDK的一些常用功能。包括:

  • 用微博帐号做第三方登录
  • 获取用户的帐号详细信息
  • 获取好友列表
  • 分享功能

测试使用SMSSDK插件,包括:

  • 导入插件,解决包冲突
  • 短信登录功能:发验证码,收验证码,比对验证码

学习资料:


用微博帐号做第三方登录

1、在mob.com上注册帐号,添加一个应用,给该应用添加ShareSDK。
2、登录微博开放平台,填写开发者信息。添加一个应用,确定安卓包名,下载微博提供的签名生成工具(md5签名生成器apk),安装到安卓手机上。打开工具输入安卓包名,得到签名字符串。把包名和签名填上。在OAuth2.0授权设置中输入回调页url。
3、打开Unity新建一个项目,Player Settings中填上上面的包名,自己的密钥库和密钥。
4、下载ShareSDK for Unity,把包里的ShareSDK.unitypackage导入到项目中。
5、新建一个场景取名Init,一个空物体(可取名ShareSDKManager),专门用于存放全游戏中通用的(可跨场景长的、生命周期的)数据,开始游戏时先进入该场景,执行ShareSDK初始化,然后再跳转到其他游戏场景。该场景只会进入一次。
6、给ShareSDKManager物体挂上Share SDK脚本,填上在微博开放平台中给的App Key,App Secret和回调页路径Redirect Url(默认填的是官方给的Debug帐号的信息)。
7、在脚本的Dev Info中打开本次测试id新浪微博Sinaweibo进行修改。其他不用管,默认都填的官方给的Debug帐号信息。

8、新建一个ShareSDKManager脚本,挂载到ShareSDKManager物体上。
using cn.sharesdk.unity3d;
using UnityEngine; public class ShareSDKManager : MonoBehaviour {
private static ShareSDKManager _instance;
public static ShareSDKManager Instance {
get {
return _instance;
}
}

  [HideInInspector]
    public PlatformType userPlatform = PlatformType.Unknown; // 用户登录的平台(是微博登录还是短信登录)
    [HideInInspector]
    public string userID = "";
[HideInInspector]
public ShareSDK ssdk; void Start () {
_instance = this;
DontDestroyOnLoad(gameObject);
ssdk= gameObject.GetComponent<ShareSDK>();
// ShareSDK.Awake()中已经执行了shareSDKUtils.InitSDK(appKey,appSecret)初始化操作,这里是否写初始化可随意
// 初始化完成后,跳转场景
UnityEngine.SceneManagement.SceneManager.LoadScene();
}
}
9、新建一个场景取名Login,这是在Init场景之后进入的登录页面场景。新建脚本Login,挂到新建的LoginManager物体上。场景中的【用新浪微博登录】按钮触发该物体中Login脚本对应的方法。登录方法的流程参考下图。这里以应用没有用户系统的体系为例。
using cn.sharesdk.unity3d;
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement; public class Login : MonoBehaviour { ShareSDK ssdk;
void Start () {
ssdk= ShareSDKManager.Instance.shareSDK;
ssdk.authHandler = OnAuthResultHandler; // 授权结果的回调函数
} // 用新浪微博登录
public void OnSinaLoginButtonClick()
{
if (ssdk.IsAuthorized(PlatformType.SinaWeibo)) // 检测指定的平台是否已经授权过了
{
        // 写入授权信息
            Utility.WriteFile(Application.persistentDataPath, "AuthInfo.txt", ssdk.GetAuthInfo(PlatformType.SinaWeibo).toJson());
            Utility.MakeToast("微博用户:" + ssdk.GetAuthInfo(PlatformType.SinaWeibo)["userName"] + "\n登录成功!"); // 信息详情查看输入的文件
            ShareSDKManager.Instance.userPlatform = PlatformType.SinaWeibo;
            SceneManager.LoadScene(2);
}
else // 指定的平台尚未授权,给它授权
{
ssdk.Authorize(PlatformType.SinaWeibo);
}
} /// <summary>
/// 授权结果的回调函数
/// </summary>
/// <param name="reqID"></param>
/// <param name="state">授权状态:成功,失败,取消</param>
/// <param name="type">授权平台类型</param>
/// <param name="data">返回的数据</param>
void OnAuthResultHandler(int reqID, ResponseState state, PlatformType type, Hashtable data)
{
if (state == ResponseState.Success)
{
        // 授权结果写入文件
            Utility.WriteFile(Application.persistentDataPath, "AuthData.txt", data.toJson());
            Utility.WriteFile(Application.persistentDataPath, "AuthInfo.txt", ssdk.GetAuthInfo(PlatformType.SinaWeibo).toJson());
            Utility.MakeToast("微博用户:" + ssdk.GetAuthInfo(PlatformType.SinaWeibo)["userName"] + "\n登录成功!"); // 信息详情查看输入的文件
            ShareSDKManager.Instance.userPlatform = PlatformType.SinaWeibo;
            SceneManager.LoadScene(2);
}
else if (state == ResponseState.Fail)
{
// 失败或取消要清除指定平台的授权信息
ssdk.CancelAuthorize(type);
Utility.MakeToast("登录失败!");
}
else if (state == ResponseState.Cancel)
{
// 失败或取消要清除指定平台的授权信息
ssdk.CancelAuthorize(type);
Utility.MakeToast("登录被取消!");
}
}
}
写一个文件读写的工具类。
using System.IO;

/// <summary>
/// 读写文件的工具类。
/// 用于查看ShareSDK授权时返回的data中有哪些数据。
/// </summary>
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;
}
}
9、打包APK后在安卓模拟器上运行。点击【用新浪微博登录】按钮后即可看到效果:首次登录时要填微博账号和密码,输入正确后会跳转到微博授权页面,点击确定授权完成后,游戏进入下一个场景,完成操作。再次登录时直接完成操作,进入下一场景。
打开输出的两个dat文件,查看返回的详细数据。其中用户ID,用户名,用户头像等是常用的数据。这里为便于自己查看,后缀改成了txt(我用的逍遥游安卓模拟器不让选择.dat打开方式)

坑点:

  • 如果点击按钮没反应,到微博开放平台测试信息—添加测试帐号,关联到自己的微博,因为开发者身份认证未通过审核时不能拿到数据。
  • 如果点击按钮后页面回退,是Unity中ShareSDK脚本的微博App Key和App Secret没填对。(有默认的Debug帐号的数据,注意检查)。
  • 报错“你所访问的站点在微博认证失败 错误号21322 重定向地址不匹配”。是因为在Unity脚本中没有填写回调url,要跟微博开放平台中输入的回调页地址一致才行!
  • 报错 21323 : 请求不合法。该方法登录如果碰到这个问题,过一段时间后再试试就没问题了,非常诡异,也许是新浪服务端那边的问题???怀疑是请求过于频繁导致。没搞懂这个错误。

获取用户的帐号详细信息

接着上面的工程,在用户详情页中写一个脚本,在已登录的状态下获取微博账号的详情。

using cn.sharesdk.unity3d;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement; public class Info : MonoBehaviour
{
public Image userIcon;
public Text userName;
public Text userID;
ShareSDK ssdk; void Start ()
{
ssdk = ShareSDKManager.Instance.ssdk;
ssdk.showUserHandler = OnGetUserInfoResultHandler; // 在前一个场景中已把授权返回的数据写入到了本地
Hashtable authInfo = Utility.ReadFile(Application.persistentDataPath, "AuthInfo.dat").hashtableFromJson();
StartCoroutine(LoadUserIcon(authInfo["userIcon"].ToString()));
userName.text = authInfo["userName"].ToString();
userID.text = "ID:" + authInfo["userID"].ToString();
} // 协程下载用户头像Icon
IEnumerator LoadUserIcon(string url)
{
WWW www = new WWW(url);
yield return www; // 等待下载完才执行下面的代码
if (www.isDone && www.error == null)
{
Texture2D texture2D = www.texture;
userIcon.sprite = Sprite.Create(texture2D, new Rect(, , texture2D.width, texture2D.height), Vector2.zero);
}
} // 进入游戏主场景
public void OnEnterButtonClick()
{
} // 查看用户详细信息
public void OnDetailButtonClick()
{
ssdk.GetUserInfo(PlatformType.SinaWeibo);
} // 获取用户详情的回调
void OnGetUserInfoResultHandler(int reqID, ResponseState state, PlatformType type, Hashtable data)
{
if (state == ResponseState.Success)
{
// 将用户详情写入文件中,之后随意使用。
Utility.WriteFile(Application.persistentDataPath, "UserInfo.dat", data.toJson());
// 如获取用户位置
Utility.MakeToast("所在地:" + Utility.Unicode2String(data["location"].ToString()));
}
else if (state == ResponseState.Fail)
{
Utility.MakeToast("获取用户详情失败!");
}
else if (state == ResponseState.Cancel)
{
Utility.MakeToast("获取用户详情被取消!");
}
} // 注销,退出登录
public void OnSignOutButtonClick()
{
// 取消指定平台的授权
ssdk.CancelAuthorize(PlatformType.SinaWeibo);
// 回调登录场景
SceneManager.LoadScene();
}
}

打开UserInfo.dat查看能获取到哪些帐号详情。

获取好友列表

using cn.sharesdk.unity3d;
using System.Collections;
using UnityEngine;
using UnityEngine.UI; public class Play : MonoBehaviour
{
public Text resultText;
ShareSDK ssdk; void Start ()
{
ssdk = ShareSDKManager.Instance.ssdk;
ssdk.getFriendsHandler = OnGetFriendsResultHandler;
} // 点击获取好友列表
public void OnFriendsButtonClick()
{
// 分页获取当前登录用户平台的好友列表,每页容量,第几页(从0开始)
// 但此接口已被弃用,目前只能准确获得好友总数,且一次请求只能返回2个好友(第三参数填0返回第1和2位好友),后两个参数已失效
// 如果想靠该接口分页获取所有好友,需要自行多次获取,自行分页
ssdk.GetFriendList(PlatformType.SinaWeibo, , );
} void OnGetFriendsResultHandler(int reqID, ResponseState state, PlatformType type, Hashtable data)
{
if (state == ResponseState.Success)
{
// 将好友列表写入文件中,之后随意使用。
Utility.WriteFile(Application.persistentDataPath, "FriendsList.dat", data.toJson());
}
else if (state == ResponseState.Fail)
{
Utility.MakeToast("获取好友列表失败!");
}
else if (state == ResponseState.Cancel)
{
Utility.MakeToast("获取好友列表被取消!");
}
}
}

查看FriendsList.dat,每个好友的信息有很多数据,同样中文是Unicode需要转成String显示。该接口谨慎使用。

分享功能

void Start ()
{
ssdk = ShareSDKManager.Instance.ssdk;
ssdk.shareHandler = OnShareResultHandler;
} // 点击分享:截图,配文字,分享
public void OnShareButtonClick()
{
// 屏幕截图,默认存放路径Application.persistentDataPath,多次调用会同名替换图片。
ScreenCapture.CaptureScreenshot("Screenshot.png");
// 分享的内容
ShareContent content = new ShareContent(); // ★通用分享内容的设置
// 设置分享的文字(正文)
content.SetText("测试ShareSDK分享功能"); // 设置分享的图片
// SetImagePath:用于本地图片,参数为图片路径
// SetImageUrl:用于网络图片,参数为图片网址
// SetImageArray:用于多图分享,参数为图片网址string数组。仅支持网络图片,仅支持Android。
content.SetImagePath(Application.persistentDataPath + "/Screenshot.png"); // 其他可设置的额外参数
content.SetTitle("ShareSDKDemo"); // 标题
content.SetTitleUrl("http://www.guxin.me"); // 标题的Url
content.SetSite("guxin.me"); // 分享来源的站点
content.SetTitle("http://www.guxin.me"); // 站点的Url
content.SetUrl("http://www.guxin.me"); // 分享的网站
content.SetUrlDescription("个人学习ShareSDK的Demo");
// ...
// 设定分享内容的主要类型,放在最后一步
content.SetShareType(ContentType.Image); // ★其他平台特异性分享内容的设置
ShareContent sinaWeiboContent = new ShareContent();
sinaWeiboContent.SetText(resultText.text + "\n via 新浪微博");
// 在指定平台上,使用第二个参数中的内容覆盖主内容里的值
content.SetShareContentCustomize(PlatformType.SinaWeibo, sinaWeiboContent); // ★显示分享框
// PlatformType[] platforms = { PlatformType.SinaWeibo, PlatformType.QQ, PlatformType.WeChat };
// ssdk.ShowPlatformList(platforms, content, 100, 100);
// 指定显示平台的方法已弃用,第一个参数穿null即可。
// string[] platforms = { "5" }; // 查看PlatformType枚举值,如豆瓣是“5”
// string[] platforms = { ((int)PlatformType.DouBan).ToString() };
// 可以设置哪些平台不显示。
string[] platforms = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" };
content.SetHidePlatforms(platforms); ssdk.ShowPlatformList(null, content, , );
} // 分享结果的回调
void OnShareResultHandler(int reqID, ResponseState state, PlatformType type, Hashtable data)
{
// 注意:并非所有平台都会报告正确的状态,如短信、邮件平台,只要界面跳转成功了都算成功(不管玩家接下来是否真的有点发送)。
if (state == ResponseState.Success)
{
Utility.MakeToast("分享成功!");
// 游戏中分享成功可能会获得一些道具,在这里处理。注意不能正确报告的平台,防止玩家未分享也能获得道具。
// ......
}
else if (state == ResponseState.Fail)
{
Utility.MakeToast("分享失败!");
}
else if (state == ResponseState.Cancel)
{
Utility.MakeToast("分享被取消!");
}
}

Bug:指定了分享界面的显示的可选平台,但还是显示了所有的平台。即设置指定的分享平台无效。

解决办法有三种:
一、设置setHidePlatforms,填上所有隐藏的平台,只保留想要的平台。
二、在ShareSDK脚本上把不需要的平台的Enable取消勾选,直接关闭与该平台的所有交互。
三、在Plugins-Android-lib里删除不需要的平台的包(ShareSDK开头的lib文件)
建议使用方法一,可适应如不同界面要显示不同的分享平台等需求。

导入SMSSDK报错,包冲突问题

1、登录mob.com后台,给应用添加SMSSDK功能。并从官网下载短信验证码SDK(https://github.com/MobClub/SMSSDK-for-Unity3D),内含详细文档。
2、将SMSSDK.unitypackage导入项目中。会报错MiniJSON已存在,这是因为已同时存在Assets/Plugins/SMSSDK/MiniJSON.cs和Assets/Plugins/ShareSDK/MiniJSON.cs文件(名称空间相同),删掉一个即可,如删掉SMSSDK文件夹下的。
3、打包运行,发现报错,AndroidManifest清单文件无法合并等问题。这是因为Assets/Plugins/Android/ShareSDK/lib和Assets/Plugins/Android/SMSSDK/lib文件夹下有相同的MobCommons.lib和MobTools.lib,包冲突了(虽然后边版本号不同)。任意删除一边的两个包即可,如删除SMSSDK文件夹下的。把两个清单的都设置 android:minSdkVersion="16" , android:targetSdkVersion="26"
AndroidManifest清单合并报错。
F:\workspace\Unity Learning\ShareSDKDemo\Temp\StagingArea\AndroidManifest-main.xml:28:13-74 Error:
Attribute activity#com.mob.tools.MobUIShell@configChanges value=(keyboardHidden|orientation|screenSize) from AndroidManifest.xml:28:13-74
is also present at AndroidManifest.xml:15:13-97 value=(keyboardHidden|orientation|screenSize|locale|layoutDirection).
Suggestion: add 'tools:replace="android:configChanges"' to <activity> element at AndroidManifest-main.xml:26:9-44:20 to override.
F:\workspace\Unity Learning\ShareSDKDemo\Temp\StagingArea\AndroidManifest-main.xml:29:13-72 Error:
Attribute activity#com.mob.tools.MobUIShell@theme value=(@android:style/Theme.Translucent.NoTitleBar) from AndroidManifest.xml:29:13-72
is also present at AndroidManifest.xml:16:13-60 value=(@android:style/Theme.NoTitleBar).
Suggestion: add 'tools:replace="android:theme"' to <activity> element at AndroidManifest-main.xml:26:9-44:20 to override. UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
这是因为在Assets/Plugins/Android/ShareSDK/AndroidManifest.xml与Assets/Plugins/Android/SMSSDKGUI/AndroidManifest.xml中有重复设置android:configChanges和android:theme属性。去掉SMSSDKGUI/AndroidManifest.xml中的该属性即可。

短信登录

SMSSDK主要使用发验证码、收验证码、比对验证码功能,其他功能已多年未维护,不推荐使用。
在Init场景中给物体挂上SMSSDK脚本,该脚本已默认填有App Key和App Secret。虽然已在mob后台添加了SMSSDK功能,但测试时依然可以继续用该Debug帐号,因为不受每天20条短信限制。(发布时再改用自己的Key和Secret,上线后不受数量限制,且可定制短信)
在自定义的管理类中初始化smssdk。
// SMSSDK初始化
smssdk = gameObject.GetComponent<SMSSDK>();
smssdk.init("moba6b6c6d6", "b89d2427a3bc7ad1aea1e1e8c1d36bf3", true); // 用默认的Debug帐号的App Key和App Secret测试。上线时改用在mob后台给的值。

主逻辑脚本继承SMSSDKHandler接口,实现onComplete()和onError()这两个回调函数,smssdk.setHandler()注册。注意枚举ActionType.SubmitUserInfo和ActionType.GetFriends已很久未维护,不推荐使用。

最终整合了微博登录与短信登录的脚本如下。

using cn.sharesdk.unity3d;
using cn.SMSSDK.Unity;
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement; public class Login : MonoBehaviour, SMSSDKHandler
{
ShareSDK ssdk;
SMSSDK smssdk; void Start () {
ssdk = ShareSDKManager.Instance.ssdk;
ssdk.authHandler = OnAuthResultHandler; // 授权结果的回调函数 smssdk = ShareSDKManager.Instance.smssdk;
smssdk.setHandler(this); // 短信操作的回调
} // 用新浪微博登录
public void OnSinaLoginButtonClick()
{
if (ssdk.IsAuthorized(PlatformType.SinaWeibo)) // 检测指定的平台是否已经授权过了
{
// 写入授权信息
Utility.WriteFile(Application.persistentDataPath, "AuthInfo.txt", ssdk.GetAuthInfo(PlatformType.SinaWeibo).toJson());
Utility.MakeToast("微博用户:" + ssdk.GetAuthInfo(PlatformType.SinaWeibo)["userName"] + "\n登录成功!"); // 信息详情查看输入的文件
ShareSDKManager.Instance.userPlatform = PlatformType.SinaWeibo;
SceneManager.LoadScene();
}
else // 指定的平台尚未授权,给它授权
{
ssdk.Authorize(PlatformType.SinaWeibo);
}
} /// <summary>
/// 授权结果的回调函数
/// </summary>
/// <param name="reqID"></param>
/// <param name="state">授权状态:成功,失败,取消</param>
/// <param name="type">授权平台类型</param>
/// <param name="data">返回的数据</param>
void OnAuthResultHandler(int reqID, ResponseState state, PlatformType type, Hashtable data)
{
if (state == ResponseState.Success)
{
// 授权结果写入文件
Utility.WriteFile(Application.persistentDataPath, "AuthData.txt", data.toJson());
Utility.WriteFile(Application.persistentDataPath, "AuthInfo.txt", ssdk.GetAuthInfo(PlatformType.SinaWeibo).toJson());
Utility.MakeToast("微博用户:" + ssdk.GetAuthInfo(PlatformType.SinaWeibo)["userName"] + "\n登录成功!"); // 信息详情查看输入的文件
ShareSDKManager.Instance.userPlatform = PlatformType.SinaWeibo;
SceneManager.LoadScene();
}
else if (state == ResponseState.Fail)
{
// 失败或取消要清除指定平台的授权信息
ssdk.CancelAuthorize(type);
Utility.MakeToast("登录失败!");
}
else if (state == ResponseState.Cancel)
{
// 失败或取消要清除指定平台的授权信息
ssdk.CancelAuthorize(type);
Utility.MakeToast("登录被取消!");
}
} // 用短信登录,有两种方式
public void OnSmsButtonClick()
{
// 方式一:非UI方式,需要搭配Unity里自己制作的UI
/*
* 通过getCode()获得验证码,参数是:验证码类型(短信/语音),手机号,国际区域号(大陆为86,非国内电话的区号),模板号
* smssdk.getCode(CodeType, phone, zone, tempCode);
* 通过commitCode()方式提交验证码,参数:手机号,国际区域号(大陆为86,非国内电话的区号),验证码
* smssdk.commitCode(phone, zone, code);
*/ // 方式二:UI方式,直接使用SMSSDK自带的UI(Android下的界面)
smssdk.showRegisterPage(CodeType.TextCode, null); //tempcode是模板编号,如还未申请传null即可。申请新模板要等审核通过。
} // 短信操作,完成
public void onComplete(int action, object resp)
{
ActionType act = (ActionType)action;
//Debug.Log(act);
if (act == ActionType.CommitCode)
{
ShareSDKManager.Instance.userPlatform = PlatformType.SMS;
ShareSDKManager.Instance.userID = ((string)resp).hashtableFromJson()["phone"].ToString();
Utility.MakeToast("手机用户:" + ShareSDKManager.Instance.userID + "\n登录成功!");
SceneManager.LoadScene();
}
} // 短信操作,失败
public void onError(int action, object resp)
{
Utility.MakeToast("短信验证失败!");
}
}

自用Demo:https://gitee.com/guxin233/Unity_ShareSDK_Demo

 

 

【Unity】ShareSDK、SMSSDK的基本使用与常见问题的更多相关文章

  1. Unity利用SMSSDK实现短信验证码(附代码)

    最近一直在研究如何给app更多实用性的功能,在app进行登录或者注册时,为了方便用户更加快捷的完成登录功能,所以就决定采用短信验证码的方式进行验证登录.在学习的过程中,先使用了Mob的短信服务进行短信 ...

  2. ShareSDK For Unity集成

    Mob ShareSDK Android - V2.7.10 iOS - V3.5.0 Mob下载:https://github.com/MobClub/New-Unity-For-ShareSDK ...

  3. [ShareSDK for Android]新浪微博常见问题

    一.新浪sso授权报错sso package or sign error 1. 新浪微博开放平台应用没有审核通过,不能用sso登陆,否则报错.关闭sso登陆Platform platform = Sh ...

  4. 【Unity】Protobuf的使用与常见问题

    Protobuf的使用流程 protobuf参考教程:https://www.jianshu.com/p/b135676dbe8d 手写.proto文件后,用CMD命令行运行protoc.exe编译器 ...

  5. 解决同时共用MOB公司的shareSDK和SMSSDK的冲突问题

    现在mob的SDK版本升级到3.0,跟之前的版本不兼容,尤其是在 同时使用shareSDK和SMSSDK的时候会发生冲突,报NoSuchMethodException的错误. 只需要将所有的jar包和 ...

  6. Unity插件-ShareSDK使用指南

    Unity插件ShareSDK使用教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Summariz ...

  7. 【Unity】近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享。

    近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享. 1:Unity4.x 项目中3D模型其材质丢失,成为"白模"?       解决方式:手 ...

  8. Unity接入ShareSDK实现QQ登录和QQ分享、微信分享

    原文链接:Unity接入ShareSDK实现QQ登录和QQ分享.微信分享 由于微信登录需要企业审核,我这里就不说明了,有需要的可以去官网看一下文档,和QQ登录比多了一个打包的步骤. 第一步:到官网申请 ...

  9. 【Unity】打包安卓APK常见问题

    问题:unity error invalid command android 原因:Android版本较新,Unity版本太旧(如4.X),Unity打包APK时调用Android工具使用的命令已被安 ...

随机推荐

  1. Ubuntu urllib2.URLError:<urlopen error unknown url type:https>

    描述: python中urllib2 下载网页时,出现错误urllib2.URLError:<urlopen error unknown url type:https> 解决方法: pyt ...

  2. BufferedReader的小例子

    注意: BufferedReader只能接受字符流的缓冲区,因为每一个中文需要占据两个字节,所以需要将System.in这个字节输入流变为字符输入流,采用: BufferedReader buf = ...

  3. NMAP为什么扫描不到端口

    NMAP为什么扫描不到端口   NMAP是知名的网络端口扫描工具.但很多新人发现,使用NMAP经常扫描不出来任何端口,尤其是手机之类.这实际存在一个理解上的误区.扫描端口是为了发现主机/设备上存在的对 ...

  4. [ 转载 ] Handler详解

    带着问题学习 Android Handler 消息机制 Marker_Sky 关注  0.4 2018.02.06 18:04* 字数 3992 阅读 541评论 0喜欢 13   学习 Androi ...

  5. Windows 文件名的书写规范

    下面是不能用于文件名的: / \ : * " < > | windows系统下文件名长度为: 255个英文字符(DOS下8.3格式),包括文件名和扩展名在内,或者是255/2=1 ...

  6. nodejs区分开发环境和生产环境

    参考: https://www.cnblogs.com/suoking/p/5509060.html linux&mac 设置dev,producntion export NODE_ENV=p ...

  7. WPF(C#)与MATLAB混合编程

    WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...

  8. copy unicode HTML to clipboard

    How to copy unicode HTML code to the clipboard in html format, so it can be pasted into Writer, Word ...

  9. hdu 1828 Picture(线段树扫描线矩形周长并)

    线段树扫描线矩形周长并 #include <iostream> #include <cstdio> #include <algorithm> #include &l ...

  10. Morris图表使用小记

    挺好用的,碰到几个问题,有的是瞎试解决了的: 1.我想折线图能够响应单击事件,即点击某个节点后,就能加载进一步的信息,帮助没找到,参照另外一个地方的写法,居然支持事件 Morris.Line({ el ...