1.没有密钥的朋友
请在这里注册一个移动应用,http://open.weibo.com/ 。注册成功后在应用信息-》基本信息中即可获得APP KEY 和 APP SECRET,没有这两个KEY你是无法发送微薄的。 仅仅这些还是不够,因为是刚刚注册的新密钥所以是不能被公众所使用的,你应当继续在 应用信息-> 测试帐号 中添加测试账号,只有添加过的测试帐号才能使用新注册的密钥发送微薄。
2.有密钥的朋友
可以直接使用你的密钥来进行开发。
接着我们下载新浪微博Andoid下API接口, 下载地址:http://code.google.com/p/android-weibo-sdk/downloads/list 我个人在选择API的时候习惯选择最新的版本,页面中最上面的下载地址就是最新的API
解压后使用Eclipse将整个工程引入,一定要从解压后的顶层的文件夹将下面的两个工程同时的引入Eclipse,不然你会出现错误 ”@style/ContentOverlay” 无法找到。这样的话就会将两个工程都引入至elipse,com_weibo_android 是API包, com_weibo_android_exampe 就是例子程序,直接运行它即可。
开始MOMO使用com_weibo_android_exampe 来制作Android插件的时候发现最终Unity导出项目的时候无法运行,并且在手机中也无法找到刚刚编译的项目。非常奇怪,后来我就重新把API的代码整理了一遍,问题就解决了。
SinaMessageActivity.java 它是我们写的Activity插件, 当Unity 中准备好 文字与图片数据的时候调用它即可发送信息。
018 | package com.yusong.momo; |
020 | import java.io.IOException; |
021 | import java.net.MalformedURLException; |
023 | import com.unity3d.player.UnityPlayerActivity; |
024 | import com.yusong.momo.AsyncWeiboRunner.RequestListener; |
026 | import android.app.Activity; |
027 | import android.content.SharedPreferences; |
028 | import android.os.Bundle; |
029 | import android.text.TextUtils; |
030 | import android.widget.Toast; |
032 | public class SinaMessageActivity extends UnityPlayerActivity implements RequestListener { |
036 | private static final String CONSUMER_KEY = "1626952933" ; |
037 | private static final String CONSUMER_SECRET = "d92012d3d2ffa5630554723e1825b11c" ; |
040 | public void onCreate(Bundle savedInstanceState) { |
041 | super .onCreate(savedInstanceState); |
046 | public void pressed(String name) |
048 | Weibo weibo = Weibo.getInstance(); |
049 | weibo.setupConsumerConfig(CONSUMER_KEY, CONSUMER_SECRET); |
052 | SharedPreferences settings = getSharedPreferences( "MOMO" , |
053 | Activity.MODE_PRIVATE); |
060 | String token = settings.getString( "token" , "" ); |
061 | String expires_in = settings.getString( "expires_in" , "" ); |
064 | if (!TextUtils.isEmpty(token) |
065 | && !TextUtils.isEmpty(expires_in)) { |
066 | AccessToken accessToken = new AccessToken(token, |
068 | accessToken.setExpiresIn(expires_in); |
069 | weibo.setAccessToken(accessToken); |
070 | accessToken = new AccessToken(weibo.getAccessToken() |
071 | .getToken(), weibo.getAccessToken().getSecret()); |
072 | accessToken = new AccessToken(token, CONSUMER_SECRET); |
074 | weibo.setAccessToken(accessToken); |
077 | Utility.setAuthorization( new Oauth2AccessTokenHeader()); |
080 | update(weibo, Weibo.getAppKey(), "test1" , "" , |
082 | } catch (MalformedURLException e) { |
085 | } catch (IOException e) { |
088 | } catch (WeiboException e) { |
095 | weibo.authorize(SinaMessageActivity. this , |
096 | new AuthDialogListener()); |
102 | public void onResume() { |
106 | class AuthDialogListener implements WeiboDialogListener { |
109 | public void onComplete(Bundle values) { |
112 | String token = values.getString( "access_token" ); |
113 | String expires_in = values.getString( "expires_in" ); |
115 | SharedPreferences settings = getSharedPreferences( "MOMO" , |
116 | Activity.MODE_PRIVATE); |
117 | SharedPreferences.Editor editor = settings.edit(); |
118 | editor.putString( "token" , token); |
119 | editor.putString( "expires_in" , expires_in); |
122 | AccessToken accessToken = new AccessToken(token, CONSUMER_SECRET); |
123 | accessToken.setExpiresIn(expires_in); |
124 | Weibo weibo = Weibo.getInstance(); |
125 | weibo.setAccessToken(accessToken); |
126 | accessToken = new AccessToken(weibo.getAccessToken().getToken(), |
127 | weibo.getAccessToken().getSecret()); |
128 | accessToken = new AccessToken(token, CONSUMER_SECRET); |
130 | weibo.setAccessToken(accessToken); |
132 | Utility.setAuthorization( new Oauth2AccessTokenHeader()); |
138 | upload(weibo, Weibo.getAppKey(), "/data/data/com.yusong.momo/files/Screenshot.png" , |
139 | "Unity3D 中调用新浪微博接口 分享自 @雨松MOMO " , "" , "" ) ; |
141 | } catch (WeiboException e) { |
149 | public void onError(DialogError e) { |
150 | Toast.makeText(getApplicationContext(), |
151 | "Auth error : " + e.getMessage(), Toast.LENGTH_LONG).show(); |
155 | public void onCancel() { |
156 | Toast.makeText(getApplicationContext(), "Auth cancel" , |
157 | Toast.LENGTH_LONG).show(); |
161 | public void onWeiboException(WeiboException e) { |
162 | Toast.makeText(getApplicationContext(), |
163 | "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG) |
170 | private String upload(Weibo weibo, String source, String file, |
171 | String status, String lon, String lat) throws WeiboException { |
172 | WeiboParameters bundle = new WeiboParameters(); |
173 | bundle.add( "source" , source); |
174 | bundle.add( "pic" , file); |
175 | bundle.add( "status" , status); |
176 | if (!TextUtils.isEmpty(lon)) { |
177 | bundle.add( "lon" , lon); |
179 | if (!TextUtils.isEmpty(lat)) { |
180 | bundle.add( "lat" , lat); |
183 | String url = Weibo.SERVER + "statuses/upload.json" ; |
184 | AsyncWeiboRunner weiboRunner = new AsyncWeiboRunner(weibo); |
185 | weiboRunner.request( this , url, bundle, Utility.HTTPMETHOD_POST, this ); |
191 | private String update(Weibo weibo, String source, String status, |
192 | String lon, String lat) throws MalformedURLException, IOException, |
194 | WeiboParameters bundle = new WeiboParameters(); |
195 | bundle.add( "source" , source); |
196 | bundle.add( "status" , status); |
197 | if (!TextUtils.isEmpty(lon)) { |
198 | bundle.add( "lon" , lon); |
200 | if (!TextUtils.isEmpty(lat)) { |
201 | bundle.add( "lat" , lat); |
204 | String url = Weibo.SERVER + "statuses/update.json" ; |
205 | AsyncWeiboRunner weiboRunner = new AsyncWeiboRunner(weibo); |
206 | weiboRunner.request( this , url, bundle, Utility.HTTPMETHOD_POST, this ); |
211 | public void onComplete(String response) { |
212 | runOnUiThread( new Runnable() { |
216 | Toast.makeText(SinaMessageActivity. this , "微薄分享成功" , |
217 | Toast.LENGTH_LONG).show(); |
224 | public void onIOException(IOException e) { |
225 | runOnUiThread( new Runnable() { |
229 | Toast.makeText(SinaMessageActivity. this , "微薄分享错误" , |
230 | Toast.LENGTH_LONG).show(); |
237 | public void onError(WeiboException e) { |
238 | runOnUiThread( new Runnable() { |
241 | Toast.makeText(SinaMessageActivity. this , "微薄分享失败" , |
242 | Toast.LENGTH_LONG).show(); |
当插件准备完毕后,将它导入至Unity3D中,如果不会的朋友请看我之前的文章。Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)
我们在看看Unity中是如何调用插件中的分享接口的。
Test.cs
01 | using System.Collections; |
03 | using System.Collections.Generic; |
06 | public class Test : MonoBehaviour { |
13 | Application.CaptureScreenshot( "Screenshot.png" ); |
24 | if (GUILayout.Button( "sendSinaMessage" ,GUILayout.Width(200),GUILayout.Height(100))) |
28 | using (AndroidJavaClass jc = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" )) |
30 | using ( AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>( "currentActivity" )) |
33 | jo.Call( "pressed" , "" ); |
调用接口后会调用新浪登录界面,继续发送新浪微薄。

最后我把文本的Android插件代码 以及 Unity工程放出来, 下载完毕后解压即可看到工程。雨松MOMO希望大家学习愉快。
下载地址 http://vdisk.weibo.com/s/d3xA1
2013年3月23日补充
在调用新浪微薄Android接口的时候我还出现了一个 Can’t create handler inside thread that has not called Looper.prepare() 错误。
这个错误前段时间一直因为别的事情没有能即时的解决。 这几天MOMO在做Android for QQzone的插件中也遇到了同样的错误。出现这个错误的额原因就是unity调用插件中的方法中又开启了新的线程。
先改动一下上面的unity C#脚本,方法名我就不换了。。。主要说原理。。
01 | if (GUILayout.Button( " Send QQ zone" , GUILayout.Height(50))) |
04 | AndroidJavaClass jc = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ); |
06 | using (AndroidJavaObject jo = jc.GetStatic( "currentActivity" )) |
08 | jo.Call( "LoginAndSend" ,jo); |
这段代码的意思就是在unity中把当前的Activity对象传递给Android插件中。在插件中这样来写。
01 | public void LoginAndSend(final Activity currentActivity) |
03 | currentActivity.runOnUiThread( new Runnable() { |
在插件中通过调用UI主线程来执行原先的子线程。。