0

Ich arbeite an Proof-of-Concept-Android-App mit Graph API. Ich versuche, ein Video von meiner Facebook App auf das Album hochzuladen.Fehler beim Hochladen von Video über die Graph-API auf Android

Ich benutze diesen Teil des Codes, dies zu tun:

String dataName = new File(getRealPathFromURI(this,data.getData())).getName(); 
      Toast.makeText(this,dataName,Toast.LENGTH_LONG).show(); 
      params.putString("filename", new File(getRealPathFromURI(this,data.getData())).getName()); 
      params.putByteArray("source",k); 
      /* make the API call */ 
      new GraphRequest(
        AccessToken.getCurrentAccessToken(), 
        "/"+sProfile.getId()+"/videos", 
        params, 
        HttpMethod.POST, 
        new GraphRequest.Callback() { 
         public void onCompleted(GraphResponse response) { 
          TextView textView = (TextView) findViewById(R.id.textView2); 
           textView.setText(response.toString()+" "+k.length); 
          Log.v("Response:",response.toString()); 
         } 
        } 
      ).executeAsync(); 

Obwohl, das ist Android entspricht suggested method von Facebook und dass ich versuche, .mp4 Datei zu arbeiten, bekomme ich diesen Fehler.

{Response: responseCode: 400, graphObject: null, error: {HttpStatus: 400,errorCode: 352, errorType: OAuthException, errorMessage: Sorry, the video file you selected is in a format that we don't support.}} 

Es scheint mir, es ist ein Fehler in GraphRequest.java in Android Facebook SDK ist, die Dateinamen von Video verursacht hochgeladen werden nur „Quelle“ werden auf.

Hier auf der Leitung 2166 und 2167 in GraphRequest.java sehen wir:

public void writeBytes(String key, byte[] bytes) throws IOException { 
     writeContentDisposition(key, key, "content/unknown"); 

und Argumente von writeContentDisposition in der gleichen Datei auf den Leitungen 2245 bis 2248:

public void writeContentDisposition(
      String name, 
      String filename, 
      String contentType 
    ) 

Was sollte in Bei params.putByteArray("source",k); Dateiname auf "source" setzen, ohne Dateierweiterung für Facebook.

Das Hinzufügen von params.putString("filename", <FILENAME>); funktioniert einfach nicht, da der Dateiname, der source falsch zugewiesen wurde, nicht geändert wird.

In Graph API 2.5 video reference wir folgendes lesen:

Wenn einschließlich eines Quellparameter, Sie einen Dateinamen mit der richtigen Erweiterung enthalten sollte, die die Art von Datei-Container anzeigt.

Lustig genug, in 2.6 video reference gibt es nichts dergleichen geschrieben dort.

Meine Fragen sind:

  1. Gibt es wirklich einen Fehler in GraphRequest.java? Oder ist 2.6 Video Referenz richtig, und der Dateiname ist nicht mehr wichtig?
  2. Wenn es ein Fehler ist, wie kann ich die Klasse zu ändern, wenn ich die API über build.gradle Abhängigkeiten verwendet werden?
  3. Wenn kein Fehler ist, was falsch ist über meinen Upload-Skript, und wie kann ich verhindern, dass Facebook von mir Antwortformat Fehler geben?

.

Antwort

0

So scheint es, gibt es wirklich einen Fehler in Facebook Android SDK.

Als Abhilfe kann, habe ich Android Asynchronous Http Client, mit dem ich folgenden Methode erstellt:

void uploadVideo(String name, InputStream is, String fileName){ 
    AsyncHttpClient client = new AsyncHttpClient(); 
    RequestParams rp = new RequestParams(); 
    rp.put("access_token",AccessToken.getCurrentAccessToken().getToken()); 
    rp.put("name",name); 
    rp.put("source",is,fileName); 
    client.post(this, "https://graph-video.facebook.com/me/videos", rp, new AsyncHttpResponseHandler() { 
     @Override 
     public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 
      //something... 
     } 

     @Override 
     public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { 
      //something... 
     } 
    }); 
} 

Und alles funktioniert wie vorgesehen.