- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发一个 android 应用程序并想集成 Twitter。
我的理解是,如果在用户的设备上安装了官方安卓 Twitter 应用程序,那么我们可以使用账户管理器进行身份验证 here .. 如果未安装,则显示 Twitter 登录网页。
我的理解正确吗?
现在使用 Twitter 网络登录页面进行身份验证工作正常。但是如何使用客户管理器登录?
使用 AccountsType 作为“com.twitter.android.auth.login”我使用客户经理从•com.twitter.android.oauth.token•com.twitter.android.oauth.token.secret
我正在使用 Twitter4J,并使用我的 CONSUMER_KEY 和 CONSUMER_SECRET 以及 recvd 进行身份验证。 token 。但身份验证总是失败。
CONSUMER_KEY 和 CONSUMER_SECRET 是我在 Twitter 上注册应用程序时获得的 key ...但我不明白如何将这些 key 用于官方 Android Twitter 应用程序身份验证?
请。让我知道谢谢
这是我的代码
public class TwitterAuthentication {
private static final String TAG = "TwitterAuthentication";
private static final int MSG_GOT_AUTH_TOKEN = 100;
private static final int MSG_GOT_AUTH_SECRET = 101;
private static final int MSG_NO_AUT_TOKEN_RECVD = 102;
public static Twitter mTwitter = null;
private Activity mActivity = null;
private SharedPreferences prefs;
private MessageHandler handler = new MessageHandler();
public static boolean bAuthenticationDone = false;
public TwitterAuthentication(Activity activity){
mActivity = activity;
prefs = PreferenceManager.getDefaultSharedPreferences(mActivity);
if (null == mTwitter){
mTwitter = new TwitterFactory().getInstance();;
mTwitter.setOAuthConsumer(Constant.CONSUMER_KEY, Constant.CONSUMER_SECRET);
bAuthenticationDone = false;
}
}
public void LoginTwitter(){
if (Constants.DEBUG)Log.d(TAG,"LoginTwitter");
if (bAuthenticationDone){
TwitterSessionEvents.onLoginSuccess();
}
else if (!isSessionValid()){
AuthTwitter();
}
else{
bAuthenticationDone = true;
TwitterSessionEvents.onLoginSuccess();
}
}
public boolean isSessionValid(){
boolean ret = false;
if (null != prefs && null != mTwitter){
String token = prefs.getString(Constant.OAUTH_TOKEN, "");
String secret = prefs.getString(Constant.OAUTH_TOKEN_SECRET, "");
if (null != token && null != secret && token.length()>0 && secret.length()>0){
AccessToken a = new AccessToken(token,secret);
mTwitter.setOAuthAccessToken(a);
try {
mTwitter.getAccountSettings();
keys.User_Id = mTwitter.getScreenName();
ret = true;
} catch (TwitterException e) {
ret = false;
}
}
}
return ret;
}
public void AuthTwitter(){
// First check if Account manager has valid token
// Result of this is send in MSG
CheckAccManagerForTwitter();
}
public Twitter getTwitter(){
return mTwitter;
}
private boolean CheckAccManagerForTwitter(){
AccountManager am = AccountManager.get(mActivity);
Account[] accts = am.getAccountsByType("com.twitter.android.auth.login");
if(accts.length > 0) {
Account acct = accts[0];
am.getAuthToken(acct, "com.twitter.android.oauth.token", null, mActivity, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> arg0) {
try {
Bundle b = arg0.getResult();
String token = b.getString(AccountManager.KEY_AUTHTOKEN);
String userName = b.getString(AccountManager.KEY_ACCOUNT_NAME);
handler.sendMessage(handler.obtainMessage(MSG_GOT_AUTH_TOKEN, token));
}
catch (Exception e) {
Log.e(TAG, "EXCEPTION@AUTHTOKEN");
handler.sendEmptyMessage(MSG_NO_AUT_TOKEN_RECVD);
}
}}, null);
am.getAuthToken(acct, "com.twitter.android.oauth.token.secret", null, mActivity, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> arg0) {
try {
Bundle b = arg0.getResult();
String secret = b.getString(AccountManager.KEY_AUTHTOKEN);
handler.sendMessage(handler.obtainMessage(MSG_GOT_AUTH_SECRET,secret));
}
catch (Exception e) {
Log.e(TAG, "EXCEPTION@AUTHTOKEN");
handler.sendEmptyMessage(MSG_NO_AUT_TOKEN_RECVD);
}
}}, null);
//
}
else{
// No twitter account found in Account Manager
Log.e(TAG, "No Twitter account in Account manager");
handler.sendEmptyMessage(MSG_NO_AUT_TOKEN_RECVD);
}
return true;
}
class MessageHandler extends Handler {
String token = null;
String secret = null;
@Override
public void handleMessage(Message msg) {
if (msg.what == MSG_GOT_AUTH_TOKEN | msg.what ==MSG_GOT_AUTH_SECRET){
if (msg.what == MSG_GOT_AUTH_TOKEN){
token = (String)msg.obj;
}
else if (msg.what == MSG_GOT_AUTH_SECRET){
secret = (String)msg.obj;
}
if (null != token && null != secret){
AccessToken accesstoken = new AccessToken(token,secret);
mTwitter.setOAuthAccessToken(accesstoken);
try {
mTwitter.getAccountSettings();
keys.User_Id = mTwitter.getScreenName();
} catch (Exception e) {
// That means Authentication Failed
// So fall back to web login
Intent i = new Intent(mActivity.getApplicationContext(), PrepareRequestTokenActivity.class);
mActivity.startActivity(i);
}
}
}
else if (msg.what == MSG_NO_AUT_TOKEN_RECVD){
// That means There is no twiter account with Account Manager
// So fall back to web login
Intent i = new Intent(mActivity.getApplicationContext(), PrepareRequestTokenActivity.class);
mActivity.startActivity(i);
}
}
}
public void LogoutTwiter(){
}
}
最佳答案
Android 的 AccountManager 返回的 com.twitter.android.oauth.token
和 com.twitter.android.oauth.token.secret
凭据仅使用 Twitter 的官方 Consumer 进行身份验证 key 和 secret 。据我所知,它们实际上对第三方开发人员没有用。
关于 Twitter,我只想说官方的 Consumer Key/Secret 对“在那里”,如果 Twitter 通过应用程序更新更改它们,他们会在没有应用程序更新的情况下破坏每个用户的 OAuth。
关于android - 通过 Android 的 AccountManager 类进行 Twitter 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6341164/
当我们可以使用 Accountmanager.addAccountExplicitly() 创建包含所有参数的帐户时,为什么我们使用 Accountmanager.addAccount()。 我用谷歌
有什么区别- AccountManager accountManager = (AccountManager) context.getSystemService(Context.ACCOUNT_SER
我知道 AccountManager的 addOnAccountsUpdatedListener()可用于获取有关帐户列表更改的通知。如果发生此类事件,框架将调用提供的 OnAccountsUpdat
AccountManager 帐户存储在哪里?它在设备上吗?如果是,它存储在哪个文件夹中? 最佳答案 它存储在这里: Environment.getSystemSecureDirectory().ge
在 AccountManager 教程中 Remembering Your User ,建议: If there's more than one Account in the array, you s
我有一个应用程序正在实现我自己的身份验证器,如 this 中所述文章。它按预期工作正常。现在我需要从 AccountManager 获取谷歌帐户,我是这样做的: Account[] accounts
我尝试在我的应用程序中实现一个客户管理器,以避免用户每次打开应用程序时都必须登录。 所以基本上,我已经有了我的身份验证 Activity ,用户可以在其中放置其登录名和密码,以及我们从服务器接收 to
语境 我的应用程序只存储用户/通行证。不使用 token 。 问题 1 方法 setAccountAuthenticatorResult(Bundle) 和 onResult(Bundle) 旨在通知
Security tips与 AccountManager 相关的章节提到: If credentials are used only by applications that you create,
我正在尝试确定用户是否已添加该帐户,以防止在我的应用程序上多次添加同一帐户。我正在使用我自己的帐户验证器 Activity 。这是我的代码: public class AuthenticatorAct
我正在使用 custom class to expose some custom schema in Active Directory .我正在存储一个二进制 blob,根据项目要求,此数据必须存储在
我想使用他的 Google 帐户对我应用的用户进行身份验证,因为这是在多个设备上对用户进行身份验证的最简单方法。 我的问题是,如果我使用 AccountPicker.newChooseAccountI
我正在开发一个应用程序,它使用 AccountManager 获取 Google 帐户的凭据,该帐户随后用于从 AppEngine 获取 cookie。我注意到我在将应用程序发送给测试人员时发现了错误
我需要一些帮助来了解客户经理为我们提供的服务。我有一个需要 token 才能使用的 Web 服务。例如,如果开发人员想使用我的 api,他们会使用如下 url: http://myservice.co
我在 AccountManager 中保存了一个授权 token ,但是,当我执行 peekAuthToken(account, authTokenType) 时,它返回 null。我的调用者 uid
在文档中,android account manager blockingGetAuthToken 声明如果它的第三个参数notifyAuthFailure 为false,它会提示用户登录 Activ
我了解需要 AccountManager 的用途,并且稍微了解如何使用和实现它。但是,我还不知道我是否可以正确使用它,如果我不拥有它,甚至与我用来验证我的应用程序的服务相关联。我正在编写一个使用 RE
我一直在努力弄清楚如何使用 Google 客户经理为用户提供一种登录我的应用程序的方法。 我已返回 AuthToken,但我如何才能获得一些不会更改的帐户的唯一信息,例如 uniqueID 或其他信息
我正在创建两个应用程序。主应用程序包含一个登录名,用于创建自定义帐户。对于第二个应用程序,我想从主应用程序访问用户数据(刷新 token 存储在那里)。 主应用正在创建自定义帐户,刷新 token 通
我正在尝试获取 Google 帐户的授权 token ,因为我正在使用以下代码: AccountManager acoountManager = AccountManager.get( getCon
我是一名优秀的程序员,十分优秀!