2010-12-11 6 views
0

Ich verwende Google Data API, um Picasa mit Android zu verbinden. Zum Abrufen der Bilder und der Metadaten funktioniert es großartig, aber ich bekomme eine IllegalArgumentException beim Parsen der Antwort eines PATCH (relativ zum Original). Der Header ist "text/html", obwohl die Ausgabe der parseAsString-Methode eine perfekte XML-Zeichenfolge liefert. Ist das ein Fehler oder muss ich meinen eigenen Parser für "text/html" erstellen?Aktualisieren von Metadaten in Picasa mit Google Data API für Java

Ich hätte auch nichts dagegen, mit der PUT-Methode zu aktualisieren, hat jemand ein gutes Beispiel, wie man das mit Java macht?

hier die Ausnahme:

Uncaught handler: thread main exiting due to uncaught exception 
java.lang.IllegalArgumentException: No parser defined for Content-Type: text/html; charset=UTF-8 
at com.google.api.client.http.HttpResponse.parseAs(HttpResponse.java:277) 
at com.unimelb.pt3.external.google.api.Entry.executePatchRelativeToOriginal(Entry.java:95) 
at com.unimelb.pt3.external.google.api.PhotoEntry.executePatchRelativeToOriginal(PhotoEntry.java:67) 
at com.unimelb.pt3.Picasa.updatePicture(Picasa.java:135) 
at com.unimelb.pt3.Tools.updatePictureOnPicasa(Tools.java:209) 
at com.unimelb.pt3.ui.WaterfallView.onDraw(WaterfallView.java:145) 
at android.view.View.draw(View.java:6535) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
at android.view.View.draw(View.java:6538) 
at android.widget.FrameLayout.draw(FrameLayout.java:352) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
at android.view.View.draw(View.java:6538) 
at android.widget.FrameLayout.draw(FrameLayout.java:352) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1830) 
at android.view.ViewRoot.draw(ViewRoot.java:1349) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:1114) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1633) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4363) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
at dalvik.system.NativeStart.main(Native Method) 

Hier ist der Code im Entry:

Entry executePatchRelativeToOriginal(HttpTransport transport, Entry original) 
    throws IOException { 
     HttpRequest request = transport.buildPatchRequest(); 
     request.setUrl(getEditLink()); 
     request.headers.ifMatch = etag; 
     AtomPatchRelativeToOriginalContent content = 
      new AtomPatchRelativeToOriginalContent(); 
     content.namespaceDictionary = Util.NAMESPACE_DICTIONARY; 
     content.originalEntry = original; 
     content.patchedEntry = this; 
     request.content = content; 
     Log.i(Prototype.TAG, request.url.toString()); 
     HttpResponse response = request.execute(); 
     // Log.i(Prototype.TAG, response.parseAsString()); 
     return response.parseAs(getClass()); 
} 

Hier der entsprechende Code aus der Hauptaktivität:

public void updatePicture(String url, String description, String[] tags) throws IOException { 
    PhotoEntry photo = photos.get(url); 
    PhotoEntry patched = photo.clone(); 
    patched.summary = description; 
    String keywords = ""; 
    for(int i=0; i<tags.length; i++) { 
     keywords += tags[i] + ((i==tags.length-1) ? "" : ", "); 
    } 
    patched.mediaGroup.keywords = keywords; 
    photo = patched.executePatchRelativeToOriginal(transport, photo); 
} 

private HttpTransport setUpTransport() { 
    HttpTransport transport = GoogleTransport.create(); 
    GoogleHeaders headers = (GoogleHeaders) transport.defaultHeaders; 
    headers.setApplicationName("google-picasaatomsample-1.0"); 
    headers.gdataVersion = "2"; 
    AtomParser parser = new AtomParser(); 
    parser.namespaceDictionary = Util.NAMESPACE_DICTIONARY; 
    transport.addParser(parser); 
    return transport; 
} 

EDIT: Ich habe die Methode setUpTransport t hinzugefügt er folgende Zeilen:

XmlHttpParser p2 = new XmlHttpParser(); 
    p2.contentType = "text/html"; 
    p2.namespaceDictionary = Util.NAMESPACE_DICTIONARY; 
    transport.addParser(p2); 

die auf eine andere Illegal mit diesem Protokoll führt:

Uncaught handler: thread main exiting due to uncaught exception 
java.lang.IllegalArgumentException: expected start of XML element, but got something else (event type 4) 
    at com.google.api.client.xml.Xml.parseElementInternal(Xml.java:180) 
    at com.google.api.client.xml.Xml.parseElement(Xml.java:152) 
    at com.google.api.client.xml.XmlHttpParser.parse(XmlHttpParser.java:73) 
    at com.google.api.client.http.HttpResponse.parseAs(HttpResponse.java:280) 
    at com.unimelb.pt3.external.google.api.Entry.executePatchRelativeToOriginal(Entry.java:95) 
    at com.unimelb.pt3.external.google.api.PhotoEntry.executePatchRelativeToOriginal(PhotoEntry.java:67) 
    at com.unimelb.pt3.Picasa.updatePicture(Picasa.java:130) 
    at com.unimelb.pt3.Tools.updatePictureOnPicasa(Tools.java:209) 
    at com.unimelb.pt3.ui.WaterfallView.onDraw(WaterfallView.java:145) 
    at android.view.View.draw(View.java:6535) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:158) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
    at android.view.View.draw(View.java:6538) 
    at android.widget.FrameLayout.draw(FrameLayout.java:352) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
    at android.view.View.draw(View.java:6538) 
    at android.widget.FrameLayout.draw(FrameLayout.java:352) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1830) 
    at android.view.ViewRoot.draw(ViewRoot.java:1349) 
    at android.view.ViewRoot.performTraversals(ViewRoot.java:1114) 
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1633) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4363) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

Wird dieser Fehler von Google-API entfernt oder bleibt er bestehen? Ich stehe vor dem gleichen Problem. –

Antwort

1

Versuchen XmlHttpParser mit und setzen Sie den content type auf "text/html".

Übrigens sollte die Picasa Data API als Reaktion auf einen PATCH den Inhaltstyp "application/xml", nicht "text/html" zurückgeben. Das ist möglicherweise ein Fehler.

EDIT: Ich habe nicht selbst untersucht, aber ich vermute, dass IllegalArgumentException ist, weil der Text/HTML-Inhalt nicht wohlgeformten XML-Inhalt ist. Wir haben keinen HTML-Parser. Ich frage mich jedoch, warum Sie das Gefühl haben, dass Sie die HTML-Antwort parsen müssen, da parseAsString Ihnen das gibt, was Sie brauchen. Übrigens, die Picasa-Daten-API sollte keine HTML-Antwort zurückgeben, also ist das wahrscheinlich ein Fehler an ihrem Ende (nicht, dass Sie irgendetwas anderes tun können als einen Fehlerbericht zu erstellen).

Haftungsausschluss: Ich bin ein Besitzer des Projekts google-api-java-client.

+0

Ich habe in setUpTransport() die folgende Zeile hinzugefügt: – Daniel

+0

Ich denke, es ist besser, es am Ende der Frage zu setzen ^^ – Daniel

+0

Bitte zeigen Sie, wie response.parseAsString() und request.url.toString() aussehen. Das könnten nützliche Hinweise sein. –