Android:使用Twitter4J登录Twitter

Hir*_*ral 6 android login twitter4j twitter-oauth

我试过的:

我已经在twitter上注册了一个应用程序并获得了Consumer Key和Secret.Even我有各种代码可以通过twitter登录.这些是我试过的:

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

我遇到的问题:

直到现在,上面的代码带我到twitter登录,让我登录并有一个PIN来完成登录过程.但我不知道如何使用它来让我的应用程序工作.我检查了整个代码,但没有发现任何相关的销.

其次,当我在Twitter上注册我的应用程序时,它要求回拨URL但是因为它写的是它真的不需要,我跳过指定.(即使我不知道应该是什么!)

因此,我在我的应用程序中将null作为CallbackURL.

任何人都可以建议我,我如何使用此PIN完成登录过程并让用户回到我的应用程序的主要活动?它是引起问题的回调网址还是我做错了的其他事情?

请回复.任何帮助appriciated!谢谢.

编辑:

正如Frankenstein建议的那样,我在github.com/ddewaele/AndroidTwitterSample/downloads上尝试了代码

我添加了我的消费者密钥和消费者密钥以及回调网址:

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;
Run Code Online (Sandbox Code Playgroud)

但它给了我这个错误:

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)
Run Code Online (Sandbox Code Playgroud)

当我点击TWEET按钮时,也会显示黑屏,而不是让我登录twitter的屏幕.

哦,我会疯了......两天以来一直在努力!:( 请帮忙.

Kar*_*iya 9

这是因为您的应用已注册为桌面客户端.要覆盖回调URL,您的应用需要注册为浏览器客户端.

尝试在https://dev.twitter.com/apps/[appid]/settings>回调网址上配置虚拟回调网址(http://example.com/或其他任何内容),您的应用将被识别为浏览器客户.

然后尝试@Frankenstein或@jackn224代码.


jmc*_*ale 7

首先,您需要正确进行身份验证:

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+"");
    }
Run Code Online (Sandbox Code Playgroud)

需要在Manifest文件中设置CALLBACK_URL的必需项(请参阅Frankenstein的答案).上面的代码开始意图在Twitter的服务器上执行授权.回调信息是必需的,因此意图知道授权程序后要返回的应用程序.

然后我们需要在T​​witter上进行身份验证后处理应用程序的返回:

    @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
Run Code Online (Sandbox Code Playgroud)

此代码从返回的意图中获取数据,其中包括获取授权令牌的信息."storeAccessToken(aToken)"是我写的一个简短的方法,它将令牌存储在应用程序的首选项中,这样我们就不需要在每次打开应用程序时重新授权.

现在我们有了一个授权令牌,我们可以用它来授权一个Twitter实例:

twitter = new TwitterFactory().getInstance();
        twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
        twitter.setOAuthAccessToken(aToken);
Run Code Online (Sandbox Code Playgroud)

上面的变量"twitter"现在已经过授权,可以做到.


MKJ*_*ekh 5

你应该在你的活动清单中写回调

<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>
Run Code Online (Sandbox Code Playgroud)

并在常量文件中

final public static String  CALLBACK_SCHEME = "x-oauthflow-twitter";    
final public static String  CALLBACK_URL = CALLBACK_SCHEME + "://callback";
Run Code Online (Sandbox Code Playgroud)