这一篇中我们要实现的就是简单实现微博的发布功能,在旧版本的微博官方 API 中,微博分开了各个接口,

写入接口 statuses/repost 转发一条微博信息 statuses/destroy 删除微博信息 statuses/update 发布一条微博信息 statuses/upload 上传图片并发布一条微博 statuses/upload_url_text 发布一条微博同时指定上传的图片或图片 url

而新版API只留了一个写入接口给我们

[](https://api.weibo.com/2/statuses/share.json)

请求方式 POST ,请求参数 token 和 Statues , token 就不说了,关键是这里的 Statues 要求,

用户分享到微博的文本内容,必须做 `URLencode` ,内容不超过140个汉字,文本中不能包含“#话题词#”,同时文本中必须包含至少一个第三方分享到微博的网页 URL ,且该 URL 只能是该第三方(调用方)绑定域下的 URL 链接,绑定域在“我的应用 - 应用信息 - 基本应用信息编辑 - 安全域名”里设置。

这时候首先我们要去完善这个安全域名的信息。通过它上边的提示,我们可以找到这个编辑安全域名的地方,但是我们并不能只填写安全域名,微博还要求我们把其他几项信息补全,否则我们不能保存该项信息

  • 这里需要下载微博的签名工具,包名信息我们可以在 AndroidManifest 文件中的第一项 manifest 标签中找到,然后将这个包名复制到手机上下载好的签名工具上,生成签名。

  • Android 下载地址:随便填写一个应用商店的地址即可,这里我填的是百度应用商店的地址。应用下载地址亦同。

  • 应用介绍、简介也都需要填,可以随便写写。 选好标签。

  • 接下来就是安全域名,这里我填写了依旧是百度的首页。安全域名填三级域名即可。

这里发布微博界面我们以 Activity 为基础写,是因为我想的有点多 23333 ,微博发布界面那个 Fragment 会有好几个选项,点击了相应的会跳转到不同的 Activity ,所以我们这里采用了 Activity 。废话不多说,来看。

首先我们分析,我们需要一个 EditText 输入文本和记录表情码,表情软键盘,一个 Button ,然后就是简单的处理发送了。

这里表情软键盘我使用了第三方库,这是比较过以后最好用的一个第三方库,首先我们还是要添加依赖

compile 'com.tb.emoji:yykEmoji:1.0.0'

库主的专栏

然后让你的 Activity 实现( Fragment 中 set 接口) FaceFragment.OnEmojiClickListener 来处理 emoji 的点击事件,用法只需要

FaceFragment faceFragment = FaceFragment.Instance();
getSupportFragmentManager().beginTransaction().add(R.id.Container,faceFragment).commit();

这里的 Container 只是一个显示最后带表情的微博文本结果的 TextView 。

在点击发布时候, onClick 方法:

@Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.send:
                OkHttpClient client=new OkHttpClient();
                Intent intent=getIntent();
                String access_token = getIntent().getStringExtra("access_token");
                //这里有个坑,就是添加安全域的时候前边一定要加个空格,否则会报错
                urlString=editText.getText().toString()+" https://www.baidu.com";
                urlString = URLEncoder.encode(urlString, "GBK");

                FormBody formBody=new FormBody.Builder().add("access_token",access_token)
                        .add("status",urlString)
                        .build();
                Request request = new Request.Builder().url("https://api.weibo.com/2/statuses/share.json").post(formBody).build();
                Call call = client.newCall(request);
                call.enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        String responseData = response.body().string();
                        System.out.println("发布的返回"+responseData);
                        Gson gson = new Gson();
                        Newone newone=new Newone();
                        newone=gson.fromJson(responseData,Newone.class);

                    }
                });

        }
    }

嗯,其他什么界面的流程,我做的都很糙,还显示了用户信息那个界面,和之前的操作一样,获取和解析数据,这里每个返回的 json 都会对应一个类,所以都要使用工具生成实体类,我首先做的是微博解析的原因就是因为,微博返回的 json 几乎涵盖了所有的类,更方便以后的数据处理,在这里还需要注意的几个坑就是,有的地方工具会给你生成 int 类型的值,但是int根本不够存放那个值的长度,所以需要你在碰到这类问题时候需要自己手动修改为 long 。

还有一个在设置赞转发评论数的时候遇到的问题,报错显示 Android.content.res.Resources$NotFoundException: String resource ID #0x1 ,

原因:一般发生在参数 int resId 错误,你把 String 赋值给int的 resId ,所以编译器找不到正确的 resource 于是报错。

最简单的例子,检查一下你的 Toast.makeText() 啊 textView.setText 啊之类的函数,这种函数通常有几个重载,如:

textView.setText(CharSequence text); textView.setText(int resId); ......

如果不小心将一个int值传给了它,那它不会显示该int值,而是跑到工程下去找一个对应的resource的id,当然是找不到的,于是就报错啦。

好了,这篇就是如此短小了,如果对您有用欢迎评论支持,谢谢阅读!

项目地址