Okej, więc robię klienta Tumblr dla Androida, próbowałem i nie udało mi się uruchomić OAuth przez około tydzień. Oto, jak to działa:Android Tumblr Oauth-drogowskaz 401
Użytkownik uruchamia aplikację. Aktywność w głównym działaniu 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);
}
uruchamia to działanie uwierzytelniające, które zawiera WebView. Ta aktywność pomyślnie pobiera token żądania i wysyła go do ekranu logowania Tumblr. Użytkownik jest proszony, aby umożliwić dostęp do swoich danych przez aplikację, to naciśnij Zezwalaj, a mój WebViewClient łapie Callback URL, a czyni to z niego:
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 klasy pomocnika i getVerifier wyglądać następująco:
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()
};
}
Wtedy w końcu wrócić do głównego ekranu aplikacji i starają się uczynić moje pierwsze wywołanie API, aby uzyskać najnowsze dziesięć posty na desce rozdzielczej użytkownika:
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);
}
Jednak zamiast się piękny odpowiedź JSON, jak powinienem być, ja dostaję to:
10-20 16:36:18.110: D/Result(22817): {"meta":{"status":401,"msg":"Not Authorized"},"response":[]}
Więc gdzie ja się nie udać? Dzięki
Dostaję dokładnie ten sam problem, próbuję użyć metod API, które wymagają żądań POST, jednak żądania GET wydają się działać dobrze. Zaczynam się zastanawiać, czy ich API jest trochę niestabilne. –
Na jakiej wersji Androida się rozwijasz? – NotACleverMan
Tylko o strukturze plastra miodu. – Nick