5

さて、私は Android 用の Tumblr クライアントを作成しています。OAuth を約 1 週間動作させようとして失敗しました。その様子は次のとおりです。

ユーザーがアプリを起動します。メイン アクティビティの 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()
    };
}

最後にアプリケーションのメイン画面に戻り、最初の API 呼び出しを試みて、ユーザーのダッシュボードで最新の 10 件の投稿を取得します。

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":[]}

それで、どこで間違ったのですか?ありがとう

4

2 に答える 2

2

Appache HttpCommons GET/POST/PUT で道標ライブラリを正常に使用しました。

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

次に、onNewIntent(Intent)以前に起動した から OAuth コールバックを受信するために使用しましたActivity

AppConfig.javaコード スニペット:

/** 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コード スニペット:

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を使用しています

于 2011-10-27T17:50:05.237 に答える
1

現在、Tumblr は をサポートしていないため、パラメーターを追加するにMultipartEntityは を使用する必要があります。NameValuePairs

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

于 2012-10-01T03:36:42.043 に答える