0

我们必须在 Android 的 Twitter Api 的回调 URL 中写什么?下面是我的代码。请任何人告诉我这段代码有什么问题?

public class second extends Activity {

static String TWITTER_CONSUMER_KEY = "pHdHjwLS3D1iItAnMQTKA";
static String TWITTER_CONSUMER_SECRET = "37x7RiVdITp7jrgqXcBqR1eL1evVmmwOcxbwUxVPI6w";

// Preference Constants
static String PREFERENCE_NAME = "twitter_oauth";
static final String PREF_KEY_OAUTH_TOKEN = "859240052-4bb3qfkDhKu61xLC4ueTonaulj4Mp2k7QMRgqrF1";
static final String PREF_KEY_OAUTH_SECRET = "y3gVcOvZmTWuZqjFe9y66z1imVNUEungZmPemm8Q";
static final String PREF_KEY_TWITTER_LOGIN = "isTwitterLogedIn";

// 静态最终字符串 TWITTER_CALLBACK_URL = "oauth://t4jsample";

public static final String OAUTH_CALLBACK_SCHEME = "x-news-oauth-twitter";
public static final String OAUTH_CALLBACK_HOST = "callback";
public static final String OAUTH_CALLBACK_URL = OAUTH_CALLBACK_SCHEME
        + "://" + OAUTH_CALLBACK_HOST;
// Twitter oauth urls
static final String URL_TWITTER_AUTH = "auth_url";
static final String URL_TWITTER_OAUTH_VERIFIER = "oauth_verifier";
static final String URL_TWITTER_OAUTH_TOKEN = "oauth_token";

TextView txt_title, txt_desc, txt_link, txt_comment, txt_date,
        txt_username, txt_updatestatus;
String title, desc, link, comment, date, description;
Button btn_twit, btn_update, btn_logout;
EditText edt_status;

// Progress dialog
ProgressDialog pDialog;

// Twitter
private static Twitter twitter;
private static RequestToken requestToken;

// Shared Preferences
private static SharedPreferences mSharedPreferences;

// Internet Connection detector
private ConnectionDetector cd;

// Alert Dialog Manager
AlertDialogManager alert = new AlertDialogManager();

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    cd = new ConnectionDetector(getApplicationContext());

    // Check if Internet present
    if (!cd.isConnectingToInternet()) {
        // Internet Connection is not present
        alert.showAlertDialog(second.this, "Internet Connection Error",
                "Please connect to working Internet connection", false);
        // stop executing code by return
        return;
    }

    // Check if twitter keys are set
    if (TWITTER_CONSUMER_KEY.trim().length() == 0
            || TWITTER_CONSUMER_SECRET.trim().length() == 0) {
        // Internet Connection is not present
        alert.showAlertDialog(second.this, "Twitter oAuth tokens",
                "Please set your twitter oauth tokens first!", false);
        // stop executing code by return
        return;
    }

    txt_title = (TextView) findViewById(R.id.txt_title);
    txt_desc = (TextView) findViewById(R.id.txt_desc);
    txt_link = (TextView) findViewById(R.id.txt_link_second);
    txt_comment = (TextView) findViewById(R.id.txt_comments_second);
    txt_date = (TextView) findViewById(R.id.txt_pubdate_second);
    btn_twit = (Button) findViewById(R.id.btn_twit);
    btn_update = (Button) findViewById(R.id.btnUpdateStatus);
    btn_logout = (Button) findViewById(R.id.btnLogoutTwitter);
    txt_username = (TextView) findViewById(R.id.lblUserName);
    edt_status = (EditText) findViewById(R.id.edt_txtUpdateStatus);
    txt_updatestatus = (TextView) findViewById(R.id.lblUpdate);

    // Shared Preferences
    mSharedPreferences = getApplicationContext().getSharedPreferences(
            "MyPref", 0);

    Bundle mbunle = getIntent().getExtras();
    title = mbunle.getString("title");
    txt_title.setText(title);

