赞
踩
(1)QQShare
(一)创建并配置工程
<!--权限-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--注册所需组件-->
<activity
android:name="com.tencent.tauth.AuthActivity"
android:noHistory="true"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tencent你的AppId" />
</intent-filter>
</activity>
<!--SDK_V2.0引入了AssistActivity-->
<activity android:name="com.tencent.connect.common.AssistActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize"
/>
(二)创建实例并实现回调
1. 创建实例
Tencent是SDK的功能入口,所有的接口调用都得通过Tencent进行调用。因此,调用SDK,首先需要创建一个Tencent实例,其代码如下:
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。
// 其中APP_ID是分配给第三方应用的appid,类型为String。
mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext());
// 1.4版本:此处需新增参数,传入应用程序的全局context,可通过activity的getApplicationContext方法获取
// 初始化视图
initViews();
}
private class BaseUiListener implements IUiListener {
@Override
public void onComplete(JSONObject response) {
mBaseMessageText.setText("onComplete:");
mMessageText.setText(response.toString());
doComplete(response);
}
protected void doComplete(JSONObject values) {
}
@Override
public void onError(UiError e) {
showResult("onError:", "code:" + e.errorCode + ", msg:"
+ e.errorMessage + ", detail:" + e.errorDetail);
}
@Override
public void onCancel() {
showResult("onCancel", "");
}
}
2.2 实现回调 IRequestListener
使用requestAsync、request等通用方法调用sdk未封装的接口时,例如上传图片、查看相册等,需传入该回调的实例。
IRequestListener的实现示例代码如下:
private class BaseApiListener implements IRequestListener {
@Override
public void onComplete(final JSONObject response, Object state) {
showResult("IRequestListener.onComplete:", response.toString());
doComplete(response, state);
}
protected void doComplete(JSONObject response, Object state) {
}
@Override
public void onIOException(final IOException e, Object state) {
showResult("IRequestListener.onIOException:", e.getMessage());
}
@Override
public void onMalformedURLException(final MalformedURLException e,
Object state) {
showResult("IRequestListener.onMalformedURLException", e.toString());
}
@Override
public void onJSONException(final JSONException e, Object state) {
showResult("IRequestListener.onJSONException:", e.getMessage());
}
@Override
public void onConnectTimeoutException(ConnectTimeoutException arg0,
Object arg1) {
// TODO Auto-generated method stub
}
@Override
public void onSocketTimeoutException(SocketTimeoutException arg0,
Object arg1) {
// TODO Auto-generated method stub
}
//1.4版本中IRequestListener 新增两个异常
@Override
public void onNetworkUnavailableException(NetworkUnavailableException e, Object state){
// 当前网络不可用时触发此异常
}
@Override
public void onHttpStatusException(HttpStatusException e, Object state) {
// http请求返回码非200时触发此异常
}
public void onUnknowException(Exception e, Object state) {
// 出现未知错误时会触发此异常
}
}
应用在调用SDK提供的接口时,将实现了对应回调接口的实例传入。当SDK的接口调用完成后,具体如登录、应用邀请和应用分享调用完成后,会回调传入的接口实例。
3. 特别注意
应用调用Andriod_SDK接口时,如果要成功接收到回调,需要在调用接口的Activity的onActivityResult方法中增加如下代码:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Tencent.onActivityResultData(requestCode,resultCode,data,listener);
}
其中onActivityResultData接口中的listener为当前调用的Activity所实现的相应回调UIListener。
public void share(View view)
{
Bundle bundle = new Bundle();
//这条分享消息被好友点击后的跳转URL。
bundle.putString(Constants.PARAM_TARGET_URL, "http://connect.qq.com/");
//分享的标题。注:PARAM_TITLE、PARAM_IMAGE_URL、PARAM_ SUMMARY不能全为空,最少必须有一个是有值的。
bundle.putString(Constants.PARAM_TITLE, "我在测试");
//分享的图片URL
bundle.putString(Constants.PARAM_IMAGE_URL,
"http://img3.cache.netease.com/photo/0005/2013-03-07/8PBKS8G400BV0005.jpg");
//分享的消息摘要,最长50个字
bundle.putString(Constants.PARAM_SUMMARY, "测试");
//手Q客户端顶部,替换“返回”按钮文字,如果为空,用返回代替
bundle.putString(Constants.PARAM_APPNAME, "??我在测试");
//标识该消息的来源应用,值为应用名称+AppId。
bundle.putString(Constants.PARAM_APP_SOURCE, "星期几" + AppId);
mTencent.shareToQQ(this, bundle , listener);
}
特别注意:一定要添加以下代码,才可以从回调listener中获取到消息。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (null != mTencent)
mTencent.onActivityResult(requestCode, resultCode, data);
}
(2)获取用户信息
在SDK中,有一些功能接口,如登录,分享消息到QQ等,SDK对其调用单独封装成了独立的接口;但是,SDK中的另外一些接口,如获取用户信息、获取用户相册列表、发送分享(addshare)、发表说说、上传图片、创建相册等,则被统一封装在Tencent类的request或requestAsync方法中,通过传入不同的参数实现不同的接口调用。request和requestAsync这两个接口的功能相同。
获取用户信息有两种方式:同步方式和异步方式
request(String graphPath, Bundle params, String httpMethod)
发送同步调用请求访问腾讯提供的OpenAPI。
requestAsync(String graphPath, Bundle params, String httpMethod, IRequestListener listener, Object state)
public void getUserInfo()
{
mTencent.requestAsync(Constants.GRAPH_SIMPLE_USER_INFO, null,
Constants.HTTP_GET, new BaseApiListener("get_simple_userinfo", false),
null);
}
2.2 同步方式调用
注意:由于同步调用直接访问网络,是延时性操作,需要放入线程中执行。
public void getUserInfoInThread()
{
new Thread(){
@Override
public void run() {
JSONObject json = mTencent.request(Constants.GRAPH_SIMPLE_USER_INFO, null, Constants.HTTP_GET);
System.out.println(json);
}
}.start();
}
{
"is_yellow_year_vip": "0",
"ret": 0,
"figureurl_qq_1":
"http://q.qlogo.cn/qqapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/40",
"figureurl_qq_2":
"http://q.qlogo.cn/qqapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/100",
"nickname": "小罗",
"yellow_vip_level": "0",
"msg": "",
"figureurl_1":
"http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/50",
"vip": "0",
"level": "0",
"figureurl_2":
"http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/100",
"is_yellow_vip": "0",
"gender": "男",
"figureurl":
"http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/30"
}
(2)更换QQ头像
1. 简单调用
更换QQ头像, 使用的是Tencent类的setAvatar方法;调用以下代码就可以实现;其中,listener是一个IUiListener实例。
private void doSetAvatar(String imagePath) {
Bundle params = new Bundle();
params.putString(Constants.PARAM_AVATAR_URI, imagePath);
mTencent.setAvatar(this, params, listener);
}
2. 从相机或相册中获取照片设置为QQ头像
在实际使用中,用户一般希望从相册中获得照片,或者调用相机进行拍照,再将其设置为QQ头像。因此,下面将讲解从相册中获取图片设置为头像的例子。
2.1 调用系统的Intent获取图片
我们可以发Intent,从手机内存中读取图片,也可以直接调用照相机进行拍照。
下面是从手机内存读取图片:
private void onClickSetAvatar() {
if (ready()) {
Intent intent = new Intent();
// 开启Pictures画面Type设定为image
intent.setType("image/*");
// 使用Intent.ACTION_GET_CONTENT这个Action
intent.setAction(Intent.ACTION_GET_CONTENT);
// 取得相片后返回本画面
startActivityForResult(intent, REQUEST_SET_AVATAR);
// 在 onActivityResult 中调用 doSetAvatar
}
2.2 在onActivityResult里获取图片,并设置头像
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (mTencent == null){
return;
}
if (!mTencent.onActivityResult(requestCode, resultCode, data)) {
if (data != null) {
if (requestCode == REQUEST_SET_AVATAR) {
doSetAvatar(data.getData());
}
}
}
}
private void doSetAvatar(Uri uri) {
Bundle params = new Bundle();
params.putString(Constants.PARAM_AVATAR_URI, uri.toString());
// 这个return_activity是可选的
// params.putString(Constants.PARAM_AVATAR_RETURN_ACTIVITY,
// "com.tencent.sample.ReturnActivity");
// mTencent.setAvatar(this, params, new BaseUiListener());
mTencent.setAvatar(this, params, new BaseUiListener(), R.anim.zoomin, R.anim.zoomout);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。