使用twitter4j 4.0.7实现Twitter登录后跳转回登录页,setupTimeline未执行
问题根因及修复方案
- token持久化逻辑缺失
你现有代码仅在onCreate中判断SharedPreferences里的user_token存在时才执行setupTimeline(),但Twitter OAuth授权成功后,你没有将获取到的access token写入到对应存储位置,因此登录完成跳转回Activity时,token判空始终为真,只会重复渲染登录页面。 - 回调处理逻辑缺失
你仅实现了请求OAuth request token的逻辑,没有处理授权完成后的回调数据,也没有用回调返回的oauth_verifier参数交换正式的access token,自然没有可读取的有效token。你需要补充以下逻辑:- 首先在AndroidManifest.xml中为当前Activity配置intent-filter,保证和你传入
getOAuthRequestToken的TWIT_URL回调地址完全匹配,才能接收到授权回调:
<activity android:name=".MainActivity"> <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="你的TWIT_URL对应的scheme" android:host="你的TWIT_URL对应的host" /> </intent-filter> </activity>- 在Activity中补充回调处理逻辑,获取access token并存入本地存储:
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (intent == null || intent.getData() == null || !intent.getData().toString().startsWith(TWIT_URL)) { return; } String verifier = intent.getData().getQueryParameter("oauth_verifier"); new Thread(() -> { try { AccessToken accessToken = tweetzTwitter.getOAuthAccessToken(tweetzRequestToken, verifier); // 写入token到本地存储 SharedPreferences.Editor editor = tweetzPrefs.edit(); editor.putString("user_token", accessToken.getToken()); editor.putString("user_secret", accessToken.getTokenSecret()); editor.apply(); // 切主线程执行初始化逻辑 runOnUiThread(this::setupTimeline); } catch (TwitterException e) { e.printStackTrace(); } }).start(); } - 首先在AndroidManifest.xml中为当前Activity配置intent-filter,保证和你传入
- 注意项
你当前在子线程中请求requestToken,需要确保用户点击登录按钮时
tweetzRequestToken已经初始化完成,否则后续交换access token会失败,可在登录点击事件中增加判空逻辑,未拿到requestToken时提示用户稍后重试。
另外需要确认你的Twitter开发者后台应用已开启OAuth 1.0a权限,且配置的回调地址和代码中的TWIT_URL完全一致,否则会导致授权失败。
内容的提问来源于stack exchange,提问作者Nesrene
相关产品推荐
相关产品推荐

