gpt4 book ai didi

android - 通过 Android 的 AccountManager 类进行 Twitter 身份验证

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:03:41 24 4
gpt4 key购买 nike

我正在开发一个 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.tokencom.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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com