Android调用微博接口
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 就是例子程序,直接运行它即可。
然后我们需要在Unity3D中制作Android的插件来调用新浪微博接口,如果你现在对Android的插件还是不是很了解,请阅读Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)文章。
开始MOMO使用com_weibo_android_exampe 来制作Android插件的时候发现最终Unity导出项目的时候无法运行,并且在手机中也无法找到刚刚编译的项目。非常奇怪,后来我就重新把API的代码整理了一遍,问题就解决了。
SinaMessageActivity.java 它是我们写的Activity插件, 当Unity 中准备好 文字与图片数据的时候调用它即可发送信息。
001
|
/*
|
002
|
* Copyright 2013 Michael.
|
003
|
*
|
004
|
* Licensed under the Apache License and Weibo License, Version 2.0 (the "License");
|
005
|
* you may not use this file except in compliance with the License.
|
006
|
* You may obtain a copy of the License at
|
007
|
*
|
008
|
* http://www.open.weibo.com
|
009
|
* http://www.apache.org/licenses/LICENSE-2.0
|
010
|
*
|
011
|
* Unless required by applicable law or agreed to in writing, software
|
012
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
013
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
014
|
* See the License for the specific language governing permissions and
|
015
|
* limitations under the License.
|
016
|
*/
|
017
|
018
|
package com.yusong.momo;
|
019
|
020
|
import java.io.IOException;
|
021
|
import java.net.MalformedURLException;
|
022
|
023
|
import com.unity3d.player.UnityPlayerActivity;
|
024
|
import com.yusong.momo.AsyncWeiboRunner.RequestListener;
|
025
|
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;
|
031
|
032
|
public class SinaMessageActivity extends UnityPlayerActivity implements RequestListener {
|
033
|
034
|
//public class SinaMessageActivity extends Activity implements RequestListener {
|
035
|
//这个是你的密钥
|
036
|
private static final String CONSUMER_KEY = "1626952933" ;
|
037
|
private static final String CONSUMER_SECRET = "d92012d3d2ffa5630554723e1825b11c" ;
|
038
|
039
|
@Override
|
040
|
public void onCreate(Bundle savedInstanceState) {
|
041
|
super .onCreate(savedInstanceState);
|
042
|
043
|
}
|
044
|
045
|
//在Unity中调用此方法进行登录、发送微薄
|
046
|
public void pressed(String name)
|
047
|
{
|
048
|
Weibo weibo = Weibo.getInstance();
|
049
|
weibo.setupConsumerConfig(CONSUMER_KEY, CONSUMER_SECRET);
|
050
|
weibo.setRedirectUrl( "http://xuanyusong.com" );
|
051
|
052
|
SharedPreferences settings = getSharedPreferences( "MOMO" ,
|
053
|
Activity.MODE_PRIVATE);
|
054
|
055
|
//token 和 expires_in 是登录一次成功后服务器返回给你的。
|
056
|
//因为我们不需要用户每次发送微薄时都登录
|
057
|
//所以应当记录用户第一次登录时返回的token 和 expires_in
|
058
|
//发送微博时直接使用之前保存的token和expires_in即可
|
059
|
060
|
String token = settings.getString( "token" , "" );
|
061
|
String expires_in = settings.getString( "expires_in" , "" );
|
062
|
063
|
//SharedPreferences 中如果有数据就直接发微薄,否则让用户重新登录
|
064
|
if (!TextUtils.isEmpty(token)
|
065
|
&& !TextUtils.isEmpty(expires_in)) {
|
066
|
AccessToken accessToken = new AccessToken(token,
|
067
|
CONSUMER_SECRET);
|
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);
|
073
|
074
|
weibo.setAccessToken(accessToken);
|
075
|
076
|
//这里代码一定要加, 不然即时你保存了之前的 token 和 expires_in也 无法发送微薄
|
077
|
Utility.setAuthorization( new Oauth2AccessTokenHeader());
|
078
|
try {
|
079
|
//发送一条文字信息
|
080
|
update(weibo, Weibo.getAppKey(), "test1" , "" ,
|
081
|
"" );
|
082
|
} catch (MalformedURLException e) {
|
083
|
// TODO Auto-generated catch block
|
084
|
e.printStackTrace();
|
085
|
} catch (IOException e) {
|
086
|
// TODO Auto-generated catch block
|
087
|
e.printStackTrace();
|
088
|
} catch (WeiboException e) {
|
089
|
// TODO Auto-generated catch block
|
090
|
e.printStackTrace();
|
091
|
}
|
092
|
} else {
|
093
|
094
|
//开始让用户登录
|
095
|
weibo.authorize(SinaMessageActivity. this ,
|
096
|
new AuthDialogListener());
|
097
|
098
|
}
|
099
|
100
|
}
|
101
|
102
|
public void onResume() {
|
103
|
super .onResume();
|
104
|
}
|
105
|
106
|
class AuthDialogListener implements WeiboDialogListener {
|
107
|
108
|
@Override
|
109
|
public void onComplete(Bundle values) {
|
110
|
111
|
//用户登录成功后直接发送微薄
|
112
|
String token = values.getString( "access_token" );
|
113
|
String expires_in = values.getString( "expires_in" );
|
114
|
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);
|
120
|
editor.commit();
|
121
|
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);
|
129
|
130
|
weibo.setAccessToken(accessToken);
|
131
|
//这里代码一定要加, 不然即时你保存了之前的 token 和 expires_in也 无法发送微薄
|
132
|
Utility.setAuthorization( new Oauth2AccessTokenHeader());
|
133
|
134
|
try {
|
135
|
//在这里发送一条 文字+ 图片的微薄
|
136
|
//路径比较重要,在Unity中将图片保存在这个路径下
|
137
|
//在Android插件中直接通过这个路径即可拿到图片对象
|
138
|
upload(weibo, Weibo.getAppKey(), "/data/data/com.yusong.momo/files/Screenshot.png" ,
|
139
|
"Unity3D 中调用新浪微博接口 分享自 @雨松MOMO " , "" , "" ) ;
|
140
|
141
|
} catch (WeiboException e) {
|
142
|
// TODO Auto-generated catch block
|
143
|
e.printStackTrace();
|
144
|
}
|
145
|
146
|
}
|
147
|
148
|
@Override
|
149
|
public void onError(DialogError e) {
|
150
|
Toast.makeText(getApplicationContext(),
|
151
|
"Auth error : " + e.getMessage(), Toast.LENGTH_LONG).show();
|
152
|
}
|
153
|
154
|
@Override
|
155
|
public void onCancel() {
|
156
|
Toast.makeText(getApplicationContext(), "Auth cancel" ,
|
157
|
Toast.LENGTH_LONG).show();
|
158
|
}
|
159
|
160
|
@Override
|
161
|
public void onWeiboException(WeiboException e) {
|
162
|
Toast.makeText(getApplicationContext(),
|
163
|
"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG)
|
164
|
.show();
|
165
|
}
|
166
|
167
|
}
|
168
|
169
|
// 发送文字
|
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);
|
178
|
}
|
179
|
if (!TextUtils.isEmpty(lat)) {
|
180
|
bundle.add( "lat" , lat);
|
181
|
}
|
182
|
String rlt = "" ;
|
183
|
String url = Weibo.SERVER + "statuses/upload.json" ;
|
184
|
AsyncWeiboRunner weiboRunner = new AsyncWeiboRunner(weibo);
|
185
|
weiboRunner.request( this , url, bundle, Utility.HTTPMETHOD_POST, this );
|
186
|
187
|
return rlt;
|
188
|
}
|
189
|
190
|
// 发送文字 + 图片
|
191
|
private String update(Weibo weibo, String source, String status,
|
192
|
String lon, String lat) throws MalformedURLException, IOException,
|
193
|
WeiboException {
|
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);
|
199
|
}
|
200
|
if (!TextUtils.isEmpty(lat)) {
|
201
|
bundle.add( "lat" , lat);
|
202
|
}
|
203
|
String rlt = "" ;
|
204
|
String url = Weibo.SERVER + "statuses/update.json" ;
|
205
|
AsyncWeiboRunner weiboRunner = new AsyncWeiboRunner(weibo);
|
206
|
weiboRunner.request( this , url, bundle, Utility.HTTPMETHOD_POST, this );
|
207
|
return rlt;
|
208
|
}
|
209
|
210
|
@Override
|
211
|
public void onComplete(String response) {
|
212
|
runOnUiThread( new Runnable() {
|
213
|
214
|
@Override
|
215
|
public void run() {
|
216
|
Toast.makeText(SinaMessageActivity. this , "微薄分享成功" ,
|
217
|
Toast.LENGTH_LONG).show();
|
218
|
}
|
219
|
});
|
220
|
221
|
}
|
222
|
223
|
@Override
|
224
|
public void onIOException(IOException e) {
|
225
|
runOnUiThread( new Runnable() {
|
226
|
227
|
@Override
|
228
|
public void run() {
|
229
|
Toast.makeText(SinaMessageActivity. this , "微薄分享错误" ,
|
230
|
Toast.LENGTH_LONG).show();
|
231
|
}
|
232
|
});
|
233
|
234
|
}
|
235
|
236
|
@Override
|
237
|
public void onError(WeiboException e) {
|
238
|
runOnUiThread( new Runnable() {
|
239
|
@Override
|
240
|
public void run() {
|
241
|
Toast.makeText(SinaMessageActivity. this , "微薄分享失败" ,
|
242
|
Toast.LENGTH_LONG).show();
|
243
|
}
|
244
|
});
|
245
|
246
|
}
|
247
|
248
|
}
|
当插件准备完毕后,将它导入至Unity3D中,如果不会的朋友请看我之前的文章。Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)
我们在看看Unity中是如何调用插件中的分享接口的。
Test.cs
01
|
using System.Collections;
|
02
|
using System.IO;
|
03
|
using System.Collections.Generic;
|
04
|
using System;
|
05
|
06
|
public class Test : MonoBehaviour {
|
07
|
08
|
void Start ()
|
09
|
{
|
10
|
//在Unity截取一张图片
|
11
|
//该图片的路径保存在"/data/data/com.yusong.momo/files/Screenshot.png"
|
12
|
//在Android插件中根据这个路径即可拿到该图片
|
13
|
Application.CaptureScreenshot( "Screenshot.png" );
|
14
|
15
|
}
|
16
|
17
|
void Update ()
|
18
|
{
|
19
|
20
|
}
|
21
|
22
|
void OnGUI()
|
23
|
{
|
24
|
if (GUILayout.Button( "sendSinaMessage" ,GUILayout.Width(200),GUILayout.Height(100)))
|
25
|
{
|
26
|
27
|
//开始登录新浪微博
|
28
|
using (AndroidJavaClass jc = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ))
|
29
|
{
|
30
|
using ( AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>( "currentActivity" ))
|
31
|
{
|
32
|
//在这里直接调用pressed方法进行登录与发送微薄
|
33
|
jo.Call( "pressed" , "" );
|
34
|
}
|
35
|
}
|
36
|
37
|
}
|
38
|
39
|
}
|
40
|
}
|
调用接口后会调用新浪登录界面,继续发送新浪微薄。
最后我把文本的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)))
|
02
|
{
|
03
|
04
|
AndroidJavaClass jc = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" );
|
05
|
06
|
using (AndroidJavaObject jo = jc.GetStatic( "currentActivity" ))
|
07
|
{
|
08
|
jo.Call( "LoginAndSend" ,jo);
|
09
|
10
|
}
|
11
|
12
|
}
|
这段代码的意思就是在unity中把当前的Activity对象传递给Android插件中。在插件中这样来写。
01
|
public void LoginAndSend(final Activity currentActivity)
|
02
|
{
|
03
|
currentActivity.runOnUiThread( new Runnable() {
|
04
|
05
|
@Override
|
06
|
public void run() {
|
07
|
//doyourcode
|
08
|
09
|
});
|
10
|
}
|
11
|
12
|
}
|
在插件中通过调用UI主线程来执行原先的子线程。。
Android调用微博接口相关推荐
- php访问微博页面,PHP调用微博接口实现微博登录的方法示例
PHP调用微博接口实现微博登录的方法示例 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: PHP调用微博接口实现微博登录的方法示例.txt ] (友情提示:右键点 ...
- android调用web接口,Android调用webservice 接口
以查询手机号码归属地的Web service为例,它的wsdl为 1 在Android项目中导入??Ksoap2-android jar第三方jar包?? 2 Activity代码 public cl ...
- android调用webservice传参数,android调用webservice接口获取信息
我的有一篇博客上讲了如何基于CXF搭建webservice,service层的接口会被部署到tomcat上,这一篇我就讲一下如何在安卓中调用这些接口传递参数. 1.在lib中放入ksoap2的jar包 ...
- php 登陆微博,PHP调用微博接口实现微博登录的方法示例
在平时项目开发过程中,除了注册本网站账号进行登录之外,还可以调用第三方接口进行登录网站.这里以微博登录为例.微博登录包括身份认证.用户关系以及内容传播.允许用户使用微博帐号登录访问第三方网站,分享内容 ...
- android调用java接口_java/Android 接口调用的几种写法
虽然Handler用的地方比较普遍,但是接口也有他的独特之处,比较直观,然后降低了耦合性 如有一接口,需要将数据传给使用的activity中,接口如下 public interfacePushValu ...
- Android调用天气接口(和风天气)
第一次开通博客,不知写些什么.目前正在做一个Android项目,需要调用天气接口来显示连续几天的天气信息状况,但由于网上一些资料有点杂乱或不全(或许是自己水平不够,别人写的简洁),总之刚开始时无从下手 ...
- php微博登录授权代码,PHP调用微博接口实现微博登录的方法示例
在平时项目开发过程中,除了注册本网站账号进行登录之外,还可以调用第三方接口进行登录网站.这里以微博登录为例.微博登录包括身份认证.用户关系以及内容传播.允许用户使用微博帐号登录访问第三方网站,分享内容 ...
- android调用web接口,Android调用WebService系列之请求调用
好久没写博客,快有3年了.当初想在CTO把自己的技术文章一直延续,可却没有坚持! 开发Android网络App,通讯方式决定了你App所需的能力! 最近正在用Web Service进行通讯,那么就让我 ...
- Qt for Android调用原生接口打开相机拍照并存储照片
Qt开发Android应用,需求是通过调用Android原生接口去打开系统相机拍照,并返回拍摄的照片.原理很简单,现在Java文件中写android代码调用相机,拍照后将将相片存储在SD卡,然后在C+ ...
最新文章
- Ubuntu18.04安装Scala
- 关于小程序·云开发峰会,你想get的干货全在这了!
- 封装一个邮件发送工具类,一个字,巴适
- php 100万数据,关于批量插入数据之我见(100万级别的数据,mysql)
- 详解static、volatile、const
- 早秋精品电商男装页面\海报设计PSD模板
- 注册表的监控 -- WIN9X
- Node——设置响应报文头实现下载
- Ubuntu Git安装与使用
- 怎么定义int_「C语言更新」C语言中如何来定义一个指针,并且对其进行初始化...
- Python中神奇的迭代器和生成器
- 通过CocoCut插件和m3u8下载器下载网页视频并转换成mp4格式
- 计算机应用职业生涯规划,计算机应用专业个人职业规划
- 推荐3个开源的快速开发平台,前后端都有,项目经验又有着落了!
- 计算机二级考试加油作文,为中考而加油作文(精选10篇)
- app中跳转到手机浏览器,部分手机白屏解决(Vue)
- 如何将word文件的大小进行压缩?
- linux下dd工具,dd 工具使用
- 自定义Android聊天气泡ChatView。仿微信聊天气泡,能自定义边框,颜色,点击特效。
- 华为p40手机是不是android,华为P40新手机配新操作系统,网友:再见了安卓