    desc = mbunle.getString("desc");
    txt_desc.setText(desc);
    link = mbunle.getString("link");
    System.out.println("Link is:----" + link);
    txt_link.setText(link);
    MatchFilter matchFilter = new MatchFilter() {
        public final boolean acceptMatch(CharSequence s, int start, int end) {
            // you can compare match over here
            // return s.toString().equals("@Bharat");
            return true;
        }
    };
    TransformFilter transformFilter = new TransformFilter() {
        public final String transformUrl(final Matcher match, String url) {
            return "";
            // www.android-geek.blogspot.com/2011/04/linkify-text-in-android.html
        }
    };

    Pattern pattern = Pattern.compile(link);
    // String scheme = "http://";
    Linkify.addLinks(txt_link, pattern, link, matchFilter, transformFilter);
    txt_link.setOnClickListener(new OnClickListener() {

        public void onClick(View arg0) {
            Intent in = new Intent(second.this, web.class);
            in.putExtra("link", link);
            startActivity(in);
        }
    });

    comment = mbunle.getString("comment");
    txt_comment.setText(comment);

    date = mbunle.getString("date");
    txt_date.setText(date);

    btn_twit.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // Call login twitter function
            loginToTwitter();
        }
    });

    /**
     * Button click event to Update Status, will call updateTwitterStatus()
     * function
     * */
    btn_update.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // Call update status function
            // Get the status from EditText
            Bundle bundle = getIntent().getExtras();
            String status = bundle.getString("desc");
            System.out.println("Status is:-----" + status);
            edt_status.setText(status);

            // Check for blank text
            if (status.trim().length() > 0) {
                // update status
                new updateTwitterStatus().execute(status);
            } else {
                // EditText is empty
                Toast.makeText(getApplicationContext(),
                        "Please enter status message", Toast.LENGTH_SHORT)
                        .show();
            }
        }
    });
    /**
     * Button click event for logout from twitter
     * */
    btn_logout.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // Call logout twitter function
            logoutFromTwitter();
        }
    });
    /**
     * This if conditions is tested once is redirected from twitter page.
     * Parse the uri to get oAuth Verifier
     * */
    if (!isTwitterLoggedInAlready()) {
        Uri uri = getIntent().getData();
        if (uri != null && uri.toString().startsWith(OAUTH_CALLBACK_URL)) {
            // oAuth verifier
            String verifier = uri
                    .getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);

            try {
                // Get the access token
                AccessToken accessToken = twitter.getOAuthAccessToken(
                        requestToken, verifier);

                // Shared Preferences
                Editor e = mSharedPreferences.edit();

                // After getting access token, access token secret
                // store them in application preferences
                e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken());
                e.putString(PREF_KEY_OAUTH_SECRET,
                        accessToken.getTokenSecret());
                // Store login status - true
                e.putBoolean(PREF_KEY_TWITTER_LOGIN, true);
                e.commit(); // save changes

                Log.e("Twitter OAuth Token", "> " + accessToken.getToken());

                // Getting user details from twitter
                // For now i am getting his name only
                int userID = accessToken.getUserId();
                User user = twitter.showUser(userID);
                String username = user.getName();

                // Displaying in xml ui
                txt_username.setText(Html.fromHtml("<b>Welcome " + username
                        + "</b>"));

                // Hide login button
                btn_twit.setVisibility(View.GONE);

                // Show Update Twitter

                txt_updatestatus.setVisibility(View.VISIBLE);
                edt_status.setVisibility(View.VISIBLE);
                btn_update.setVisibility(View.VISIBLE);
                btn_logout.setVisibility(View.VISIBLE);

                Log.e("Visibility", "" + txt_updatestatus.getVisibility());
                Log.e("Visibility", "" + btn_update.getVisibility());
                Log.e("Visibility", "" + btn_logout.getVisibility());

            } catch (Exception e) {
                // Check log for login errors
                Log.e("Twitter Login Error", "> " + e.getMessage());
            }
        }
    }

}

/**
 * Function to login twitter
 * */
private void loginToTwitter() {
    // Check if already logged in
    if (!isTwitterLoggedInAlready()) {
        ConfigurationBuilder builder = new ConfigurationBuilder();
        builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
        builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);
        Configuration configuration = builder.build();

        TwitterFactory factory = new TwitterFactory(configuration);
        twitter = factory.getInstance();

        try {
            requestToken = twitter
                    .getOAuthRequestToken(OAUTH_CALLBACK_URL);
            this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
                    .parse(requestToken.getAuthenticationURL())));
        } catch (TwitterException e) {
            e.printStackTrace();
        }
    } else {
        // user already logged into twitter
        Toast.makeText(getApplicationContext(),
                "Already Logged into twitter", Toast.LENGTH_LONG).show();
    }
}

/**
 * Function to update status
 * */
class updateTwitterStatus extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(second.this);
        pDialog.setMessage("Updating to twitter...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    /**
     * getting Places JSON
     * */
    protected String doInBackground(String... args) {
        Log.d("Tweet Text", "> " + args[0]);
        String status = args[0];
        try {
            ConfigurationBuilder builder = new ConfigurationBuilder();
            builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
            builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);

            // Access Token
            String access_token = mSharedPreferences.getString(
                    PREF_KEY_OAUTH_TOKEN, "");
            // Access Token Secret
            String access_token_secret = mSharedPreferences.getString(
                    PREF_KEY_OAUTH_SECRET, "");

            AccessToken accessToken = new AccessToken(access_token,
                    access_token_secret);
            Twitter twitter = new TwitterFactory(builder.build())
                    .getInstance(accessToken);

            // Update status
            twitter4j.Status response = twitter.updateStatus(status);

            Log.d("Status", "> " + response.getText());
        } catch (TwitterException e) {
            // Error in updating status
            Log.d("Twitter Update Error", e.getMessage());
        }
        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog and show
     * the data in UI Always use runOnUiThread(new Runnable()) to update UI
     * from background thread, otherwise you will get error
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog after getting all products
        pDialog.dismiss();
        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(),
                        "Status tweeted successfully", Toast.LENGTH_SHORT)
                        .show();
                // Clearing EditText field
                // txtUpdate.setText("");
            }
        });
    }

}

/**
 * Function to logout from twitter It will just clear the application shared
 * preferences
 * */
private void logoutFromTwitter() {
    // Clear the shared preferences
    Editor e = mSharedPreferences.edit();
    e.remove(PREF_KEY_OAUTH_TOKEN);
    e.remove(PREF_KEY_OAUTH_SECRET);
    e.remove(PREF_KEY_TWITTER_LOGIN);
    e.commit();

    // After this take the appropriate action
    // I am showing the hiding/showing buttons again
    // You might not needed this code
    btn_logout.setVisibility(View.GONE);
    btn_update.setVisibility(View.GONE);
    edt_status.setVisibility(View.GONE);
    txt_updatestatus.setVisibility(View.GONE);
    txt_username.setText("");
    txt_username.setVisibility(View.GONE);

    btn_twit.setVisibility(View.VISIBLE);
}

/**
 * Check user already logged in your application using twitter Login flag is
 * fetched from Shared Preferences
 * */
private boolean isTwitterLoggedInAlready() {
    // return twitter login status from Shared Preferences
    return mSharedPreferences.getBoolean(PREF_KEY_TWITTER_LOGIN, false);
}

protected void onResume() {
    super.onResume();
}

}

4

2 回答 2

1

当您在 twitter 应用程序上注册您的应用程序时,写下您提供的 url,或者什么都没有""

如果您无法得到我的答案,请单击此链接https://dev.twitter.com/并在此处登录并单击您的应用程序,那里已经存在您的callback URL.

于 2012-10-17T12:27:58.237 回答
0
        "type in your Second Activity Class"    
        public static final String  OAUTH_CALLBACK_SCHEME   = "XYZ";
        public static final String  OAUTH_CALLBACK_HOST     = "callback";
        public static final String  TWITTER_CALLBACK_URL        = OAUTH_CALLBACK_SCHEME + "://" + OAUTH_CALLBACK_HOST;
   // and also you have to upgrade your Manifest with same names .... you dont have to type same callback URL from which you type from Dev.twitter.com
     ` {  
    <activity>
    <data
            android:host="callback"
            android:scheme="XYZ" />
                </intent-filter
    </activity> }`
于 2013-02-22T14:17:14.567 回答