您的位置:首页 > 移动开发 > Android开发

android 开发 微博分享时遇到的坑

2017-12-15 17:25 190 查看
最近想项目中遇见了写微博分享,就专门下了微博SDK去看,开始肯定是要先去微博开发平台上申请开发者并注册app,成功后会获得App Key和App Secret,然后才可以进行下面的操作,但在写的过程中发现微博的SDK还是有点坑的,这里列举出来,以便以后避开坑,踩坑是真难受啊,下面挨着讲述一下。

1:微博分享将app注册到微博的时候,sdk里面会判断你是否安装微博,没有了的话提示你安装,但是他是在onCreate方法里面写的,而你在项目中要是写到onCreate方法的话,那么每次进入这个activity中就会提示用户安装微博,写到分享微博的点击事件里面就好了,代码在下面。

iWeiboShareAPI = WeiboShareSDK.createWeiboAPI(ProductActivity.this, Constant.APP_KEY_WEIBO);//这里输入App Key
iWeiboShareAPI.registerApp();//将应用注册到微博客户端

2:分享时要上传图片官方给的代码如下

private ImageObject getImageObj() {
ImageObject imageObject = new ImageObject();
BitmapDrawable bitmapDrawable = (BitmapDrawable) mImageView.getDrawable();
imageObject.setImageObject(bitmapDrawable.getBitmap());
return imageObject;
}

而我们其实是要放入一个网络得到l的图片的,所以我们要将得到的url转化为bitmap在放进去就好了,而这个转换查了好久,终于找到了一个比较好的方法,首先是要用异步的,将图片的url以流的方式转换为bitmap,直接上转换的代码

//点击微博开启异步获得bitmap图片
String url = product.getSpuDetail().getImageUrlList().get(0);
new GetBitMapAsyncTask().execute(url);

然后写一个内部AsyncTask类

private class GetBitMapAsyncTask extends AsyncTask {//泛型的三个参数,第一个是网络请求需要的参数,第二个是进度,第三个是result
//执行任务前的操作
@Override
protected void onPreExecute() {
super.onPreExecute();
}

//内部执行后台任务,不可在此方法内修改UI
@Override
protected Bitmap doInBackground(String... strings) {
Log.e(TAG, "doInBackground(Params... params) called");
return getHttpBitmap(strings[0]);//这里的strings是数组,长度为一所以用下表0,意思就是支持多线程的,参数不止一个
}

//用于更新进度信息
@Override
protected void onProgressUpdate(Integer... values) {
Log.e(TAG, "onProgressUpdate(Progress... progresses) called");
}

//用于在执行完后台任务后更新UI,显示结果
@Override
protected void onPostExecute(Bitmap bitmap) {
Log.e(TAG, "onPostExecute(Result result) called");
sendMultiMessageToWeibo(true, true, true, bitmap);//这个是发送微博的方法,就是跟sdk上的一痒
}
//取消的操作(不带结果)
@Override
protected void onCancelled() {
super.onCancelled();
}
//取消的操作(带结果的,也就是所谓的返回值)
@Override
protected void onCancelled(Bitmap bitmap) {
super.onCancelled(bitmap);
}
}


将url转为bitmap的方法,试了各种都没成功,也就没试BitmapFactory.decodeStream这个方法,然后就是用这个方法的,我也是醉了,哈哈

