2010-09-15 20 views
1

Tout le monde peut aider s'il vous plaît dans Android + Twitter Intégration en utilisant OAuth.Twitter + OAuth Integration

je l'ai déjà travaillé sur http://github.com/brione/Brion-Learns-OAuth et obtenir l'erreur énumérés ci-dessous, quand je suis annonce mise à jour de l'état ...

WARN/System.err(190): org.apache.http.client.HttpResponseException: Unauthorized 
WARN/System.err(190):  at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:71) 
WARN/System.err(190):  at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:59) 
WARN/System.err(190):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:657) 
WARN/System.err(190):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:627) 
WARN/System.err(190):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:616) 
WARN/System.err(190):  at com.test.twitter.BLOA$PostTask.doInBackground(BLOA.java:343) 
WARN/System.err(190):  at com.test.twitter.BLOA$PostTask.doInBackground(BLOA.java:1) 
WARN/System.err(190):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
WARN/System.err(190):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256) 
WARN/System.err(190):  at java.util.concurrent.FutureTask.run(FutureTask.java:122) 
WARN/System.err(190):  at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648) 
WARN/System.err(190):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673) 
WARN/System.err(190):  at java.lang.Thread.run(Thread.java:1060) 

je réussis avec authentification OAuth et obtenir user_secret et user_token et stockés dans les préférences ...

la question est donc avec affichage HTTP à l'aide en-tête OAuth ...

et ma Http méthode post est que:

private class PostTask extends AsyncTask<String, Void, JSONObject> { 

    ProgressDialog postDialog; 

    @Override 
    protected void onPreExecute() { 
    postDialog = ProgressDialog.show(BLOA.this, 
    getText(R.string.tweet_progress_title), 
    getText(R.string.tweet_progress_text), true, // indeterminate 
       // duration 
    false); // not cancel-able 
    } 

    @Override 
    protected JSONObject doInBackground(String... params) { 

    JSONObject jso = null; 
    try { 
    HttpPost post = new HttpPost(
     "http://twitter.com/statuses/update.json"); 
    LinkedList<BasicNameValuePair> out = new LinkedList<BasicNameValuePair>(); 
    out.add(new BasicNameValuePair("status", params[0])); 
    post.setEntity(new UrlEncodedFormEntity(out, HTTP.UTF_8)); 
    post.setParams(getParams()); 
    // sign the request to authenticate 
    mConsumer.sign(post); 
    String response = mClient.execute(post, 
     new BasicResponseHandler()); 
    jso = new JSONObject(response); 
    } catch (UnsupportedEncodingException e) { 
    e.printStackTrace(); 
    } catch (OAuthMessageSignerException e) { 
    e.printStackTrace(); 
    } catch (OAuthExpectationFailedException e) { 
    e.printStackTrace(); 
    } catch (OAuthCommunicationException e) { 
    e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
    e.printStackTrace(); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } catch (JSONException e) { 
    e.printStackTrace(); 
    } finally { 

    } 
    return jso; 
    } 

    // This is in the UI thread, so we can mess with the UI 
    protected void onPostExecute(JSONObject jso) { 
    postDialog.dismiss(); 
    if (jso != null) { // authorization succeeded, the json object 
    // contains the user information 
    mEditor.setText(""); 
    mLast.setText(getCurrentTweet(jso)); 
    } else { 
    mLast.setText(getText(R.string.tweet_error)); 
    } 
    } 
} 
+0

Nouveau OAuth Tutoriel: http://goo.gl/99vpL – Blundell

Répondre

1

S'il vous plaît décrire ce client/consommateur/fournisseur que vous utilisez, ils doivent être DefaultHttpClient/CommonsHttpOAuthConsumer/CommonsHttpOAuthProvider pour fonctionner correctement à coup sûr.

Assurez-vous d'appeler consumer.setTokenWithSecret(oToken, oTokenSecret); avant d'appeler ce code.

De même, existe-t-il post.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false); dans vos paramètres de poste?

Quelle est la raison pour l'utilisation vide BasicResponseHandler, il ne gère rien et il peut être omis dans execute appel, je suppose.

Et, peut-être une question stupide, peut-être vous écrasez params lorsque vous appelez setParams(...) après setEntity(...)

2

Bien que le message user_secret et user_token aient bien été reçus dans onResume(), êtes-vous sûr que vos objets d'origine sont toujours les mêmes? J'ai eu ce problème dans mon application Android. Je créerais les objets, mais lorsque onResume() a été appelé, il s'agissait d'une instance totalement nouvelle de l'activité car elle était libérée de la mémoire lors du lancement du navigateur. Donc, lorsque j'ai essayé de définir la paire secrète/jeton retournée, cela ne fonctionnerait pas. Cela est plus susceptible de se produire sur un périphérique avec une mémoire limitée. Certaines personnes choisissent de conserver les informations nécessaires entre les appels et d'autres décident de ne pas lancer l'intention du navigateur par défaut, mais préfèrent héberger une vue Web intégrée afin que leurs objets signpost-oauth d'origine ne soient pas hors de portée.

OAuth instance state in Android

Je ne sais pas si cela est le problème, mais peut-être vaut le détour.

1

J'ai 2 tutoriels pour 2 bibliothèques Java différentes. First one (daté) est ici, et 2nd one here avec Scribe. C'est pour LinkedIn mais il serait très facile de passer à Twitter. Je voudrais aller aveC# 2

2

Vous devez ajouter les informations oauth aux en-têtes de la requête http en utilisant post.addHeader(). Pour savoir quelles choses à ajouter aux en-têtes, jetez un oeil ici: http://dev.twitter.com/pages/auth

+0

Mon code est comme écrit ci-dessus .. pouvez-vous veuillez expliquer en détail? ou donnez-moi un exemple? –

+0

Vous utilisez une bibliothèque de signpost qui simplifie l'interaction en utilisant le protocole OAuth, donc aucun réglage manuel des en-têtes n'est requis. S'il vous plaît répondez à mes questions ci-dessous et je vais essayer de vous aider, j'utilise aussi la bibliothèque Signpost dans mon projet. –