2012-06-13 2 views
0

[решаемым, но я открыт для новых предложений ...]Twitter API возвращает недопустимый обратный вызов - не может разрешить

Я интеграция Twitter в мой Android приложения с помощью twitter4j.

Когда я пытаюсь разрешить с Twitter, я звоню следующую конечную точку с моим OAuth маркер:

https://api.twitter.com/oauth/authenticate?oauth_token=MY_VALID_TOKEN

который должен перенаправить меня:

MY-CALLBACK:///?oauth_token=***&oauth_verifier=***

, но вместо этого он перенаправляет меня на:

https://api.twitter.comMY-CALLBACK///?oauth_token=***&oauth_verifier=***

, который, очевидно, не является допустимым URL.
(Кроме того, : отсутствует - он должен быть MY-CALLBACK:///...)

Пожалуйста, обратите внимание, я использую WebView для моих звонков


Я мог бы манипулировать эту строку, чтобы все работало, но там должно быть лучший способ ...



Я передаю мой обратный вызов URL в

getOAuthRequestToken("MY-CALLBACK:///");

и уже установили пристальный фильтр для моей деятельности с

<data android:scheme="x-oauthflow-twitter" />

Кроме того, активность имеет android:launchMode="singleInstance"



Что я делаю неправильно?


[править: Более подробно]

mTwitter = new TwitterFactory().getInstance(); 
mTwitter.setOAuthConsumer(Constants.TWITTER_CONSUMER_KEY, Constants.TWITTER_CONSUMER_SECRET); 

twitterWebView = new WebView(ActivityTwitterAuthorize.this); 

twitterWebView.setWebViewClient(new WebViewClient() { 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (url.startsWith(Constants.TWITTER_CALLBACK_URL)) { 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setData(Uri.parse(url)); 
      startActivity(intent); 

     // HACKY PART! 
     // I added the following code to force it to work, but this is a dirty hack... 
     // String TWITTER_CALLBACK_INVALID_PREFIX = "https://api.twitter.comx-oauthflow-twitter///"; 
     // TWITTER_CALLBACK_URL = "MY-CALLBACK:///"; 
     // BEGIN 
     } else if (url.startsWith(TWITTER_CALLBACK_INVALID_PREFIX)) { 
      url = url.substring(TWITTER_CALLBACK_INVALID_PREFIX.length()); 
      url = Constants.TWITTER_CALLBACK_URL + url; 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setData(Uri.parse(url)); 
      startActivity(intent); 
     // END 

     } else { 
      view.loadUrl(url); 
     } 
     return true; 
    } 

}); 

mTwitterReqToken = mTwitter.getOAuthRequestToken(Constants.TWITTER_CALLBACK_URL); 

twitterWebView.loadUrl(mTwitterReqToken.getAuthenticationURL()); 

БЕЗ Hacky части, этот код приводит к "Веб-страница не доступна" ошибка, потому что URL-адрес является недействительным:

https://api.twitter.comMY-CALLBACK///?oauth_token=***&oauth_verifier=***

Если бы URL-адрес был MY-CALLBACK:///?oauth_token=***&oauth_verifier=***, тогда моя деятельность получила бы намерение, и все было бы нормально ...

С «хакерской частью» мой код работает, но я бы хотел избежать этого фрагмента кода.

+0

Просьба указать более подробную информацию, я не понимаю вашу проблему. –

+0

вам нужно закрыть диалог webView после получения if (url.startsWith (Constants.TWITTER_CALLBACK_URL)). –

+0

Я тоже это пробовал, но даже когда я набираю 'https: //api.twitter.com/oauth/authenticate? Oauth_token = MY_VALID_TOKEN' в моем браузере, авита Twitter возвращает неверный url ... –

ответ

3

Я нашел, что я просто не мог заставить его работать так, следуя инструкциям, которые я видел в Интернете.

Я закончил с использованием свой собственный пользовательский WebViewClient с кодом:

if (url.contains("MY-CALLBACK:///")) 
{ 
    final int start = url.indexOf('?') + 1; 
    final String params = url.substring(start); 
    final String verifierToken = "oauth_verifier="; 
    if (params.contains(verifierToken)) 
    { 
     final int value = params.indexOf(verifierToken) + verifierToken.length(); 
     final String token = params.substring(value); 
     view.stopLoading();     
     authoriseNewUser(token); 
    } 
    else if (params.contains("denied")) 
    { 
     view.stopLoading(); 
     finish(); 
    } 
} 
else 
{ 
    view.loadUrl(url); 
} 
return true; 
+0

Это в основном то, что я сделал , также (проверьте наличие моего обратного URL-адреса в возвращаемом URL-адресе и измените его в соответствии с моим ожидаемым форматом), но есть ли лучший способ? –

+0

На самом деле, я думаю, что я переработаю свой код, чтобы использовать что-то вроде этого вместо трансляции намерений ... Это намного эффективнее! Если никто не предложит лучшее решение, я приму этот ответ. –

+1

Это, безусловно, лучшее решение, я полностью удалил фильтр намерений! Просто для вас, для извлечения параметров запроса из вашей строки, вы можете использовать 'Uri uri = Uri.parse (url); Строка oAuthVerifier = uri.getQueryParameter ("oauth_verifier"); if (oAuthVerifier! = null) {...} 'Он выглядит лучше, чем объект url.substring() ... Спасибо! –

0

Использование Ниже CallBack_URI для того, оно может помочь вам.

public static final String OAUTH_CALLBACK_SCHEME = "x-oauthflow-twitter"; 
public static final String OAUTH_CALLBACK_HOST = "callback"; 
public static final String CALLBACK_URL = OAUTH_CALLBACK_SCHEME + "://" + OAUTH_CALLBACK_HOST; 
+0

Нет, это не главное. Вполне нормально использовать только OAUTH_CALLBACK_SCHEME + ": ///" –

0
public static final String OAUTH_CALLBACK_SCHEME = "x-oauthflow-twitter"; 
public static final String OAUTH_CALLBACK_HOST = "litestcalback"; 
public static final String OAUTH_CALLBACK_URL = OAUTH_CALLBACK_SCHEME+ "://" +OAUTH_CALLBACK_HOST; 

использовать этот тип callback_url в коде и файле манифеста ...

+0

Это третий ответ, который говорит, что мой URL-адрес обратного вызова неверен. Нет, мой URL-адрес обратного вызова не ошибается. Я уже пробовал это, и это то же самое, независимо от того, использую ли я SCHEME: // HOST или просто SCHEME: /// –

+0

дорогой u использую SCHEME: // HOST .... и попробуйте для этого .... –

+0

Я пробовал 'public static final String TWITTER_CALLBACK_URL = "x-oauthflow-twitter: ///"; 'и я также попробовал' public static final String TWITTER_CALLBACK_URL = "x-oauthflow-twitter: // callback"; '. Не имеет значения, это все равно не работает ... –

0

Я предполагаю, что нет ничего плохого в вашем коде. Вчера я получал тот же результат, но сегодня он работает как шарм. Вероятно, это проблема на стороне сервера. Не могли бы вы снова попробовать свое оригинальное решение (без хакерской части), PLS?

+0

Я догадался, что это была проблема на стороне сервера. Я включил код для работы с обоими случаями, просто чтобы быть в безопасности. Я пишу для записи, когда выполняется «хакерская» часть, поэтому я проверю это. Я дам вам знать в эти дни ... –