每次新接触一个第三方sdk,根据官网文档接入完成之后,总是会出现各种各样的问题,为此做一下记录,方便有相同需求的朋友。
一、配置sdk到工程
1、将从官网下载的库文件open-sdk.jar、mta_sdk_x.x.x.jar加入到工程并添加到编译路径中。具体的操作步骤为:选中open-sdk.jar,右键菜单中选择Build Path, 选择Add to Build Path,如下图所示:
2、配置AndroidManifest文件
在应用的AndroidManifest.xml增加配置的<application>节点下增加以下配置(注:不配置将会导致无法调用API);
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application>
<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>
<application>
二、qq登录和注销
Tencent是SDK的功能入口,所有的接口调用都得通过Tencent进行调用。因此,调用SDK,首先需要创建一个Tencent实例,其代码如下:
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();
}
1、 实现回调 IUiListener
调用SDK已经封装好的接口时,例如:登录、快速支付登录、应用分享、应用邀请等接口,需传入该回调的实例。
IUiListener的实现示例代码如下:
private class baseuilistener implements iuilistener {
@override
public void oncomplete(jsonobject response) {
Util.toastMessage(m_instance, "oncomplete: ");
docomplete(response);
}
protected void docomplete(jsonobject values) {
}
@override
public void onerror(uierror e) {
Util.toastMessage(m_instance, "onError: " + e.errorDetail);
Util.dismissDialog();
}
@override
public void oncancel() {
Util.toastMessage(m_instance, "onCancel: ");
Util.dismissDialog()
}
}
public void qqLogin()
{
SdkApi.setLoginType(0);
if (!mTencent.isSessionValid()){
loginListener = new BaseUiListener() {
@Override
protected void doComplete(JSONObject values) {
initOpenidAndToken(values);
}
};
mTencent.login(m_instance, "all", loginListener);
}
else
mTencent.logout(m_instance);
}
三、qq分享
1、添加分享监听代码
IUiListener qqShareListener = new IUiListener() {
@Override
public void onCancel() {
if (shareType != QQShare.SHARE_TO_QQ_TYPE_IMAGE) {
Util.toastMessage(QQShareActivity.this, "onCancel: ");
}
}
@Override
public void onComplete(Object response) {
// TODO Auto-generated method stub
Util.toastMessage(QQShareActivity.this, "onComplete: " + response.toString());
}
@Override
public void onError(UiError e) {
// TODO Auto-generated method stub
Util.toastMessage(QQShareActivity.this, "onError: " + e.errorMessage, "e");
}
};
2、分享给好友
public static void qqShare(){
Bundle params = new Bundle()
params.putString(QQShare.SHARE_TO_QQ_TITLE, title);
params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, targetUrl);
//分享的消息摘要,最长50个字
params.putString(QQShare.SHARE_TO_QQ_SUMMARY, summary);
params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, imageUrl);//分享的图片url
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, appName);
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
//params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, mExtarFlag);
Runnable payRunnable = new Runnable() {
@Override
public void run() {
if (null != mTencent) {
mTencent.shareToQQ(m_instance, params, qqShareListener);
}
}
};
Thread checkThread = new Thread(payRunnable);
checkThread.start();
}
3、分享到空间
public static void qqZoneShare(){
Bundle params = new Bundle()
params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);//图文形式
params.putString(QzoneShare.SHARE_TO_QQ_TITLE, title);
params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, summary);
params.putString(QzoneShare.SHARE_TO_QQ_APP_NAME, appName);
params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, targetUrl);
ArrayList<String> imageUrls = new ArrayList<String>();
imageUrls.add(imageUrl);
params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrls);
Runnable payRunnable = new Runnable() {
@Override
public void run() {
if (null != mTencent) {
mTencent.shareToQzone(m_instance, params, qqShareListener);
}
}
};
Thread checkThread = new Thread(payRunnable);
checkThread.start();
}
4、特别注意
应用调用Andriod_SDK接口时,如果要成功接收到回调,需要在调用接口的Activity的onActivityResult方法中增加如下代码:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "-->onActivityResult " + requestCode + " resultCode=" + resultCode);
if (requestCode == Constants.REQUEST_LOGIN ||
requestCode == Constants.REQUEST_APPBAR) {
mTencent.onActivityResultData(requestCode,resultCode,data,loginListener);
}
else if (requestCode == Constants.REQUEST_QQ_SHARE || requestCode == Constants.REQUEST_QZONE_SHARE ||
resultCode == Constants.ACTIVITY_OK) {
mTencent.onActivityResultData(requestCode,resultCode,data,qqShareListener);
}
super.onActivityResult(requestCode, resultCode, data);
}
上边的代码一定一定要添加,否则无法接收回调。
注意:QZone接口暂不支持发送多张图片的能力,若传入多张图片,则会自动选入第一张图片作为预览图。多图的能力将会在以后支持。:
另外发现,参数targetUrl对于一些含有特殊字符的链接在分享到好友时没有问题,分享到空间时会出现url error错误