Аутентификация в Твиттере с помощью классов Android AccountManager
Я занимаюсь разработкой приложения для Android и хочу интегрировать Twitter.
Что я понимаю, так это то, что если на устройстве пользователя установлено официальное приложение Android для 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. жетоны. но аутентификация всегда терпит неудачу.
CONSUMER_KEY & CONSUMER_SECRET - это ключи, которые я получил, когда зарегистрировал приложение в твиттере... но я не понимаю, как я могу использовать эти ключи при официальной аутентификации приложения для Android в Twitter?
Pls. дай мне знать спасибо
Вот мой код
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(){
}
}
2 ответа
com.twitter.android.oauth.token
а также com.twitter.android.oauth.token.secret
учетные данные, возвращаемые AccountManager для Android, аутентифицируются только с использованием официального ключа и секретного ключа Twitter. AFAIK Они на самом деле не полезны для сторонних разработчиков.
Что касается Твиттера, я просто скажу, что официальная пара Ключ потребителя / Секрет "там", и если Твиттер изменил их через обновление приложения, они бы сломали OAuth для каждого пользователя без этого обновления приложения.
Хорошо, вы используете секретный и потребительский ключ, чтобы получить токен. используя учетные записи Android, вы получаете токен от них.
Так, в общем, чтобы сделать твит, например, вам нужен только токен, и, как я уже сказал, вы получаете его либо из аккаунтов, либо из twitter4j. поэтому после того, как вы получите токен из учетных записей, вам нужно установить его в качестве твиттера 4jsdk и регулярно использовать API.
Надеюсь, это имеет смысл.