Android 之 QQ分享

(1)QQShare


(一)创建并配置工程

  1. 新建工程并导入SDK的jar文件
    (1)创建一个工程,并把open-sdk.jar文件和mta_sdk_x.x.x.jar文件拷贝到libs(或lib)目录下,
    (2)将open-sdk.jar加入编译路径中
    1. 配置AndroidManifest
<!--权限-->
<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();
}
  1. 实现回调
    所有的SDK接口调用,都会传入一个回调,用以接收SDK返回的调用结果。回调的主要接口有两种:
    2.1 实现回调 IUiListener
    调用SDK已经封装好的接口时,例如:登录、快速支付登录、应用分享、应用邀请等接口,需传入该回调的实例。
    IUiListener的实现示例代码如下:
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。

  1. 调用SDK接口实现分享
    由于QQ分享并不需要提前登录,因此,可以直接调用Tencent.shareToQQ的接口;接口调用很简单,代码如下:
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)获取用户信息


  1. Tencent类的request或requestAsync接口简介

在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)

这里写图片描述

  1. 获取用户信息
    2.1 异步方式调用
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();
}
  1. 用户信息详情
{
"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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android 平台上使用 QQ 分享本地图片,你需要使用 QQ SDK 提供的 API。以下是分享本地图片的基本步骤: 1. 在你的项目中添加 QQ SDK,并在 AndroidManifest.xml 文件中添加必要的权限和配置。 2. 创建一个 Intent 对象并设置 action 为 Intent.ACTION_SEND,type 为 "image/*"。 3. 将本地图片的 URI 作为 Intent 的 EXTRA_STREAM 属性,使用 ContentProvider.getUriForFile() 方法将本地文件转换为 URI。 4. 调用 startActivityForResult() 方法启动分享界面。 5. 在 onActivityResult() 方法中处理分享结果。 下面是一个简单的示例代码,用于分享本地图片到 QQ: ```java private void shareImageToQQ(String imagePath) { // 将本地图片文件转换为 URI Uri imageUri = FileProvider.getUriForFile(this, "com.example.fileprovider", new File(imagePath)); // 创建分享 Intent Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_STREAM, imageUri); intent.setPackage("com.tencent.mobileqq"); // 启动分享界面 startActivityForResult(intent, 0); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 处理分享结果 if (requestCode == 0) { if (resultCode == RESULT_OK) { // 分享成功 } else { // 分享失败 } } } ``` 注意,如果要分享QQ 空间或者 QQ 好友,需要使用不同的 Intent 类型和属性。具体请参考 QQ SDK 的文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值