Android: войдите с помощью Twitter, используя Twitter4J - PullRequest
6 голосов
/ 29 ноября 2011

Что я пробовал:

Я уже зарегистрировал приложение в твиттере и получил Consumer Key и Secret. Даже я получил различные коды для входа в систему с помощью твиттера. Вот что я пробовал:

http://thetechnib.blogspot.com/2011/01/android-sign-in-with-twitter.html

[Эта ссылка не работает, вы можете просмотреть архив здесь ]
http://www.android10.org/index.php/articleslibraries/291-twitter-integration-in-your-android-application

У меня проблема:

До сих пор приведенный выше код переводит меня в твиттер-аккаунт и позволяет войти в систему и получить PIN-код для завершения процесса входа. Но я понятия не имею, как его использовать, чтобы заставить мое приложение работать. Я проверил весь код, но нашел ничего не связано с булавкой.

Во-вторых, когда я зарегистрировал свое приложение в твиттере, оно запросило URL обратного вызова, но поскольку было написано, что оно действительно не нужно, я пропустил указание. (Даже я не знаю, каким оно должно быть!)

И, следовательно, я даю ноль как CallbackURL в моем приложении.

Может кто-нибудь подсказать мне, как я могу использовать этот ПИН-код для завершения процесса входа в систему и возврата пользователя к основной деятельности моего приложения? Я вызываю проблему из-за URL обратного вызова или из-за чего-то еще?

Пожалуйста, ответьте. Любая помощь оценена! Спасибо.

РЕДАКТИРОВАТЬ:

По предложению Франкенштейна, я попробовал код на github.com/ddewaele/AndroidTwitterSample/downloads

Я добавил свой потребительский ключ и потребительский секрет вместе с URL-адресом обратного вызова:

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

но это дает мне эту ошибку:

Logcat:

11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081): Error during OAUth retrieve request token
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081): oauth.signpost.exception.OAuthNotAuthorizedException: Authorization failed (server replied with a 401). This can happen if the consumer key was not correct or the signatures did not match.
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081):   at oauth.signpost.AbstractOAuthProvider.handleUnexpectedResponse(AbstractOAuthProvider.java:239)
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081):   at oauth.signpost.AbstractOAuthProvider.retrieveToken(AbstractOAuthProvider.java:189)
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081):   at oauth.signpost.AbstractOAuthProvider.retrieveRequestToken(AbstractOAuthProvider.java:69)
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081):   at com.ecs.android.sample.twitter.OAuthRequestTokenTask.doInBackground(OAuthRequestTokenTask.java:55)
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081):   at com.ecs.android.sample.twitter.OAuthRequestTokenTask.doInBackground(OAuthRequestTokenTask.java:1)
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081):   at android.os.AsyncTask$2.call(AsyncTask.java:185)
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081):   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081):   at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081):   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081):   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081):   at java.lang.Thread.run(Thread.java:1096)

Также показывает черный экран, когда я нажимаю на кнопку Твиттер, вместо того, чтобы заставить меня войти в экран твиттера.

Омг, я собираюсь быть сумасшедшим ... пытался с двух дней! :( помогите пожалуйста.

Ответы [ 3 ]

9 голосов
/ 29 ноября 2011

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

Попробуйте настроить фиктивный URL-адрес обратного вызова (http://example.com/ или все, что вы хотите) в https://dev.twitter.com/apps/[appid]/settings> URL обратного вызова и ваше приложение будет распознано как клиент браузера.

Тогда попробуйте @Frankenstein или код @ jamn224.

7 голосов
/ 29 ноября 2011

Во-первых, вам нужно правильно пройти аутентификацию:

try{
        consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
        provider = new DefaultOAuthProvider("http://twitter.com/oauth/request_token", "http://twitter.com/oauth/access_token", "http://twitter.com/oauth/authorize");
        String authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL);

        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));

    }catch(Exception e){
        Log.e(TAG,e+"");
    }

Необходимые условия для CALLBACK_URL должны быть установлены в файле манифеста (см. Ответ Франкенштейна).Приведенный выше код запускает намерение выполнить авторизацию на сервере Twitter.Информация обратного вызова необходима, поэтому намерение знает, к какому приложению вернуться после процедуры авторизации.

Затем нам нужно обработать возврат к приложению после аутентификации в Twitter:

    @Override
public void onResume(){
    super.onResume();

    if (this.getIntent()!=null && this.getIntent().getData()!=null){
        Uri uri = this.getIntent().getData();

        //handle returning from authenticating the user
        if (uri != null && uri.toString().startsWith(CALLBACK_URL)) {
            String verifier = uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);
            String token = uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_TOKEN);
            try {  
                Twitter t = new TwitterFactory().getInstance();
                t.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);

                // Get Access Token and store it  
                rToken = new RequestToken(token, CONSUMER_SECRET);
                AccessToken aToken = t.getOAuthAccessToken(rToken);
                storeAccessToken(aToken);  

                //send to checkLoginState again since we have authorization now!
                checkLoginState(); 

           } catch (Exception e) {  
               Log.e(TAG, e+"");  
           }  
          }  
         }
}//end onResume

ЭтоКод извлекает данные из возвращаемого намерения, среди которых есть информация для получения токена авторизации.«storeAccessToken (aToken)» - это короткий метод, который я написал и который сохраняет токен в настройках приложения, так что нам не нужно повторно авторизовываться при каждом открытии приложения.

Теперь, когда у нас есть токен авторизации,мы можем использовать его для авторизации экземпляра Twitter:

twitter = new TwitterFactory().getInstance();
        twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
        twitter.setOAuthAccessToken(aToken);

Указанная выше переменная "twitter" теперь авторизована и может выполнять свои функции.

5 голосов
/ 29 ноября 2011

вы должны писать обратный вызов, как это указано в вашей деятельности

<activity android:name="com.apps.twitter.PrepareRequestTokenActivity"
            android:launchMode="singleTask" android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:screenOrientation="portrait">
            <intent-filter>
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="x-oauthflow-twitter" android:host="callback" />
            </intent-filter>
</activity>

А в константном файле

final public static String  CALLBACK_SCHEME = "x-oauthflow-twitter";    
final public static String  CALLBACK_URL = CALLBACK_SCHEME + "://callback";
...