2010-12-11 30 views
0

J'utilise Google Data API pour connecter Picasa à Android. Pour récupérer les images et les métadonnées, cela fonctionne très bien, mais je reçois une exception IllegalArgumentException lors de l'analyse de la réponse d'un PATCH (par rapport à l'original). L'en-tête est "text/html" bien que la sortie de la méthode parseAsString délivre une chaîne xml parfaite. Est-ce un bug ou ai-je besoin de créer mon propre Parser pour "text/html"?Mise à jour des métadonnées sur Picasa à l'aide de l'API Google Data pour Java

Je ne voudrais pas non plus mettre à jour avec la méthode PUT, est-ce que quelqu'un a un bon exemple comment faire avec Java?

Voici l'exception:

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) 

Voici le code dans l'entrée:

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

Voici le code correspondant de l'activité principale:

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: J'ai ajouté à la méthode setUpTransport t il suit:

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

Cela conduit à un autre IllegalArgumentException avec ce journal:

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

Ce bogue est-il supprimé de google-api ou persiste-t-il? Je suis confronté au même problème. –

Répondre

1

Essayez d'utiliser XmlHttpParser et définir ses content type à "text/html". À propos, en réponse à un PATCH, Picasa Data API devrait renvoyer le type de contenu "application/xml", pas "text/html". Donc, c'est peut-être un bug.

EDIT: Je n'ai pas étudié cela moi-même, mais je suppose que cette exception IllegalArgumentException est due au fait que le contenu text/html n'est pas un contenu XML bien formé. Nous n'avons pas réellement d'analyseur HTML. Je me demande cependant pourquoi vous pensez que vous devez analyser la réponse HTML, étant donné que parseAsString vous donne ce dont vous avez besoin. D'ailleurs, Picasa Data API ne devrait pas renvoyer une réponse HTML, donc c'est probablement un bug de leur côté (pas qu'il y ait quelque chose que vous pouvez faire d'autre que de faire un rapport de bogue). Je suis le propriétaire du projet google-api-java-client.

+0

J'ai ajouté dans setUpTransport() la ligne suivante: – Daniel

+0

Je suppose que c'est mieux de le mettre en bas de la question ^^ – Daniel

+0

S'il vous plaît montrer à quoi ressemble response.parseAsString() et request.url.toString(). Cela pourrait être des indices utiles. –