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

最近想项目中遇见了写微博分享,就专门下了微博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>

然后你一调试就发现微博回调终于进去了,好开心,哈哈哈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值