【问题标题】:Android: adding image to tweet using Fabric, Twitter REST API and RetrofitAndroid:使用 Fabric、Twitter REST API 和 Retrofit 将图像添加到推文
【发布时间】:2015-10-25 11:11:08
【问题描述】:

我正在开发一个应用程序,用户可以在该应用程序中将某些内容发布到 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,我如何使用它将这个媒体对象附加到由 Statuses 服务的更新功能创建的推文?我在文档中没有找到任何附加实体的方法。

到目前为止,我有这个:

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);

}

有没有知识更丰富的人可以给我更多的指导?提前致谢!

【问题讨论】:

    标签: android twitter media retrofit twitter-fabric


    【解决方案1】:

    最后,在最新版本的 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) {
             //...
        }
    });
    

    【讨论】:

    • 你检查参数media_data了吗,需要发送。我正在尝试使用您的代码发送图像,但它没有第三个参数。
    • 如果你用媒体服务上传媒体,并在状态服务中使用媒体ID,应该就够了。我在我的应用程序中使用了这段代码,它工作得很好。您能否发布您的解决方案,以便我们查看您的代码有什么问题?
    • 如何上传多张图片,您能帮忙吗?
    • @Ammarali 首先,您必须一张一张上传图像并从回调中获取它们的媒体 ID。然后你必须用逗号分隔所有媒体 ID 的字符串(例如,如果你上传了 2 张图片,你从上传结果回调中返回了 mediaID1 和 mediaID2,那么你会创建一个类似“mediaID1,mediaID2”的字符串. 然后你调用状态服务的更新方法并像我一样使用你的媒体ID字符串(在mediaResult.data.mediaIdString的地方)。我希望这会有所帮助:)
    猜你喜欢
    • 2015-01-10
    • 2016-04-15
    • 2015-10-26
    • 1970-01-01
    • 2016-02-16
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多