/**
* 将网络图片转换为Bitmap
*
* @param url
* @return
*/
public Bitmap getHttpBitmap(String url) {
Bitmap bitmap = null;
try {
URL pictureUrl = new URL(url);
InputStream in = pictureUrl.openStream();
bitmap = BitmapFactory.decodeStream(in);
in.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return bitmap;
}

微博分享的方法

/**
* 发送多种消息到微博
*
* @param hasText:是否有文本
* @param hasImage:是否有图片
*/
private void sendMultiMessageToWeibo(boolean hasText, boolean hasImage, boolean hasWebpage, Bitmap wbShareBitmap) {
WeiboMultiMessage weiboMessage = new WeiboMultiMessage();//初始化微博的分享消息

//文字
if (hasText) {
weiboMessage.textObject = getTextObj();
}
//图片
if (hasImage) {
weiboMessage.imageObject = getImageObj(compressImage(wbShareBitmap));
}
//网页
if (hasWebpage) {
weiboMessage.mediaObject = getWebpageObj();
}

SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
request.transaction = String.valueOf(System.currentTimeMillis());
request.multiMessage = weiboMessage;
iWeiboShareAPI.sendRequest(request);//发送请求消息到微博,唤起微博分享界面
}

下面这是分享各种类型的方法

/**
* 获取文本信息对象
*
* @return TextObject
*/
private TextObject getTextObj() {
TextObject textObject = new TextObject();
textObject.text = "我在萌趣里发现了的一个不错的商品,赶快来看看把。";//这里输入文本
return textObject;
}

/**
* 创建图片消息对象。
*
* @return 图片消息对象。
*/
private ImageObject getImageObj(Bitmap bitmap) {
ImageObject imageObject = new ImageObject();
imageObject.setImageObject(bitmap);
return imageObject;
}

/**
* 创建网页对象
*
* @return
*/
private BaseMediaObject getWebpageObj() {//这个方法里面一个参数都不能少,开始以为描述和设置图片参数是没用的,其实它是当你没网时或失败时用的
WebpageObject mediaObject = new WebpageObject();
mediaObject.identify = Utility.generateGUID();
mediaObject.title = product.getSpuDetail().getName() + product.getSpuDetail().getBriefDescription();
mediaObject.description = "萌趣用着真的是好啊!";
mediaObject.setThumbImage(BitmapFactory.decodeResource(getResources(), R.mipmap.icon));
mediaObject.actionUrl = Constant.USUAL_ISSUE_URL;
return mediaObject;
}

3:然后一个问题就是微博回调的坑了,当时试了好久,总算找到问题了,然后得到回调了。
首先我们要知道,QQ,微信,微博,他们三个的分享是有区别的,QQ在manifest里面有2个activity,他们都是集成好的类



微信的类是自己写的,但是它也是sdk集成好的,也就是说在manifest里面要有注册的对应activity,而可以发现微博是没有的



所以微博就和他们有点不一样的了,微博实现回调如下

第一;肯定是要注册自己的app

//微博sdk
iWeiboShareAPI = WeiboShareSDK.createWeiboAPI(ProductActivity.this, Constant.APP_KEY_WEIBO);//这里输入App Key
iWeiboShareAPI.registerApp();//将应用注册到微博客户端
//判断用户是否安装微博,记得要放在需要判断的地方,比如点击微博的时候才判断
if (!iWeiboShareAPI.isWeiboAppInstalled()) {
iWeiboShareAPI.registerWeiboDownloadListener(new IWeiboDownloadListener() {
@Override
public void onCancel() {
Toast.makeText(ProductActivity.this, "取消下载", Toast.LENGTH_SHORT).show();
}
});
}

第二:实现回调,下面是sdk里面的方法,介绍的很清楚,刚开始我以为这个方法是没用的,一直都是把他注释掉的状态,今天才发现接收回调是先进入这个方法,然后在进入

onResponse回调的方法

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// 从当前应用唤起微博并进行分享后,返回到当前应用时,需要在此处调用该函数
// 来接收微博客户端返回的数据;执行成功,返回 true,并调用
// {@link IWeiboHandler.Response#onResponse};失败返回 false,不调用上述回调
iWeiboShareAPI.handleWeiboResponse(intent, this);
}

onResponse回调的方法如下,他实现的接口是IWeiboHandler.Response

/**
* 微博分享回调
*/
@Override
public void onResponse(BaseResponse baseResponse) {
switch (baseResponse.errCode) {
case WBConstants.ErrorCode.ERR_OK:
Toast.makeText(this, "分享成功", Toast.LENGTH_LONG).show();
break;
case WBConstants.ErrorCode.ERR_CANCEL:
Toast.makeText(this, "分享取消", Toast.LENGTH_LONG).show();
break;
case WBConstants.ErrorCode.ERR_FAIL:
Toast.makeText(this, "分享失败" + "Error Message: " + baseResponse.errMsg, Toast.LENGTH_LONG).show();
break;
}
}

第三:也是我万万没想到的一个地方,也是个微信 QQ最大的区别,我们要在用到微博分享的activity在mainfest里添加intent-filter,也就是下面的代码,具体为什么呢,我想应该是微博的sdk不知道要回调到哪个activity,你看微信和QQ在manifest里面都头sdk继集成好的activity,所以微博就要自己去写了,用intent-filter去告诉微博你给我回调到这个activity里面,里面的action也是隐式跳转,而category也是默认,说了这么多,看代码
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

然后你一调试就发现微博回调终于进去了,好开心,哈哈哈
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: