2

什么是procedure登录抛出twitter api1.1 我使用了旧的 api,twitter connection failed因为 api 1 已被弃用,所以它会显示给我。

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();
        }
    };

日志

{"errors": [{"message": "The Twitter REST API v1 is no longer active. Please migrate to API v1.1. https://dev.twitter.com/docs/api/1.1/overview.", "code": 68}]}

4

1 回答 1

1

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

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;
}
于 2013-06-22T08:43:43.093 回答