这是 twitter 登录的第一页,当我点击取消并返回应用程序时, 我的应用程序被强制关闭。M 为此使用 Twitter4J 请建议我有什么问题。
M 使用此代码。
void OAuthLogin() {
try {
twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(consumerKey, consumerSecret);
requestToken = twitter.getOAuthRequestToken(CALLBACKURL);
String authUrl = requestToken.getAuthenticationURL();
this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
.parse(authUrl)));
} catch (TwitterException ex) {
Log.e("in Main.OAuthLogin", ex.getMessage());
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Uri uri = intent.getData();
if (uri != null && uri.toString().contains(CALLBACKURL)) {
try {
String verifier = uri.getQueryParameter("oauth_verifier");
AccessToken accessToken = twitter.getOAuthAccessToken(
requestToken, verifier);
String token = accessToken.getToken(), secret = accessToken
.getTokenSecret();
twitter.setOAuthAccessToken(token, secret);
twitter.updateStatus(base_link_url);
this.displayTimeLine(token, secret); // after everything,
} catch (TwitterException ex) {
}
}
}
我的清单文件:M 将此代码用于我的班级
<activity android:name=".Test" android:configChanges="keyboard|keyboardHidden|orientation"
android:screenOrientation="portrait" android:label="@string/app_name"
android:launchMode="singleTask" android:theme="@android:style/Theme.NoTitleBar">
<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="gauravmusic" android:host="twitt" />
</intent-filter>
</activity>
我的回调网址:我在我的代码中使用
private final String CALLBACKURL = "gauravmusic://twitt";
现在建议我哪里出错了。
经过研究我发现,
if (uri != null && uri.toString().contains(CALLBACKURL))
{
}
如果我将此条件更改为
if (uri != null && uri.getScheme().toString().contains(CALLBACKURL_SCHEME)) {
}
取消,并返回应用程序现在可以正常工作,但现在我无法在我的墙上发布推文。我像这样把两个条件加在一起
if (uri != null && uri.getScheme().toString().contains(CALLBACKURL_SCHEME) || uri.toString().contains(CALLBACKURL)) {
}
它也不起作用..请建议我。
嗨,我找到了答案。我发现一种模式,当单击取消并返回到应用程序 链接时,会执行此代码。在这种情况下,我们没有登录,所以我们无法找到 String Verifier 的值,并且它给出了 NullPointer 异常。
if (uri != null && uri.toString().contains(CALLBACKURL)) {
try {
String verifier = uri.getQueryParameter("oauth_verifier");
AccessToken accessToken = twitter.getOAuthAccessToken(
requestToken, verifier);
String token = accessToken.getToken(), secret = accessToken
.getTokenSecret();
twitter.setOAuthAccessToken(token, secret);
twitter.updateStatus(base_link_url);
this.displayTimeLine(token, secret); // after everything,
} catch (TwitterException ex) {
}
}
我将此行更改为
if (uri != null && uri.getScheme().toString().contains(CALLBACKURL_SCHEME)&& !uri.toString().contains("denied"))
经过一番研究,我发现当我们点击取消并返回应用程序链接时,它的 uri 是这样的
DEBUG/URI!!!!!!!!!!!!!!!!!!!!!(5174): gauravmusic://twittdenied=FjgW7QQYpFDI03sDvIc5I1w6w2Xv67TFI9sKW1OyA
当我们成功登录时,Uri 就是这样
08-17 10:31:19.182: DEBUG/URI(5278): gauravmusic://twitt?oauth_token=pm0E10vayzTViLGQpGZwwpIKhQ9aqwLrEBggiJ7vvPY&oauth_verifier=cHiWkuiQfygmlPeC7B6fNbiqv34gkPIdWctlavzGo80
然后我添加条件
!uri.toString().contains("denied") (bcz 当我们没有登录时 uri 包含一个单词 "denied")
它对我来说很好。现在,当我单击取消并返回到应用程序 时,它不会到达此行或此循环。
字符串验证器 = uri.getQueryParameter("oauth_verifier");
现在一切正常。建议我是否有更好的想法来处理这个问题。我不想依赖 Uri 的“拒绝”字眼。