2011-10-20 10 views
5

Android用のTumblrクライアントを作っています。私は今、約1週間はOAuthを手に入れようとしています。ここにその方法があります:Android Tumblr Oauth-signpost 401

ユーザーがアプリを起動します。主なアクティビティのonCreateはこれを行います:

settings = getSharedPreferences(PREFS_NAME, 0); 
authToken=settings.getString("OauthToken", "none"); 
authTokenSecret=settings.getString("OauthSecret", "none"); 
if(authToken=="none" || authTokenSecret=="none"){ 
    Intent i = new Intent(getApplicationContext(),Authentication.class); 
    startActivity(i); 
} 

これは、WebViewを含む認証アクティビティを起動します。そのアクティビティは要求トークンを正常に取得し、WebViewをTumblrログイン画面に送信します。ユーザーは、彼らは、許可を押しアプリによるそれらのデータへのアクセスを許可するように頼まれて、私のWebViewClientは、コールバックURLをキャッチし、それでこれを行います。

String[] token = helper.getVerifier(url); 
      if (token != null) { 
       try { 
        String accessToken[] = helper.getAccessToken(token[1]); 
        editor.putString("OauthToken", accessToken[0]); 
        editor.putString("OauthSecret", accessToken[1]); 
        editor.commit(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      finish(); 

ヘルパークラスのgetAccessTokenとgetVerifier次のようになります。

public String[] getVerifier(String myUrl) { 
    // extract the token if it exists 
    Uri uri = Uri.parse(myUrl); 
    if (uri == null) { 
     return null; 
    } 

    String token = uri.getQueryParameter("oauth_token"); 
    String verifier = uri.getQueryParameter("oauth_verifier"); 
    return new String[] { token, verifier }; 
} 

public String[] getAccessToken(final String verifier) 
     throws OAuthMessageSignerException, OAuthNotAuthorizedException, 
     OAuthExpectationFailedException, OAuthCommunicationException { 
    new Thread(new Runnable() { 
     public void run() { 
       try { 
        mProvider.retrieveAccessToken(mConsumer, verifier); 
       } catch (OAuthMessageSignerException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (OAuthNotAuthorizedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (OAuthExpectationFailedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (OAuthCommunicationException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
     } 
    }).start(); 
    return new String[] { 
      mConsumer.getToken(), mConsumer.getTokenSecret() 
    }; 
} 

その後、私は最終的に戻って、メインアプリケーション画面に移動して、ユーザーのダッシュボード上の最新の10枚のポストを得るために、私の最初のAPIコールをしよう:

OAuthConsumer myConsumer = new CommonsHttpOAuthConsumer(MainView.authToken, MainView.authTokenSecret); 
      HttpGet request = new HttpGet("http://api.tumblr.com/v2/user/dashboard?limit=10"); 
      myConsumer.sign(request); 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpResponse response = httpClient.execute(request); 
      HttpEntity entity = response.getEntity(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent())); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       builder.append(line); 
      } 

しかし、代わりに私があるべきのような素敵なJSONレスポンスを取得し、私はこの取得しています:

10-20 16:36:18.110: D/Result(22817): {"meta":{"status":401,"msg":"Not Authorized"},"response":[]} 

をだからここで私が間違って行くのですか?ありがとう

+1

POSTリクエストを必要とするAPIメソッドを使用しようとするとまったく同じ問題が発生しますが、GETリクエストは正常に動作するようです。私は、彼らのAPIがちょっと薄れているのだろうかと思っています。 –

+0

あなたはどのAndroidのバージョンを開発していますか? – NotACleverMan

+0

ハニカムのみ。 – Nick

答えて

2

私はAppache HttpCommons GET/POST/PUTsで看板ライブラリをうまく使用しました。

まず、私は次のコード(ActivityLogin.java)を使用して、ログイン目的のためのWebViewを立ち上げました。そして、

private static CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(AppConfig.CONSUMER_KEY, AppConfig.CONSUMER_SECRET); 
private static OAuthProvider provider = new DefaultOAuthProvider (AppConfig.requestURL, AppConfig.accessURL, AppConfig.authURL); 

private void logMeIn() throws ...{ 
    String authUrl = provider.retrieveRequestToken(consumer,AppConfig.CALLBACK_URL); 
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl))); 
} 

を、私は以前に発売さActivityからのOAuthコールバックを受信するためonNewIntent(Intent)を使用しました:

AppConfig.javaコードsnipet:

/** OAuth Authorization URL */ 
public static final String authURL = mainOAuthUrl+"/authorize/?theme=android"; 

/** OAuth Request URL */ 
public static final String requestURL = mainOAuthUrl+"/request/token/"; 

/** OAuth Access URL  */ 
public static final String accessURL = mainOAuthUrl+"/access/token/"; 

/** OAuth CALLback URL*/ 
public static final String CALLBACK_URL = "yourapp://twitt"; 

ActivityLogin.javaコードsnipet:

protected void onNewIntent(Intent intent) { 
    Uri uri = intent.getData(); 
    if (uri != null && uri.toString().startsWith(AppConfig.CALLBACK_URL)) { 
     String verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER); 

     provider.retrieveAccessToken(consumer, verifier); 
     Data.OAuthAccessKey = consumer.getToken(); 
     Data.OAuthAccessSecret = consumer.getTokenSecret(); 
    } 

} 

そして、私の接続コードは以下のようになります。

public HttpResponse sampleOauthConnect(String url) throws ...{ 

    /** setup some connection params */ 
    HttpContext context = new BasicHttpContext(); 

    HttpRequestBase request = new HttpGet(url); 

    if (Data.OAuthConsumer == null) 
     Data.OAuthConsumer = new CommonsHttpOAuthConsumer(AppConfig.CONSUMER_KEY, AppConfig.CONSUMER_SECRET); 

    if (Data.OAuthAccessKey == null || Data.OAuthAccessSecret == null) 
     throw new LoginErrorException(LoginErrorException.NOT_LOGGED_IN); 

    Data.OAuthConsumer.setTokenWithSecret(Data.OAuthAccessKey, Data.OAuthAccessSecret); 

    try { 
     Data.OAuthConsumer.sign(request); 
    } catch (OAuthMessageSignerException e) { 
     throw new LoginErrorException(LoginErrorException.OAUTH_EXCEPTION, e); 
    } catch (OAuthExpectationFailedException e) { 
     throw new LoginErrorException(LoginErrorException.OAUTH_EXCEPTION, e); 
    } catch (OAuthCommunicationException e) { 
     throw new LoginErrorException(LoginErrorException.OAUTH_EXCEPTION, e); 
    } 

    HttpClient client = new DefaultHttpClient(); 

    /** finally execute this request */ 
    return client.execute(request, context); 
} 

私はこのソリューションはあなたのために動作するかどうかだけ教えて、コピー&ペースト中に何かを見逃している可能性があります。私はsingpostを使用しています。1.2.1.1

+0

あなたのコードを今すぐテストする時間がありません。しかし、奨励金は使い果たされていて、それは非常に有用な徹底的なポストのように見えます。ありがとうございます、実際に後で動作するかどうか調べてみましょう – Nick

+0

私は2組のキーサーバによって生成された 'Data.OAuthAccessKey、Data.OAuthAccessSecret'があります。 – Kocus

+0

は同じ応答が不正になっています: {" meta ":{ "status":401、 "msg": "Not Authorized"}、 "response":[]} – DcodeChef

1

現在、TumblrはMultipartEntityをサポートしていませんので、NameValuePairsを使用してparamsを追加する必要があります。

写真を投稿する場合は、その写真をARRAYに変換してURLエンコードする必要があります。

+0

写真の投稿に直面した問題。 「...その写真をARRAYに変換してURLエンコードする」とはどういう意味ですか?いくつかのコードスニペットを提供できますか? –

+0

タンブラー自身のライブラリ(Jumblr)はマルチパートフォームを使用しています:https://github.com/tumblr/jumblr/blob/master/src/main/java/com/tumblr/jumblr/request/MultipartConverter.java – Jabari