CallBack после аутентификации в Twitter - PullRequest
2 голосов
/ 08 декабря 2010

Я пытаюсь интегрировать твиттер в свое приложение, но не могу заставить его работать.

Это мой код:

public class OAuthForTwitter extends Activity {

    private CommonsHttpOAuthConsumer httpOauthConsumer;
    private OAuthProvider httpOauthprovider;
    public final static String consumerKey = "{removed}";
    public final static String consumerSecret = "{removed}";
    private final String CALLBACKURL = "sosInternational:///HierBenIkNu";
    private Twitter twitter;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        doOAuth();
    }

    /**
     * Opens the browser using signpost jar with application specific
     * consumerkey and consumerSecret.
     */

    private void doOAuth() {
        try {
            httpOauthConsumer = new CommonsHttpOAuthConsumer(consumerKey, consumerSecret);
            httpOauthprovider = new DefaultOAuthProvider(
                    "http://twitter.com/oauth/request_token",
                    "http://twitter.com/oauth/access_token",
                    "http://twitter.com/oauth/authorize");
            String authUrl = httpOauthprovider.retrieveRequestToken(httpOauthConsumer, CALLBACKURL);
            this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));
        } catch (Exception e) {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }

    @Override
    protected void onNewIntent(Intent intent) {

        super.onNewIntent(intent);

        Uri uri = intent.getData();
        if (uri != null && uri.toString().startsWith(CALLBACKURL)) {

            String verifier = uri
                    .getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);

            try {
                // this will populate token and token_secret in consumer

                httpOauthprovider.retrieveAccessToken(httpOauthConsumer,
                        verifier);

                // TODO: you might want to store token and token_secret in you
                // app settings!!!!!!!!

                AccessToken a = new AccessToken(httpOauthConsumer.getToken(),
                        httpOauthConsumer.getTokenSecret());

                // initialize Twitter4J

                twitter = new TwitterFactory().getInstance();
                twitter.setOAuthConsumer(consumerKey, consumerSecret);
                twitter.setOAuthAccessToken(a);

                // create a tweet

                Date d = new Date(System.currentTimeMillis());
                String tweet = "#OAuth working! " + d.toLocaleString();

                // send the tweet

                twitter.updateStatus(tweet);

            } catch (Exception e) {

                Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
            }

        }
    }
}

Когда я закончу аутентификацию на сайте Twitter, он должен перенаправить меня обратно в приложение.

Но вместо этого я получаю эту страницу не найденной:

alt text

У меня есть это в моем AndroidManifest:

<intent-filter>  
        <action android:name="android.intent.action.VIEW"></action>  
        <category android:name="android.intent.category.DEFAULT"></category>  
        <category android:name="android.intent.category.BROWSABLE"></category>  
        <data android:scheme="sosInternational" android:host="HierBenIkNu"></data>  
    </intent-filter>  

Как я могу вернуться к своему приложению с ключами, которые я получил?

Ответы [ 3 ]

7 голосов
/ 08 декабря 2010

Хорошо, это была довольно глупая ошибка.

Мой <intent-filter> не был внутри приложения ..

Вот как сейчас:

<activity 
        android:name=".OAuthForTwitter"
        android:label="@string/app_name"
        android:configChanges="orientation|keyboardHidden"
        android:launchMode="singleInstance">
        <intent-filter>  
            <action android:name="android.intent.action.VIEW"></action>  
            <category android:name="android.intent.category.DEFAULT"></category>  
            <category android:name="android.intent.category.BROWSABLE"></category>  
            <data android:scheme="sosInternational" android:host="OAuthForTwitter"></data>  
        </intent-filter>
    </activity>

Этот вид выключен, он просто загружает все приложение с самого начала.

Нет ли способа просто «вернуться» к последнему действию, не перезапуская все приложение?

5 голосов
/ 10 декабря 2010

Я решил это.Не совсем так, как вы разработали, но немного по-другому.Вот шаги, описывающие то, что я сделал.

  1. Используйте веб-просмотр вместо того, чтобы открывать его в веб-браузере: Одним из ключевых преимуществ этого является то, что вы можете отслеживать перенаправления URL.

  2. вызов setWebViewClient метод вашего веб-просмотра и переопределение shouldOverrideUrlLoading метод вашего класса, я использовал внутренний класс.

  3. У вас будет параметр urlв вашем методе.Проверьте, начинается ли он с вашего собственного URL обратного вызова или нет (Примечание: этот URL содержит токен пользователя и секретный ключ пользователя, необходимый для авторизации).

  4. После завершения задания выможет скрыть действие или удалить веб-представление или любую другую вещь, которую вы хотите.

EDIT : этот способ oAuth обычно используется в веб-приложении, поэтому мы не делаемнужен способ xAuth.(Если другие участники сообщества не знают)

Надеюсь, это поможет вам.

0 голосов
/ 10 декабря 2010

Ваш URL обратного вызова должен быть "sosInternational: // HierBenIkNu" (вместо "sosInternational: /// HierBenIkNu") в коде Java.

private final String CALLBACKURL = "sosInternational://HierBenIkNu";
...