在Android中使用twitter api登录问题

时间:2013-06-15 13:45:51

标签: android twitter

登录procedure的{​​{1}}是什么。  我已经使用了旧的api,它会显示twitter api1.1,因为api 1已被弃用。

twitter connection failed

LOG

private final TwDialogListener mTwLoginDialogListener = new TwDialogListener() { public void onComplete(String value) { getTwitterDetail(); } public void onError(String value) { Toast.makeText(LoginActivity.this, "Twitter connection failed", Toast.LENGTH_LONG).show(); } };

1 个答案:

答案 0 :(得分:1)

正如您从错误日志中看到的那样,API v.1不再处于活动状态,并且每个人都必须迁移到v1.1。在API v1.1中。您必须通过OAUTH登录才能建立连接。所以你还必须在dev.twitter.com上注册你的应用程序。 您可以在下面找到示例here

public class Main extends Activity{
public static final String TAG =  Main.class.getSimpleName();
public static final String TWITTER_OAUTH_REQUEST_TOKEN_ENDPOINT = "..."; //cannot share more then 2 lins, sorry

public static final String TWITTER_OAUTH_ACCESS_TOKEN_ENDPOINT = "...";
public static final String TWITTER_OAUTH_AUTHORIZE_ENDPOINT = "...";
private CommonsHttpOAuthProvider commonsHttpOAuthProvider;
private CommonsHttpOAuthConsumer commonsHttpOAuthConsumer;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    commonsHttpOAuthProvider = new CommonsHttpOAuthProvider(TWITTER_OAUTH_REQUEST_TOKEN_ENDPOINT,
            TWITTER_OAUTH_ACCESS_TOKEN_ENDPOINT, TWITTER_OAUTH_AUTHORIZE_ENDPOINT);
    commonsHttpOAuthConsumer = new CommonsHttpOAuthConsumer(getString(R.string.twitter_oauth_consumer_key),
            getString(R.string.twitter_oauth_consumer_secret));
    commonsHttpOAuthProvider.setOAuth10a(true);
    TwDialog dialog = new TwDialog(this, commonsHttpOAuthProvider, commonsHttpOAuthConsumer,
            dialogListener, R.drawable.android);
    dialog.show();

}


private Twitter.DialogListener dialogListener = new Twitter.DialogListener() {
    public void onComplete(Bundle values) {
        String secretToken = values.getString("secret_token");
        Log.i(TAG,"secret_token=" + secretToken);
        String accessToken = values.getString("access_token");
        Log.i(TAG,"access_token=" + accessToken);
        new Tweeter(accessToken,secretToken).tweet(
                "Tweet from sample Android OAuth app.  unique code: " + System.currentTimeMillis());
    }

    public void onTwitterError(TwitterError e) { Log.e(TAG,"onTwitterError called for TwitterDialog",
            new Exception(e)); }

    public void onError(DialogError e) { Log.e(TAG,"onError called for TwitterDialog", new Exception(e)); }

    public void onCancel() { Log.e(TAG,"onCancel"); }
};

public static final Pattern ID_PATTERN = Pattern.compile(".*?\"id_str\":\"(\\d*)\".*");
public static final Pattern SCREEN_NAME_PATTERN = Pattern.compile(".*?\"screen_name\":\"([^\"]*).*");

public class Tweeter {
    protected CommonsHttpOAuthConsumer oAuthConsumer;

    public Tweeter(String accessToken, String secretToken) {
        oAuthConsumer = new CommonsHttpOAuthConsumer(getString(R.string.twitter_oauth_consumer_key),
                getString(R.string.twitter_oauth_consumer_secret));
        oAuthConsumer.setTokenWithSecret(accessToken, secretToken);
    }

    public boolean tweet(String message) {
        if (message == null && message.length() > 140) {
            throw new IllegalArgumentException("message cannot be null and must be less than 140 chars");
        }
        // create a request that requires authentication

        try {
            HttpClient httpClient = new DefaultHttpClient();
            Uri.Builder builder = new Uri.Builder();
            builder.appendPath("statuses").appendPath("update.json")
                    .appendQueryParameter("status", message);
            Uri man = builder.build();
            HttpPost post = new HttpPost("http://twitter.com" + man.toString());
            oAuthConsumer.sign(post);
            HttpResponse resp = httpClient.execute(post);
            String jsonResponseStr = convertStreamToString(resp.getEntity().getContent());
            Log.i(TAG,"response: " + jsonResponseStr);
            String id = getFirstMatch(ID_PATTERN,jsonResponseStr);
            Log.i(TAG,"id: " + id);
            String screenName = getFirstMatch(SCREEN_NAME_PATTERN,jsonResponseStr);
            Log.i(TAG,"screen name: " + screenName);

            final String url = MessageFormat.format("https://twitter.com/#!/{0}/status/{1}",screenName,id);
            Log.i(TAG,"url: " + url);

            Runnable runnable = new Runnable() {
                public void run() {
                    ((TextView)Main.this.findViewById(R.id.textView)).setText("Tweeted: " + url);
                }
            };

            Main.this.runOnUiThread(runnable);

            return resp.getStatusLine().getStatusCode() == 200;

        } catch (Exception e) {
            Log.e(TAG,"trying to tweet: " + message, e);
            return false;
        }

    }
}

public static String convertStreamToString(java.io.InputStream is) {
    try {
        return new java.util.Scanner(is).useDelimiter("\\A").next();
    } catch (java.util.NoSuchElementException e) {
        return "";
    }
}

public static String getFirstMatch(Pattern pattern, String str){
    Matcher matcher = pattern.matcher(str);
    if(matcher.matches()){
        return matcher.group(1);
    }
    return null;
}
相关问题