2016-04-17 16 views
0

自分のAPIを使用してTwitterに画像をアップロードしようとしていますが、使用してから間違いなくファイルを見つけることができないというエラーが表示されません同じパスを他のネットワークに正常にアップロードし、プレビューボックスに正しく表示されます。APIを使用してTwitterに画像をアップロードできません

com.twitter.sdk.android.core.TwitterApiException: /-1/1/content:/media/external/images/media/100883/ORIGINAL/NONE/1159437588: open failed: ENOENT (No such file or directory) 
W/System.err:  at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:390) 
W/System.err:  at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220) 
W/System.err:  at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278) 
W/System.err:  at retrofit.CallbackRunnable.run(CallbackRunnable.java:42) 
W/System.err:  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423) 
W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
W/System.err:  at java.lang.Thread.run(Thread.java:818) 

いくつかのグーグルでは、このエラーは、Android向けのTwitter SDKの古いバージョンで修正されていることを意図して示し、人々はそれがあった確認しているが、それはしばらく前だったと私は最新バージョンを使用しています1.13.0

次のように私はこれをアップロードするために使用しているコードは次のとおりです。

//img = Uri passed from calling method 
File photo = new File(img.getPath()); 
TypedFile typedFile = new TypedFile("application/octet-stream", photo); 
TwitterApiClient twitterApiClient = TwitterCore.getInstance().getApiClient(twitSession); 
MediaService mediaService = twitterApiClient.getMediaService(); 
final StatusesService statusesService = twitterApiClient.getStatusesService(); 

mediaService.upload(typedFile, null, null, new Callback<Media>() { 
    @Override 
    public void success(final Result<Media> result) { 
     statusesService.update(input, null, null, null, null, 
     null, null, null, result.data.mediaIdString, new Callback<Tweet>() { 
        @Override 
        public void success(Result<Tweet> result) { 
         Log.d("Twitter image callback", "Successfully posted image and text to Twitter!"); 
        } 

        @Override 
        public void failure(TwitterException e) { 
         if (result != null) { 
          Log.e("Twitter image callback", "Result is - " + result.toString()); 
         } 
         Log.d("Twitter image callback", "Failed to post image and text to Twitter!"); 
        } 
       }); 
    } 

    @Override 
    public void failure(TwitterException e) { 
     Log.d("Twitter image callback", "Failed to upload image to Twitter!"); 
     e.printStackTrace(); 
    } 
}); 

誰もがここで何が悪かったのかを知っていると私はこの作業を取得することができるよどのようにしていますか?

+0

これは、単純にファイルをアップロードすることは非常に複雑に見えます。私はこれが外部ライブラリ(TwitterApiClient)を使用しているかどうかはわかりませんが、そうでない場合は、チャンクごとに5MB未満をアップロードしていることを確認する必要があります。また、INIT、APPEND(バイナリで)およびENDを呼び出すMultiPartクエリを使用する必要があります。 – Linvi

+0

C#を使用することができれば、書いたライブラリ([Tweetinvi](https://github.com/linvi/tweetinvi))をお勧めします。イメージを簡単に公開することができます: 'var media = Upload.UploadImage(File.ReadAllBytes( "path")); ' – Linvi

答えて

0
/** 
* @return The MIME type for the given file. 
*/ 
private String getMimeType(File file) { 
    final String ext = getExtension(file.getName()); 
    if (!TextUtils.isEmpty(ext)) { 
     return MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext); 
    } 
    // default from https://dev.twitter.com/rest/public/uploading-media 
    return "application/octet-stream"; 
} 



/** 
* @return the extension of the given file name, excluding the dot. For example, "png", "jpg". 
*/ 
private String getExtension(String filename) { 
    if (filename == null) { 
     return null; 
    } 
    final int i = filename.lastIndexOf("."); 
    return i < 0 ? "" : filename.substring(i + 1); 
} 

ます。private void socialTwitterLoginAndUploadMedia(){

mTwitterAuthClient.authorize(this, new Callback<TwitterSession>() { 
     @Override 
     public void success(Result<TwitterSession> result) { 
      Call<User> user = TwitterCore.getInstance().getApiClient().getAccountService().verifyCredentials(false, false, false); 
      user.enqueue(new Callback<User>() { 
       @Override 
       public void success(Result<User> userResult) { 
        tw_User_name = userResult.data.name; 
        tw_User_screen_Name = userResult.data.screenName; 
        tw_User_id = String.valueOf(userResult.data.id); 
        tw_User_profile_image = userResult.data.profileImageUrl; 


        if(imageFile != null) { 
         final TwitterSession session = TwitterCore.getInstance().getSessionManager().getActiveSession(); 
         MyTwitterApiClient myTwitterApiClient = new MyTwitterApiClient(session); 

         RequestBody requestBodyprofilePic = null; 
         MultipartBody.Part body = null; 
         final String mimeType = getMimeType(imageFile); 
         requestBodyprofilePic = RequestBody.create(MediaType.parse(mimeType), imageFile); 
         // body = MultipartBody.Part.createFormData("media", imageFile.getName(), requestBodyprofilePic); 

         myTwitterApiClient.getMediaService().upload(requestBodyprofilePic, null, null).enqueue(new retrofit2.Callback<Media>() { 
          @Override 
          public void onResponse(Call<Media> call, Response<Media> response) { 
           Log.e("Upload Success Id int=", response.body().mediaId+"="); 
           Log.e("Upload Success Id=", response.body().mediaIdString); 
           Log.e("Upload Success Size=", response.body().size+"="); 
           Log.e("Upload Success ImageType=", response.body().image.imageType); 

          } 

          @Override 
          public void onFailure(Call<Media> call, Throwable t) { 
           Log.e(TAG, "Upload Tweet Error"); 
          } 
         }); 
        } 
       } 

       @Override 
       public void failure(TwitterException exception) { 
        // Upon error, show a toast message indicating that authorization request failed. 
        Toast.makeText(getApplicationContext(), exception.getMessage(), Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 

     @Override 
     public void failure(TwitterException exception) { 
      // Upon error, show a toast message indicating that authorization request failed. 
      Toast.makeText(getApplicationContext(), exception.getMessage(), Toast.LENGTH_SHORT).show(); 
     } 
    }); 


} 
関連する問題