Android:使用Fabric,Twitter REST API和Retrofit添加图片到推文

问题描述:

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

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

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

我还发现,就可以定制面料提供访问服务端点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,我如何使用它将该媒体对象附加到由Statuses Service的更新功能创建的推文上?我还没有在文档中找到任何附加实体的方法。

到目前为止,我有这样的:

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工具包中,为媒体上传和媒体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) { 
     //... 
    } 
}); 
+0

你检查参数'media_data',则需要发送。我试图用你的代码发送图像,但它没有第三个参数。 – Shvet

+0

如果您使用媒体服务上载媒体并在状态服务中使用媒体ID,则应该足够了。我在我的应用程序中使用了这段代码,它工作得很好。你可能会发布你的解决方案,所以我们可以看到你的代码有什么问题吗? – hildegard

+0

我该如何上传多张图片?请帮忙? –