android 开发 微博分享时遇到的坑
2017-12-15 17:25
190 查看
最近想项目中遇见了写微博分享,就专门下了微博SDK去看,开始肯定是要先去微博开发平台上申请开发者并注册app,成功后会获得App Key和App Secret,然后才可以进行下面的操作,但在写的过程中发现微博的SDK还是有点坑的,这里列举出来,以便以后避开坑,踩坑是真难受啊,下面挨着讲述一下。
1:微博分享将app注册到微博的时候,sdk里面会判断你是否安装微博,没有了的话提示你安装,但是他是在onCreate方法里面写的,而你在项目中要是写到onCreate方法的话,那么每次进入这个activity中就会提示用户安装微博,写到分享微博的点击事件里面就好了,代码在下面。
2:分享时要上传图片官方给的代码如下
而我们其实是要放入一个网络得到l的图片的,所以我们要将得到的url转化为bitmap在放进去就好了,而这个转换查了好久,终于找到了一个比较好的方法,首先是要用异步的,将图片的url以流的方式转换为bitmap,直接上转换的代码
然后写一个内部AsyncTask类
将url转为bitmap的方法,试了各种都没成功,也就没试BitmapFactory.decodeStream这个方法,然后就是用这个方法的,我也是醉了,哈哈
微博分享的方法
下面这是分享各种类型的方法
3:然后一个问题就是微博回调的坑了,当时试了好久,总算找到问题了,然后得到回调了。
首先我们要知道,QQ,微信,微博,他们三个的分享是有区别的,QQ在manifest里面有2个activity,他们都是集成好的类
微信的类是自己写的,但是它也是sdk集成好的,也就是说在manifest里面要有注册的对应activity,而可以发现微博是没有的
所以微博就和他们有点不一样的了,微博实现回调如下
第一;肯定是要注册自己的app
第二:实现回调,下面是sdk里面的方法,介绍的很清楚,刚开始我以为这个方法是没用的,一直都是把他注释掉的状态,今天才发现接收回调是先进入这个方法,然后在进入
onResponse回调的方法
onResponse回调的方法如下,他实现的接口是IWeiboHandler.Response
第三:也是我万万没想到的一个地方,也是个微信 QQ最大的区别,我们要在用到微博分享的activity在mainfest里添加intent-filter,也就是下面的代码,具体为什么呢,我想应该是微博的sdk不知道要回调到哪个activity,你看微信和QQ在manifest里面都头sdk继集成好的activity,所以微博就要自己去写了,用intent-filter去告诉微博你给我回调到这个activity里面,里面的action也是隐式跳转,而category也是默认,说了这么多,看代码
然后你一调试就发现微博回调终于进去了,好开心,哈哈哈
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>
然后你一调试就发现微博回调终于进去了,好开心,哈哈哈
相关文章推荐
- Android开发 APP集成QQ、微信和微博分享
- android分享功能开发-短信,微博
- 分享 Ionic 开发 Hybrid App 中遇到的问题以及后期发布 iOS/Android 的方方面面
- 【Android】开发中个人遇到和使用过的值得分享的资源合集
- umeng(Android)分享遇到的问题和心得,我只要分享(自定义pannel)(微信、朋友圈、QQ、QQ空间、微博分享)
- Android开发——集成友盟社会化分享遇到的坑(二)
- Android 开发微信分享功能遇到的问题
- 分享 Ionic 开发 Hybrid App 中遇到的问题以及后期发布 iOS/Android 的方方面面
- Android开发中个人遇到和使用过的值得分享的资源合集
- Android应用开发实战第二版 demo 基于服务的微博照片分享(修改版)
- Android开发——集成友盟社会化分享遇到的坑(一)
- 分享磨砺营马剑威讲解-android项目开发第二弹
- 我在Android开发中遇到的一些问题
- android微信分享遇到的问题
- android开发遇到的问题
- android开发过程中遇到错误的笔记
- Android 开发源码分享
- Android: 用twitter4j做twitter分享的时候遇到的问题
- 分享我开发的网络电话Android手机APP正式版,图文详解及下载
- Android display架构分析八-Display 开发的经验分享