Android: невозможно опубликовать твит с помощью OAuth и Twitter - PullRequest
0 голосов
/ 16 марта 2012

Я пытаюсь отправить твиты в твиттер через приложение для Android.Я использую библиотеки указателя ядра, указателя commonshttp и jtwitter.Мой код в моей основной деятельности выглядит следующим образом:

public class MainActivity extends Activity implements View.OnClickListener {
static final String TAG = "TweetExample";
private Twitter twitter;
SharedPreferences prefs;
private EditText textStatus;
private static final String CONSUMER_KEY = "my key";
private static final String CONSUMER_SECRET = "my secret";
private static String ACCESS_KEY = null;
private static String ACCESS_SECRET = null;
private static final String REQUEST_URL = "http://twitter.com/oauth/request_token";
private static final String ACCESS_TOKEN_URL = "http://twitter.com/oauth/access_token";
private static final String AUTH_URL = "http://twitter.com/oauth/authorize";
private static final String CALLBACK_URL = "TweetExample://twitt";
private static CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
private static CommonsHttpOAuthProvider provider = new CommonsHttpOAuthProvider
        (REQUEST_URL, ACCESS_TOKEN_URL, AUTH_URL); 

//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Retrieve the shared preferences
    prefs = getSharedPreferences(USER_PREFERENCES,
    Context.MODE_PRIVATE);

    // Find views by id
    ImageView buttonUpdate = (ImageView) findViewById(R.id.ImageView_Update);
    textStatus = (EditText) findViewById(R.id.textStatus);
    ImageView btnLogin = (ImageView) findViewById(R.id.ImageView_Twit); 

    // Add listener 
    buttonUpdate.setOnClickListener(this);
    btnLogin.setOnClickListener(this);

    // Initialize preferences
    prefs = PreferenceManager.getDefaultSharedPreferences(this);
    prefs.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() {
        public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {
            twitter = null;
        }
    });
}

public void onClick(View v) { 

    switch(v.getId()){ 
    case R.id.ImageView_Update:
        String status = textStatus.getText().toString();
        String message = "Status set to: " + status;
        Log.d(TAG, message);

        // Ignore empty updates
        if (status.length() == 0)
            return;

        // Connect to twitter.com and update your status 
        try { 
            Log.d(TAG, "1");
            twitter.setStatus(status); 
            Log.d(TAG, "2");
        } catch (TwitterException e) {
            Log.e(TAG, "Twitter exception: " + e);
        }
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
        break;
    case R.id.ImageView_Twit:
        try {
            String authURL = provider.retrieveRequestToken(consumer, CALLBACK_URL);
            Log.d(TAG, authURL);
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authURL)));
        } catch (OAuthMessageSignerException e) {
            e.printStackTrace();
        } catch (OAuthNotAuthorizedException e) {
            e.printStackTrace();
        } catch (OAuthExpectationFailedException e) {
            e.printStackTrace();
        } catch (OAuthCommunicationException e) {
            e.printStackTrace();
        }
        break;
    }
}    

@Override
public void onResume() {
    super.onResume();
    Uri uri = this.getIntent().getData();
    if (uri != null && uri.toString().startsWith(CALLBACK_URL)) {
        Log.d(TAG, uri.toString());
        String verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
        Log.d(TAG, verifier);
        try {
            provider.retrieveAccessToken(consumer, verifier);
            ACCESS_KEY = consumer.getToken();
            ACCESS_SECRET = consumer.getTokenSecret();
            Log.d(TAG, ACCESS_KEY);
            Log.d(TAG, ACCESS_SECRET);
        } catch (OAuthMessageSignerException e) {
            e.printStackTrace();
        } catch (OAuthNotAuthorizedException e) {
            e.printStackTrace();
        } catch (OAuthExpectationFailedException e) {
            e.printStackTrace();
        } catch (OAuthCommunicationException e) {
            e.printStackTrace();
        }
    }
}

Я знаю, что URL обратного вызова правильный.Может ли быть так, что я аутентифицируюсь с помощью указателя и пытаюсь твитнуть с помощью jtwitter?Прямо сейчас я могу войти в твиттер, чтобы авторизовать приложение и перенаправить его обратно в мое приложение, но когда я набираю что-то, чтобы попытаться опубликовать в твиттере, оно достигает twitter.setStatus(status);

с благодарностью

1 Ответ

0 голосов
/ 06 апреля 2012

Возможно, я слепой, или вы забыли включить код, но похоже, что объект Twitter никогда не создается. Таким образом, вы получите NullPointerException, когда будете его использовать.

Где-то, где вы хотите, чтобы код был таким:

OAuthSignpostClient oauthClient = new OAuthSignpostClient(app_token, app_secret, user_access_token, user_secret);
Twitter twitter = new Twitter(null, oauthClient);
...