【发布时间】:2011-11-01 07:18:42
【问题描述】:
我一直在寻找答案很长一段时间,我承认我很困惑。我正在尝试在我的应用程序中实现 Twitter,但发现它有些挑战。似乎这样做的方法是将我的应用程序注册到 Twitter(我已经这样做了)作为浏览器应用程序。我不知道我的回调 url 用什么。我真的只想返回应用程序中的当前活动,而不是重定向到回调 url。我应该为此付出什么?我被困住了......
【问题讨论】:
标签: android url twitter callback
我一直在寻找答案很长一段时间,我承认我很困惑。我正在尝试在我的应用程序中实现 Twitter,但发现它有些挑战。似乎这样做的方法是将我的应用程序注册到 Twitter(我已经这样做了)作为浏览器应用程序。我不知道我的回调 url 用什么。我真的只想返回应用程序中的当前活动,而不是重定向到回调 url。我应该为此付出什么?我被困住了......
【问题讨论】:
标签: android url twitter callback
这就是它的工作原理...您调用 twitter 身份验证 URL(通过打开 Web 浏览器)。认证的 URL 必须包含回调 URL。回调 URL 通常如下所示:x-your-application-name-oauth-twitter://callback (*)。
第二步是在你的Activity 中添加一个意图过滤器(实现 twitter auth 需要你知道 Android 是如何工作的(除非你找到一个可以为你做所有事情的教程,但我认为你似乎不是这样的)做个聪明人,不是吗?))。无论如何,您可以通过在清单中添加类似这样的内容来做到这一点:
<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-your-application-name-oauth-twitter" android:host="callback"/>
</intent-filter>
这基本上是一种对 Android 操作系统说的方式:“嘿伙计,我可以处理任何看起来像 x-your-application-name-oauth-twitter://callback 的 URL。这样,一旦用户通过身份验证,twitter 将调用该 URL,您的应用程序将收回控制权。
通常,您的活动必须使用android:launchMode="singleTask" 标签创建,然后您必须覆盖活动的onNewIntent 方法,一旦您的应用程序再次获得控制权,该方法将被调用。在Intent 中,您将找到有关回调的信息。
(*) 构建您必须启动的 URL(这将允许用户进行身份验证)有些困难。 OAuth 是一个很好但很难学习的标准。因此,您可以使用可以帮助您解决此问题的第三方库。例如,您可以使用 Oauth Signpost Java 库。但是,我建议您坚持使用 twitter4j 库,该库将帮助您使用 OAuth 并允许您与 Twitter API 进行交互。
【讨论】:
android:scheme="foo-bar-oauth-twitter";如果您的应用名为 Tushar Pandey,您将使用 android:scheme="tushar-pandey-oauth-twitter" 等。
从 GDPR 开始,只有在具有白名单回调 URL 的应用中才能使用 Twitter 登录。具有应用程序特定协议的移动应用程序必须仅使用该协议。例如,请使用 twittersdk:// 而不是 twittersdk://authorize 在您的应用设置中apps.twitter.com
中的回调 URL详细示例见下:
twittersdk://
作为 ANDROID 应用程序的回调 URL)并允许此应用程序用于使用 Twitter 登录。
编译'com.twitter.sdk.android:twitter:3.1.1'
如果使用自定义应用程序类,您可以在 onCreate() 方法中初始化 Twitter Kit。
public class CustomApplication {
public void onCreate() {
Twitter.initialize(this);
}
}
<resources>
<string android:name="com.twitter.sdk.android.CONSUMER_KEY">XXXXXXXXXXX</string>
<string android:name="com.twitter.sdk.android.CONSUMER_SECRET">XXXXXXXXXXX</string>
</resources>
<com.twitter.sdk.android.core.identity.TwitterLoginButton
android:id="@+id/login_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
import com.twitter.sdk.android.core.Callback;
import com.twitter.sdk.android.core.Result;
import com.twitter.sdk.android.core.TwitterException;
import com.twitter.sdk.android.core.TwitterSession;
import com.twitter.sdk.android.core.identity.TwitterLoginButton;
...
loginButton = (TwitterLoginButton) findViewById(R.id.login_button);
loginButton.setCallback(new Callback<TwitterSession>() {
@Override
public void success(Result<TwitterSession> result) {
// Do something with result, which provides a TwitterSession for making API calls
}
@Override
public void failure(TwitterException exception) {
// Do something on failure
}
});
@Override protected void onActivityResult(int requestCode, int
resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Pass the activity result to the login button.
loginButton.onActivityResult(requestCode, resultCode, data);
}
或如果在片段中使用 TwitterLoginButton,请改用以下步骤。在托管 Fragment 的 Activity 内部,将 Activity 的结果传递给 Fragment。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Pass the activity result to the fragment, which will then pass the result to the login
// button.
Fragment fragment = getFragmentManager().findFragmentById(R.id.your_fragment_id);
if (fragment != null) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
【讨论】: