2013-06-02 21 views
5

Non sembra esserci un chiaro riferimento a questo. Sto creando un'app Android che l'utente può accedere a FB.Android Facebook SDK 3.0 carica immagine locale

Ho seguito this tutorial on FB site, che fornisce un esempio di pubblicazione di un'immagine da un URL Web: postParams.putString ("immagine", "https: // URL immagine");

Tuttavia, voglio caricare nella timeline dell'utente connesso un'immagine locale PNG del mio progetto, che si trova su tutte le cartelle res-drawable.

Ecco il mio codice:

void publishStory() 
{ 
     Session session = Session.getActiveSession(); 

     if (session != null) 
     {  
      Bundle postParams = new Bundle(); 

      postParams.putString("name", "Name here."); 
      postParams.putString("caption", "Caption here."); 
      postParams.putString("description", "Description here."); 
      postParams.putString("link", "https://developers.facebook.com/android"); 

      byte[] data = null; 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      Bitmap bi = BitmapFactory.decodeResource(getResources(),R.drawable.logonew); 
      bi.compress(Bitmap.CompressFormat.PNG, 100, baos); 
      data = baos.toByteArray(); 

      postParams.putString("method", "photos.upload"); 
      postParams.putByteArray("picture", data); 

      Request.Callback callback = new Request.Callback() 
      { 
       public void onCompleted(Response response) 
       { 
        FacebookRequestError error = response.getError(); 

        if (error != null) 
         Toast.makeText(_context , error.getErrorMessage(), Toast.LENGTH_SHORT).show(); 

        else 
         Toast.makeText(_context, "Posted successful on your wall", Toast.LENGTH_SHORT).show(); 
       } 
      }; 

      Request request = new Request(session, "me/feed", postParams, HttpMethod.POST, callback); 
      RequestAsyncTask task = new RequestAsyncTask(request); 
      task.execute(); 
     } 
    } 

Tutti gli esempi che ho trovato a che fare con le istanze di classe di Facebook e AsyncFacebookRunner che sono depressi.

Inoltre, la risposta di errore che ottengo dalla richiesta è: httpStatus 400, errorCode: 100, ERRORE.TIPO: GraphMethodException, errorMessage: il metodo non supportato, photos.upload

Allora, qual è il photos.upload sostituzione? Si prega di avvisare, un esempio di codice sarà fantastico, tnx.

+0

Hai visto la risposta che ho fornito? Se funzionasse per te sarebbe bello se lo accettassi. – PeteH

risposta

7

Se si desidera caricare una foto, perché non utilizzare la nuova UploadPhotoRequest nella classe Reqeust? https://developers.facebook.com/docs/reference/android/3.0/Request#newUploadPhotoRequest%28Session,%20Bitmap,%20Callback%29

Bitmap image = ... // get your bitmap somehow 
Request.Callback callback = ... // create your callback 
Request request = Request.newUploadPhotoRequest(session, image, callback); 
request.executeAsync(); 
+1

Questo è un buon inizio. Ma come si ottiene l'URL dell'immagine caricata dalla richiamata? La documentazione di Facebook non ha alcuna spiegazione su come farlo. – PeteH

+0

Il callback fornisce un oggetto Response e dall'oggetto Response è possibile ottenere un oggetto GraphObject, che in realtà è solo un proxy su una risposta JSON. Non si ottiene un url nella risposta, si ottiene l'id dell'immagine che è stata creata. –

+1

grazie a @MingLi Li –

4

Ming Li mi ha fatto sulla strada giusta, ma qui è una soluzione più completa. Questo è testato e funzionante. Ci sono due elementi: (1) creare il callback per ottenere l'URL della foto caricata; (2) codice per caricare la foto. Ecco il codice completo con entrambe le parti. L'URL della foto verrà caricato nella variabile stringa fbPhotoAddress.

String fbPhotoAddress = null; 

// Part 1: create callback to get URL of uploaded photo 
    Request.Callback uploadPhotoRequestCallback = new Request.Callback() { 
    @Override 
     public void onCompleted(Response response) { 
    // safety check 
      if (isFinishing()) { 
      return; 
     } 
     if (response.getError() != null) { // [IF Failed Posting] 
      Log.d(logtag, "photo upload problem. Error="+response.getError()); 
     } // [ENDIF Failed Posting] 

     Object graphResponse = response.getGraphObject().getProperty("id"); 
     if (graphResponse == null || !(graphResponse instanceof String) || 
      TextUtils.isEmpty((String) graphResponse)) { // [IF Failed upload/no results] 
       Log.d(logtag, "failed photo upload/no response"); 
     } else { // [ELSEIF successful upload] 
      fbPhotoAddress = "https://www.facebook.com/photo.php?fbid=" +graphResponse;        
     } // [ENDIF successful posting or not] 
    } // [END onCompleted] 
    }; 

//Part 2: upload the photo 
    Request request = Request.newUploadPhotoRequest(session, imageSelected, uploadPhotoRequestCallback); 
    request.executeAsync(); 
+0

La risposta di PeteH dovrebbe essere contrassegnata come risposta !! passare fbPhotoAddress in postParams.putString ("picture", fbPhotoAddress); Questo farà la magia. – playmaker420

Problemi correlati