转载:http://www.xuanyusong.com/archives/2159
最近研究了一下Android下 Unity分享 for QQ空间,作法类似以前我在博客中写过分享新浪微博的方法,也就是自己写插件。测试用的手机Google Nexus ,Unity版本4.1,如下图所示,这是我发布成功后在QQ空间的截图。
![屏幕快照 2013-03-24 下午8.56.16](http://www.xuanyusong.com/wp-content/uploads/2013/03/屏幕快照-2013-03-24-下午8.56.16.png)
写插件的方式我就不再说了,如果不懂的朋友看我之前的博客吧,写的很清楚。
QQ空间分享属于腾讯开放平台。然而腾讯开放平台的东西也比较多,移动平台包括:空间分享、说说分享、微薄分享。这一篇就说空间分享,如果空间分享搞定后可以按照同样的方式实现微薄分享。
先下载腾讯开放平台的API。
http://wiki.opensns.qq.com/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91%E7%A7%BB%E5%8A%A8%E5%BA%94%E7%94%A8%E6%8E%A5%E5%85%A5
API我下载后里面有一个DEMO。我在MAC OS系统下Eclipse尽然不能运行,提示错误。后来我简单改了一下才可以运行,好蛋疼啊。
废话就不多说了,先来在Elipse下Android的插件。下段代码是Eclipse中的Android代码。
001 | package com.example.qqzone; |
003 | import java.io.BufferedInputStream; |
004 | import java.io.BufferedOutputStream; |
005 | import java.io.ByteArrayOutputStream; |
006 | import java.io.IOException; |
007 | import java.io.InputStream; |
008 | import java.net.MalformedURLException; |
009 | import java.net.SocketTimeoutException; |
011 | import java.net.URLEncoder; |
012 | import java.util.Date; |
014 | import org.apache.http.conn.ConnectTimeoutException; |
015 | import org.json.JSONException; |
016 | import org.json.JSONObject; |
018 | import android.app.Activity; |
019 | import android.content.Context; |
020 | import android.content.Intent; |
021 | import android.content.SharedPreferences; |
022 | import android.content.SharedPreferences.Editor; |
023 | import android.graphics.Bitmap; |
024 | import android.os.Bundle; |
025 | import android.os.Environment; |
026 | import android.util.Log; |
027 | import android.view.Menu; |
028 | import android.widget.Toast; |
030 | import com.tencent.open.HttpStatusException; |
031 | import com.tencent.open.NetworkUnavailableException; |
032 | import com.tencent.tauth.Constants; |
033 | import com.tencent.tauth.IRequestListener; |
034 | import com.tencent.tauth.IUiListener; |
035 | import com.tencent.tauth.Tencent; |
036 | import com.tencent.tauth.UiError; |
037 | import com.unity3d.player.UnityPlayerActivity; |
039 | public class MainActivity extends UnityPlayerActivity { |
042 | public Tencent mTencent; |
043 | public SharedPreferences sharedPrefrences; |
044 | public Editor editor; |
045 | public Context context; |
047 | protected void onCreate(Bundle savedInstanceState) { |
048 | super .onCreate(savedInstanceState); |
050 | sharedPrefrences = this .getSharedPreferences( "info" , |
051 | MODE_WORLD_READABLE); |
052 | editor = sharedPrefrences.edit(); |
053 | context = this .getApplicationContext(); |
058 | public void LoginAndSend( final Activity currentActivity) |
066 | currentActivity.runOnUiThread( new Runnable() { |
073 | mTencent = Tencent.createInstance( "222222" ,context |
080 | String openid = sharedPrefrences.getString( "openid" , null ); |
082 | String access_token = sharedPrefrences.getString( "access_token" , null ); |
084 | long expires_in = sharedPrefrences.getLong( "expires_in" , 0 ); |
086 | if (openid != null && access_token != null && expires_in != 0 ) |
090 | mTencent.setOpenId(openid); |
091 | mTencent.setAccessToken(access_token, expires_in + "" ); |
098 | if (!mTencent.isSessionValid()) { |
099 | IUiListener listener = new IUiListener() { |
102 | public void onError(UiError arg0) { |
103 | Toast.makeText(getApplicationContext(), "登录错误" , |
104 | Toast.LENGTH_SHORT).show(); |
108 | public void onComplete(JSONObject arg0) { |
109 | Log.v( "登录成功" , "登录成功" ); |
114 | editor.putString( "openid" , mTencent.getOpenId()); |
115 | editor.putString( "access_token" , |
116 | mTencent.getAccessToken()); |
120 | editor.putLong( "expires_in" , 7776000 ); |
126 | public void onCancel() { |
127 | Log.v( "登录取消" , "登录取消" ); |
131 | mTencent.login(currentActivity, "all" , listener); |
133 | mTencent.logout(context); |
143 | private void SendMessage() { |
146 | if (mTencent.isSessionValid() && mTencent.getOpenId() != null ) { |
148 | Bundle parmas = new Bundle(); |
149 | parmas.putString( "title" , "雨松MOMO程序研究院" ); |
153 | + System.currentTimeMillis()); |
155 | parmas.putString( "comment" , ( "欢迎光临雨松MOMO程序研究院。" + new Date())); |
156 | parmas.putString( "summary" , "在Unity3D中调用QQ空间分享接口,哇咔咔哇咔咔" ); |
158 | parmas.putString( "images" , |
160 | parmas.putString( "type" , "4" ); |
162 | mTencent.requestAsync(Constants.GRAPH_ADD_SHARE, parmas, |
163 | Constants.HTTP_POST, new BaseApiListener(), null ); |
170 | protected void onActivityResult( int requestCode, int resultCode, Intent data) { |
171 | mTencent.onActivityResult(requestCode, resultCode, data); |
174 | private class BaseApiListener implements IRequestListener { |
177 | public void onComplete( final JSONObject response, Object state) { |
178 | doComplete(response, state); |
181 | protected void doComplete(JSONObject response, Object state) { |
182 | Log.v( "发送成功" , "发送成功" ); |
186 | public void onIOException( final IOException e, Object state) { |
187 | Log.v( "发表错误" , "onIOException" ); |
191 | public void onMalformedURLException( final MalformedURLException e, |
193 | Log.v( "发表错误" , "onMalformedURLException" ); |
197 | public void onJSONException( final JSONException e, Object state) { |
198 | Log.v( "发表错误" , "onJSONException" ); |
202 | public void onConnectTimeoutException(ConnectTimeoutException arg0, |
204 | Log.v( "发表错误" , "onConnectTimeoutException" ); |
208 | public void onSocketTimeoutException(SocketTimeoutException arg0, |
210 | Log.v( "发表错误" , "onSocketTimeoutException" ); |
214 | public void onUnknowException(Exception arg0, Object arg1) { |
215 | Log.v( "发表错误" , "onUnknowException" ); |
219 | public void onHttpStatusException(HttpStatusException arg0, Object arg1) { |
220 | Log.v( "发表错误" , "onHttpStatusException" ); |
224 | public void onNetworkUnavailableException( |
225 | NetworkUnavailableException arg0, Object arg1) { |
226 | Log.v( "发表错误" , "onNetworkUnavailableException" ); |
如果你不需要在U3d中分享说说?把上段代码简单的改一改吧。把登录放在Creat()方法中吧,会安卓的都知道嘿嘿。
然后在U3D中,绑定在任意对象中, 把Activity传递给Android插件中。
02 | using System.Collections; |
04 | public class NewBehaviourScript : MonoBehaviour |
10 | if (GUILayout.Button( " Send QQ zone" , GUILayout.Height( 50 ))) |
13 | AndroidJavaClass jc = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ); |
15 | using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>( "currentActivity" )) |
17 | jo.Call( "LoginAndSend" ,jo); |
下面是Andorid插件的路径,记住把open_Sdk放进去,这个是腾讯提供的第三方包。运行后点击按钮就可以登录与分享说说。
![屏幕快照 2013-03-24 下午9.30.59](http://www.xuanyusong.com/wp-content/uploads/2013/03/屏幕快照-2013-03-24-下午9.30.59.png)
然后在Android手机上编译运行吧。
最后我在说说我使用QQ空间的感受。 空间分享包括2部分 分享链接 和分享说说,仔细查了一下才发现这两个东西差别挺大的。 文档上说这两个分享接口会被合并,最重要的是暂时不能分享本地图片、如果想分享本地图片有一个办法就是先调用上传图片的接口,把本地图片上传至QQ相册中,然后拿到URL后分享。总体来说希望企鹅的文档以后能写的在清楚一点,我是“连蒙带猜” 哎~
本文的源码下载,包括Android工程和U3D工程。
http://vdisk.weibo.com/s/uW42H