繁体   English   中英

Android:使用Fabric,Twitter REST API和Retrofit为tweet添加图像

[英]Android: adding image to tweet using Fabric, Twitter REST API and Retrofit

我正在开发一个应用程序,用户可以将某些内容发布到Twitter,也可以将照片添加到推文中。 我是Fabric和Retrofit的新手,所以我对如何实现图像上传以及如何使用Statuses Service的更新功能使用上传的图像有一些疑问。 (我知道TweetComposer允许轻松发布带有推文的图像,但我不想要额外的Twitter UI元素,我也希望能够以编程方式设置与推文相关联的位置,这对于TweetComposer来说是不可能的)。

到目前为止我所理解的是,为了在使用状态服务更新方法发布的推文中包含图像,我们需要首先将图像本身上传到Twitter。 我发现通过REST API上传图像是通过使用以下URL完成的:

https://upload.twitter.com/1.1/media/upload.json

我还发现可以自定义Fabric中提供的Twitter API客户端来访问服务端点。

class MyTwitterApiClient extends TwitterApiClient {
    public MyTwitterApiClient(TwitterSession session) {
        super(session);
    }

    /**
     * Provide CustomService with defined endpoints
     */
    public CustomService getCustomService() {
        return getService(CustomService.class);
    }
}

// example users/show service endpoint
interface CustomService {
    @GET("/1.1/users/show.json")
    void show(@Query("user_id") long id, Callback<User> cb);
}

但是,我很乐意得到更多解释。 首先,如何在API客户端中更改域(到upload.twitter.com)以及我应该在回调中期望什么类型?

此外,如果图像上传成功并且我设法获取其ID,我如何使用它将此媒体对象附加到由状态服务的更新功能创建的推文? 我没有在文档中找到任何附加实体的方法。

到目前为止我有这个:

public class MyTwitterApiClient extends TwitterApiClient {

    public MyTwitterApiClient(TwitterSession session)
    {
        super(session);
    }

    public UploadMediaService getUploadMediaService() {

        return getService(UploadMediaService.class);
    }


}

interface UploadMediaService {

    @Multipart
    @POST("1.1/media/upload.json")
    void upload(@Part("media") TypedFile file, @Part("additional_owners") String owners, Callback cb);

}

有没有更有知识的人可以给我一些指导? 提前致谢!

最后,在最新版本的Twitter Kit中添加了支持媒体上传和使用媒体ID的推文(使用StatusesService)。

我已经能够通过添加以下代码使用StatusesService发送图片:

File photo = new File(mCurrentPhotoPath);
TypedFile typedFile = new TypedFile("application/octet-stream", photo);

MediaService ms = twitterclient.getMediaService();

ms.upload(typedFile, null, null, new Callback<Media>() {
    @Override
    public void success(Result<Media> mediaResult) {

    StatusesService statusesService = TwitterCore.getInstance().getApiClient(session).getStatusesService();

    statusesService.update("@##### " + eventtype + " lähellä paikkaa: " + place.getText().toString() + ";\n" + comment.getText().toString(), null, false, mypos.latitude, mypos.longitude, null, true, false, mediaResult.data.mediaIdString, new Callback<Tweet>() {
        @Override
        public void success(Result<Tweet> tweetResult) {
             //...
        }

        @Override
        public void failure(TwitterException e) {
            //...                      
        }

      });

    }

    @Override
    public void failure(TwitterException e) {
         //...
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM