我的示例Android Twitter应用程序出错

时间:2012-03-12 10:03:31

标签: android twitter twitter-oauth

我使用以下代码在twitter中发布消息,它编译并执行时没有错误。当我尝试登录twitter时出现以下错误。

03-12 15:14:49.577: WARN/System.err(4700): oauth.signpost.exception.OAuthCommunicationException: Communication with the service provider failed: https://api.twitter.com/oauth/request_token
03-12 15:14:49.577: WARN/System.err(4700):     at oauth.signpost.AbstractOAuthProvider.retrieveToken(AbstractOAuthProvider.java:214)
03-12 15:14:49.577: WARN/System.err(4700):     at oauth.signpost.AbstractOAuthProvider.retrieveRequestToken(AbstractOAuthProvider.java:69)
03-12 15:14:49.577: WARN/System.err(4700):     at net.londatiga.android.TwitterApp$2.run(TwitterApp.java:119)
03-12 15:14:49.577: WARN/System.err(4700): Caused by: java.io.FileNotFoundException: https://api.twitter.com/oauth/request_token
03-12 15:14:49.577: WARN/System.err(4700):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:521)
03-12 15:14:49.577: WARN/System.err(4700):     at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:258)
03-12 15:14:49.577: WARN/System.err(4700):     at oauth.signpost.basic.HttpURLConnectionResponseAdapter.getContent(HttpURLConnectionResponseAdapter.java:18)
03-12 15:14:49.577: WARN/System.err(4700):     at oauth.signpost.AbstractOAuthProvider.handleUnexpectedResponse(AbstractOAuthProvider.java:228)
03-12 15:14:49.577: WARN/System.err(4700):     at oauth.signpost.AbstractOAuthProvider.retrieveToken(AbstractOAuthProvider.java:189)
03-12 15:14:49.577: WARN/System.err(4700):     ... 2 more

我使用了以下代码,

TestConnect.java

import net.londatiga.android.TwitterApp.TwDialogListener;

import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Toast;

import android.app.AlertDialog;
import android.app.Activity;

import android.view.View;
import android.view.View.OnClickListener;

import android.content.DialogInterface;
import android.content.Intent;

import android.os.Bundle;
import android.graphics.Color;

public class TestConnect extends Activity {
    private TwitterApp mTwitter;
    private CheckBox mTwitterBtn;

    private static final String twitter_consumer_key = "tQQlVbpVa4ybFxAm7ELIlw";
    private static final String twitter_secret_key = "PQlfEmaX6F1kc1306i3h0RwSzfF6LrH5wPFQNET3k";

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        mTwitterBtn = (CheckBox) findViewById(R.id.twitterCheck);

        mTwitterBtn.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                onTwitterClick();
            }
        });

        mTwitter = new TwitterApp(this, twitter_consumer_key,
                twitter_secret_key);

        mTwitter.setListener(mTwLoginDialogListener);

        if (mTwitter.hasAccessToken()) {
            mTwitterBtn.setChecked(true);

            String username = mTwitter.getUsername();
            username = (username.equals("")) ? "Unknown" : username;

            mTwitterBtn.setText("  Twitter (" + username + ")");
            mTwitterBtn.setTextColor(Color.WHITE);
        }

        Button goBtn = (Button) findViewById(R.id.button1);

        goBtn.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                startActivity(new Intent(TestConnect.this, TestPost.class));
            }
        });
    }

    private void onTwitterClick() {
        if (mTwitter.hasAccessToken()) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);

            builder.setMessage("Delete current Twitter connection?")
                    .setCancelable(false)
                    .setPositiveButton("Yes",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int id) {
                                    mTwitter.resetAccessToken();

                                    mTwitterBtn.setChecked(false);
                                    mTwitterBtn
                                            .setText("  Twitter (Not connected)");
                                    mTwitterBtn.setTextColor(Color.GRAY);
                                }
                            })
                    .setNegativeButton("No",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int id) {
                                    dialog.cancel();

                                    mTwitterBtn.setChecked(true);
                                }
                            });
            final AlertDialog alert = builder.create();

            alert.show();
        } else {
            mTwitterBtn.setChecked(false);

            mTwitter.authorize();
        }
    }

    private final TwDialogListener mTwLoginDialogListener = new TwDialogListener() {

        public void onComplete(String value) {
            String username = mTwitter.getUsername();
            username = (username.equals("")) ? "No Name" : username;

            mTwitterBtn.setText("  Twitter  (" + username + ")");
            mTwitterBtn.setChecked(true);
            mTwitterBtn.setTextColor(Color.WHITE);

            Toast.makeText(TestConnect.this,
                    "Connected to Twitter as " + username, Toast.LENGTH_LONG)
                    .show();
        }

        public void onError(String value) {
            mTwitterBtn.setChecked(false);

            Toast.makeText(TestConnect.this, "Twitter connection failed",
                    Toast.LENGTH_LONG).show();
        }
    };
}

TestPost.java

import net.londatiga.android.TwitterApp.TwDialogListener;

import android.app.Activity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

import android.view.View;
import android.view.View.OnClickListener;

import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import android.widget.Button;

public class TestPost extends Activity {
    private TwitterApp mTwitter;
    private CheckBox mTwitterBtn;
    private String username = "";
    private boolean postToTwitter = false;

    private static final String twitter_consumer_key = "tQQlVbpVa4ybFxAm7ELIlw";
    private static final String twitter_secret_key = "PQlfEmaX6F1kc1306i3h0RwSzfF6LrH5wPFQNET3k";

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.post);

        Button postBtn = (Button) findViewById(R.id.button1);
        final EditText reviewEdit = (EditText) findViewById(R.id.revieew);

        postBtn.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                String review = reviewEdit.getText().toString();

                if (review.equals(""))
                    return;

                postReview(review);

                if (postToTwitter)
                    postToTwitter(review);
            }
        });

        mTwitter = new TwitterApp(this, twitter_consumer_key,
                twitter_secret_key);

        mTwitter.setListener(mTwLoginDialogListener);

        mTwitterBtn = (CheckBox) findViewById(R.id.twitterCheck);

        mTwitterBtn.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                if (mTwitter.hasAccessToken()) {
                    postToTwitter = mTwitterBtn.isChecked();
                } else {
                    mTwitterBtn.setChecked(false);
                    mTwitter.authorize();
                }
            }
        });

        if (mTwitter.hasAccessToken()) {
            username = mTwitter.getUsername();
            username = (username.equals("")) ? "No Name" : username;

            mTwitterBtn.setText("  Twitter  (" + username + ")");
        }
    }

    private void postReview(String review) {
        // post to server

        Toast.makeText(this, "Review posted", Toast.LENGTH_SHORT).show();
    }

    private void postToTwitter(final String review) {
        new Thread() {

            public void run() {
                int what = 0;

                try {
                    mTwitter.updateStatus(review);
                } catch (Exception e) {
                    what = 1;
                }

                mHandler.sendMessage(mHandler.obtainMessage(what));
            }
        }.start();
    }

    private Handler mHandler = new Handler() {

        public void handleMessage(Message msg) {
            String text = (msg.what == 0) ? "Posted to Twitter"
                    : "Post to Twitter failed";

            Toast.makeText(TestPost.this, text, Toast.LENGTH_SHORT).show();
        }
    };
    private final TwDialogListener mTwLoginDialogListener = new TwDialogListener() {

        public void onComplete(String value) {
            username = mTwitter.getUsername();
            username = (username.equals("")) ? "No Name" : username;

            mTwitterBtn.setText("  Twitter  (" + username + ")");
            mTwitterBtn.setChecked(true);

            postToTwitter = true;

            Toast.makeText(TestPost.this,
                    "Connected to Twitter as " + username, Toast.LENGTH_LONG)
                    .show();
        }

        public void onError(String value) {
            mTwitterBtn.setChecked(false);

            Toast.makeText(TestPost.this, "Twitter connection failed",
                    Toast.LENGTH_LONG).show();
        }
    };
}

TwitterApp.java

import java.net.MalformedURLException;
import java.net.URLDecoder;

import oauth.signpost.OAuthProvider;
import oauth.signpost.basic.DefaultOAuthProvider;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.http.AccessToken;
import twitter4j.User;

import android.os.Handler;
import android.os.Message;

import android.app.ProgressDialog;
import android.content.Context;
import android.util.Log;
import android.view.Window;

import java.net.URL;

public class TwitterApp {
    private Twitter mTwitter;
    private TwitterSession mSession;
    private AccessToken mAccessToken;
    private CommonsHttpOAuthConsumer mHttpOauthConsumer;
    private OAuthProvider mHttpOauthprovider;
    private String mConsumerKey;
    private String mSecretKey;
    private ProgressDialog mProgressDlg;
    private TwDialogListener mListener;
    private Context context;

    public static final String CALLBACK_URL = "twitterapp://connect";
    private static final String TAG = "TwitterApp";

    public TwitterApp(Context context, String consumerKey, String secretKey) {
        this.context = context;

        mTwitter = new TwitterFactory().getInstance();
        mSession = new TwitterSession(context);
        mProgressDlg = new ProgressDialog(context);

        mProgressDlg.requestWindowFeature(Window.FEATURE_NO_TITLE);

        mConsumerKey = consumerKey;
        mSecretKey = secretKey;

        mHttpOauthConsumer = new CommonsHttpOAuthConsumer(mConsumerKey,
                mSecretKey);
        mHttpOauthprovider = new DefaultOAuthProvider("http://twitter.com/oauth/request_token",
                                                 "http://twitter.com/oauth/access_token",
                                                 "http://twitter.com/oauth/authorize");

        mAccessToken = mSession.getAccessToken();

        configureToken();
    }

    public void setListener(TwDialogListener listener) {
        mListener = listener;
    }

    @SuppressWarnings("deprecation")
    private void configureToken() {
        if (mAccessToken != null) {
            mTwitter.setOAuthConsumer(mConsumerKey, mSecretKey);

            mTwitter.setOAuthAccessToken(mAccessToken);
        }
    }

    public boolean hasAccessToken() {
        return (mAccessToken == null) ? false : true;
    }

    public void resetAccessToken() {
        if (mAccessToken != null) {
            mSession.resetAccessToken();

            mAccessToken = null;
        }
    }

    public String getUsername() {
        return mSession.getUsername();
    }

    public void updateStatus(String status) throws Exception {
        try {
            mTwitter.updateStatus(status);
        } catch (TwitterException e) {
            throw e;
        }
    }

    public void authorize() {
        mProgressDlg.setMessage("Initializing ...");
        mProgressDlg.show();

        new Thread() {

            public void run() {
                String authUrl = "";
                int what = 1;

                try {
                    authUrl = mHttpOauthprovider.retrieveRequestToken(
                            mHttpOauthConsumer, CALLBACK_URL);

                    what = 0;

                    Log.d(TAG, "Request token url " + authUrl);
                } catch (Exception e) {
                    Log.d(TAG, "Failed to get request token");

                    e.printStackTrace();
                }

                mHandler.sendMessage(mHandler
                        .obtainMessage(what, 1, 0, authUrl));
            }
        }.start();
    }

    public void processToken(String callbackUrl) {
        mProgressDlg.setMessage("Finalizing ...");
        mProgressDlg.show();

        final String verifier = getVerifier(callbackUrl);

        new Thread() {

            public void run() {
                int what = 1;

                try {
                    mHttpOauthprovider.retrieveAccessToken(mHttpOauthConsumer,
                            verifier);

                    mAccessToken = new AccessToken(
                            mHttpOauthConsumer.getToken(),
                            mHttpOauthConsumer.getTokenSecret());

                    configureToken();

                    User user = mTwitter.verifyCredentials();

                    mSession.storeAccessToken(mAccessToken, user.getName());

                    what = 0;
                } catch (Exception e) {
                    Log.d(TAG, "Error getting access token");

                    e.printStackTrace();
                }

                mHandler.sendMessage(mHandler.obtainMessage(what, 2, 0));
            }
        }.start();
    }

    private String getVerifier(String callbackUrl) {
        String verifier = "";

        try {
            callbackUrl = callbackUrl.replace("twitterapp", "http");

            URL url = new URL(callbackUrl);
            String query = url.getQuery();

            String array[] = query.split("&");

            for (String parameter : array) {
                String v[] = parameter.split("=");

                if (URLDecoder.decode(v[0]).equals(
                        oauth.signpost.OAuth.OAUTH_VERIFIER)) {
                    verifier = URLDecoder.decode(v[1]);
                    break;
                }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        return verifier;
    }

    private void showLoginDialog(String url) {
        final TwDialogListener listener = new TwDialogListener() {

            public void onComplete(String value) {
                processToken(value);
            }

            public void onError(String value) {
                mListener.onError("Failed opening authorization page");
            }
        };

        new TwitterDialog(context, url, listener).show();
    }

    private Handler mHandler = new Handler() {

        public void handleMessage(Message msg) {
            mProgressDlg.dismiss();

            if (msg.what == 1) {
                if (msg.arg1 == 1)
                    mListener.onError("Error getting request token");
                else
                    mListener.onError("Error getting access token");
            } else {
                if (msg.arg1 == 1)
                    showLoginDialog((String) msg.obj);
                else
                    mListener.onComplete("");
            }
        }
    };

    public interface TwDialogListener {
        public void onComplete(String value);

        public void onError(String value);
    }
}

TwitterDialog.java

import android.app.Dialog;
import android.app.ProgressDialog;

import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;

import android.os.Bundle;
import android.util.Log;
import android.content.Context;

import android.view.Display;
import android.view.ViewGroup;
import android.view.Window;

import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;

import net.londatiga.android.TwitterApp.TwDialogListener;

public class TwitterDialog extends Dialog {

    static final float[] DIMENSIONS_LANDSCAPE = { 460, 260 };
    static final float[] DIMENSIONS_PORTRAIT = { 280, 420 };
    static final FrameLayout.LayoutParams FILL = new FrameLayout.LayoutParams(
            ViewGroup.LayoutParams.FILL_PARENT,
            ViewGroup.LayoutParams.FILL_PARENT);
    static final int MARGIN = 4;
    static final int PADDING = 2;

    private String mUrl;
    private TwDialogListener mListener;
    private ProgressDialog mSpinner;
    private WebView mWebView;
    private LinearLayout mContent;
    private TextView mTitle;

    private static final String TAG = "Twitter-WebView";

    public TwitterDialog(Context context, String url, TwDialogListener listener) {
        super(context);

        mUrl = url;
        mListener = listener;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mSpinner = new ProgressDialog(getContext());

        mSpinner.requestWindowFeature(Window.FEATURE_NO_TITLE);
        mSpinner.setMessage("Loading...");

        mContent = new LinearLayout(getContext());

        mContent.setOrientation(LinearLayout.VERTICAL);

        setUpTitle();
        setUpWebView();

        Display display = getWindow().getWindowManager().getDefaultDisplay();
        final float scale = getContext().getResources().getDisplayMetrics().density;
        float[] dimensions = (display.getWidth() < display.getHeight()) ? DIMENSIONS_PORTRAIT
                : DIMENSIONS_LANDSCAPE;

        addContentView(mContent, new FrameLayout.LayoutParams(
                (int) (dimensions[0] * scale + 0.5f), (int) (dimensions[1]
                        * scale + 0.5f)));
    }

    private void setUpTitle() {
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        Drawable icon = getContext().getResources().getDrawable(
                R.drawable.twitter_icon);

        mTitle = new TextView(getContext());

        mTitle.setText("Twitter");
        mTitle.setTextColor(Color.WHITE);
        mTitle.setTypeface(Typeface.DEFAULT_BOLD);
        mTitle.setBackgroundColor(0xFFbbd7e9);
        mTitle.setPadding(MARGIN + PADDING, MARGIN, MARGIN, MARGIN);
        mTitle.setCompoundDrawablePadding(MARGIN + PADDING);
        mTitle.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);

        mContent.addView(mTitle);
    }

    private void setUpWebView() {
        mWebView = new WebView(getContext());

        mWebView.setVerticalScrollBarEnabled(false);
        mWebView.setHorizontalScrollBarEnabled(false);
        mWebView.setWebViewClient(new TwitterWebViewClient());
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.loadUrl(mUrl);
        mWebView.setLayoutParams(FILL);

        mContent.addView(mWebView);
    }

    private class TwitterWebViewClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Log.d(TAG, "Redirecting URL " + url);

            if (url.startsWith(TwitterApp.CALLBACK_URL)) {
                mListener.onComplete(url);

                TwitterDialog.this.dismiss();

                return true;
            } else if (url.startsWith("authorize")) {
                return false;
            }

            return true;
        }

        @Override
        public void onReceivedError(WebView view, int errorCode,
                String description, String failingUrl) {
            Log.d(TAG, "Page error: " + description);

            super.onReceivedError(view, errorCode, description, failingUrl);

            mListener.onError(description);

            TwitterDialog.this.dismiss();
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Log.d(TAG, "Loading URL: " + url);
            super.onPageStarted(view, url, favicon);
            mSpinner.show();
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            String title = mWebView.getTitle();
            if (title != null && title.length() > 0) {
                mTitle.setText(title);
            }
            mSpinner.dismiss();
        }

    }
}

TwitterSession.java

import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.Context;

import twitter4j.http.AccessToken;

public class TwitterSession {
    private SharedPreferences sharedPref;
    private Editor editor;

    private static final String TWEET_AUTH_KEY = "auth_key";
    private static final String TWEET_AUTH_SECRET_KEY = "auth_secret_key";
    private static final String TWEET_USER_NAME = "user_name";
    private static final String SHARED = "Twitter_Preferences";

    public TwitterSession(Context context) {
        sharedPref = context.getSharedPreferences(SHARED, Context.MODE_PRIVATE);

        editor = sharedPref.edit();
    }

    public void storeAccessToken(AccessToken accessToken, String username) {
        editor.putString(TWEET_AUTH_KEY, accessToken.getToken());
        editor.putString(TWEET_AUTH_SECRET_KEY, accessToken.getTokenSecret());
        editor.putString(TWEET_USER_NAME, username);

        editor.commit();
    }

    public void resetAccessToken() {
        editor.putString(TWEET_AUTH_KEY, null);
        editor.putString(TWEET_AUTH_SECRET_KEY, null);
        editor.putString(TWEET_USER_NAME, null);

        editor.commit();
    }

    public String getUsername() {
        return sharedPref.getString(TWEET_USER_NAME, "");
    }

    public AccessToken getAccessToken() {
        String token = sharedPref.getString(TWEET_AUTH_KEY, null);
        String tokenSecret = sharedPref.getString(TWEET_AUTH_SECRET_KEY, null);

        if (token != null && tokenSecret != null)
            return new AccessToken(token, tokenSecret);
        else
            return null;
    }
}

main.xml中

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:padding="10dp" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This example shows how to connect to Twitter, display authorization dialog and save user&apos;s token and username"
        android:textColor="#fff"
        android:textSize="13sp" />

    <CheckBox
        android:id="@+id/twitterCheck"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="10dp"
        android:button="@drawable/twitter_check"
        android:clickable="true"
        android:focusable="true"
        android:text="  Twitter (Not connected) "
        android:textColor="#ccc"
        android:textSize="14sp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text=" Test Post" />

</LinearLayout>

post.xml

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:padding="10dp" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:text="This example shows how to post Twitter status. If there is no saved session, the authorization
        dialog will be displayed."
        android:textColor="#fff"
        android:textSize="13sp" />

    <EditText
        android:id="@+id/revieew"
        android:layout_width="250dp"
        android:layout_height="100dp"
        android:layout_marginTop="15dp"
        android:hint="Write your review" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:text="Also share to:"
        android:textColor="#fff"
        android:textSize="13sp" />

    <CheckBox
        android:id="@+id/twitterCheck"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="10dp"
        android:button="@drawable/twitter_check"
        android:clickable="true"
        android:focusable="true"
        android:text="  Twitter"
        android:textSize="14sp" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:text="    Submit    " />

</LinearLayout>

我使用了以下键值......

** twitter_consumer_key =“tQQlVbpVa4ybFxAm7ELIlw”

twitter_secret_key =“PQlfEmaX6F1kc1306i3h0RwSzfF6LrH5wPFQNET3k”**

我也试过这个例子http://android10.org/index.php/articleslibraries/291-twitter-integration-in-your-android-application我得到了同样的错误/异常。为什么它会出现,我怎么能解决这些......如果Twitter最近做了任何改变来创建密钥..

0 个答案:

没有答案