2016-04-17 13 views
0

Ich versuche, ein Bild mit ihrer API auf Twitter hochzuladen, aber es schlägt immer fehl, die Datei nicht finden zu können, obwohl sie definitiv da ist, seit ich sie benutze den gleichen Pfad, um es gut in andere Netzwerke zu laden, und es wird korrekt in meiner Vorschau angezeigt.Fehler beim Hochladen eines Bildes nach Twitter mit Hilfe der API

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) 

Einige googeln zeigte dieser Fehler in einer älteren Version des Twitter-SDK für Android gemeint war festgelegt worden, und die Menschen haben bestätigt, es war, aber das war vor einer Weile und ich die neueste Version verwenden 1.13.0.

Der Code Ich verwende diese zu laden ist wie folgt:

//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(); 
    } 
}); 

Weiß jemand, was hier passiert und wie ich in der Lage diese Arbeit zu bekommen?

+0

Diese sehen sehr kompliziert, einfach eine Datei hochladen. Ich bin nicht sicher, dass dies eine externe Bibliothek (TwitterApiClient) verwendet, aber wenn nicht, müssen Sie sicherstellen, dass Sie weniger als 5 MB pro Chunk hochladen. Außerdem müssen Sie eine MultiPart-Abfrage verwenden, die INIT, APPEND (mit Binärcode) und END aufruft. – Linvi

+0

Wenn es möglich ist, C# zu verwenden, würde ich die Bibliothek, die ich geschrieben habe ([Twetinvi] (https://github.com/linvi/tweetinvi)) empfehlen, um ein Bild so einfach wie möglich zu veröffentlichen: 'var media = Upload.UploadImage (Datei.ReadAllBytes ("Pfad")); ' – Linvi

Antwort

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


}