本次使用unity5.3.0,使用AndroidStudio 2.1 ,微信Sdk Android_SDK_3.1.1
参考链接:
雨松大大的教程http://www.xuanyusong.com/archives/667
http://blog.csdn.net/crazy1235/article/details/46733221
unity调用java方法一共有四种形式,分别是:
没有返回值的普通方法
AndroidJavaObject jo = new AndroidJavaObject("android.content.res.Configuration");
jo.Call("setToDefaults");
带有返回值的普通方法
AndroidJavaObject jo = new AndroidJavaObject("java.lang.String", "some string");
int hash = jo.Call<int>("hashCode");
没有返回值的静态方法
AndroidJavaObject jo = new AndroidJavaObject("android.os.Binder");
jo.CallStatic("flushPendingCommands");
带有返回值的静态方法
AndroidJavaObject jo = new AndroidJavaObject("java.lang.String");
string valueString = jo.CallStatic<string>("valueOf", 42.0);
我用的方法如下,第一个是获取java的类,参数就是类的路径(我的类名:Interface)。第二个方法就是调用类的静态方法,第一个参数是方法名,第二个参数的需要传递的参数,自己定义吧。
AndroidJavaObject jo = new AndroidJavaObject("com.sdk.my.Interface");
jo.CallStatic("InterFaceUnity","msg");
在unity端需要调用的接口的地方定义好方法,然后在Building Settings中导出Google Android Project,Export导出。
打开AndroidStudio导入刚才从unity导出的Android工程。
等待导入完成。导入完成之后在把下载的微信jar包导入到AndroidStudio中,首先拷贝到libs目录下,然后右击该文件选择addAsLibrary。
下面的函数是unity调用的静态函数,通过函数传来的参数可以去判断需要调起什么函数。
public class Interface {
static public void InterFaceUnity(String msg)
{
Log.i("sv111",msg);
// WeChatController.GetInstance().SendToWei("111");
// WeChatController.GetInstance().ShareLinkUrl();
WeChatController.GetInstance().WeChatLogin();
}
}
新建一个WeChatController类
public class WeChatController {
static private IWXAPI api;
private static WeChatController _instance;
private WeChatController(){};
public static WeChatController GetInstance(){
if(_instance == null)
{
_instance = new WeChatController();
}
return _instance;
}
//此方法在应用程序启动时需要调用把APP_ID注册到微信中 可以在主Activity中的OnCreate()中调用此函数。
public void RegToWx(Context context){
api = WXAPIFactory.createWXAPI(context,Constants.APP_ID);
api.registerApp(Constants.APP_ID);
}
//分享文字
public void SendToWei(String name) {
WXTextObject textObj = new WXTextObject();
textObj.text = "textObj.text";
// 用WXTextObject对象初始化一个WXMediaMessage对象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = textObj;
// 发送文本类型的消息时,title字段不起作用
// msg.title = "Will be ignored";
msg.description = "msg.description";
// 构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = "sharetext"; // transaction字段用于唯一标识一个请求
req.message = msg;
req.scene = true ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;
// 调用api接口发送数据到微信
api.sendReq(req);
}
public void ShareLinkUrl() {
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = "http://www.baidu.com";
//用WXMebpageObject 对象初始化一个WXMediaMessage对象,填写标题,描述
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = "百度大法好";
msg.description = "网页描述:我是饭太黏"; //描述只在发送给朋友时显示,发送到朋友圈不显示
//链接图片
Resources re = UnityPlayerActivity._instance.getResources(); //通过一个活动的Activity (UnityPlayerActivity._instance)提换为可用的Activity
Bitmap thumb = BitmapFactory.decodeResource(re,R.drawable.app_icon); //图片小于32k,如果drawable下没有图片可以把图片的代码注释掉;
msg.thumbData = Util.bmpToByteArray(thumb, true);
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = "shareurl";
req.message = msg;
req.scene = true ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;
api.sendReq(req);
}
public void WeChatLogin()
{
Log.i("sv111", "WeChatLogin"+R.drawable.app_icon);
SendAuth.Req req = new SendAuth.Req();
req.transaction = "Login";
req.scope = "snsapi_userinfo"; // 应用授权作用域,如获取用户个人信息则填写snsapi_userinfo
req.state = "wechat_sdk_demo_test";
api.sendReq(req);
}
}
新建一个Util类,此类是直接从微信Demo中直接拷贝过来的,分享链接会用到 具体我也不是很懂。可以直接从demo中拷贝。在此不再贴出来了。
新建一个Constants类,此类中存放一些id之类的信息。
public class Constants {
public static final String APP_ID = "写自己的Id"; //从微信申请的id
public static class ShowMsgActivity {
public static final String STitle = "showmsg_title";
public static final String SMessage = "showmsg_message";
public static final String BAThumbData = "showmsg_thumb_data";
}
}
微信回调函数,在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activityb. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法,在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,例如
public class WXEntryActivity extends Activity implements IWXAPIEventHandler{
private static final int TIMELINE_SUPPORTED_VERSION = 0x21020001;
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.entry);
Log.i("sv111","onCreate");
api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
Log.i("sv111","onNewIntent");
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
Log.i("sv111","onReq");
switch (req.getType()) {
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
goToGetMsg();
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
goToShowMsg((ShowMessageFromWX.Req) req);
break;
default:
break;
}
}
@Override
//请求微信后的回调
public void onResp(BaseResp resp) {
Log.i("sv111","onresp");
int result = 0;
String str = "";
int type = 0;
if(resp.transaction.equals("sharetext") ) //通过唯一标示去识别
{
str = "分享文字";
type = 1;
}else if (resp.transaction.equals("shareurl") )
{
str = "分享链接";
type = 2;
}else if (resp.transaction.equals("Login") )
{
str = "登陆";
type = 3;
}
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK: //正确返回
str += "成功";
if (type == 3)
{
OnRespAuth((SendAuth.Resp)resp); //强转为SendAuth.Resp对象
}
break;
case BaseResp.ErrCode.ERR_USER_CANCEL: //用户取消
str += "取消";
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED: //认证否决 (用户拒绝授权)
str += "失败";
break;
case BaseResp.ErrCode.ERR_SENT_FAILED: //发送失败
str += "发送失败";
break;
default:
str += "未知错误";
break;
}
Toast.makeText(this, str, Toast.LENGTH_LONG).show();
finish();///
}
public void OnRespAuth(SendAuth.Resp resp)
{
Log.i("sv111","OnRespAuth");
Log.i("sv111",resp.code);
Log.i("sv111",resp.url);
}
}
也可以拿微信demo里的WXEntryActivity类进行修改。
至此应该就可以调用起微信sdk了 ,有什么问题可以留言共同讨论。
注意:安卓平台需要签名,包名和申请的id必须一致才能调起微信,否侧调不起来。