如何在Android应用中发布和检索推文?

时间:2013-09-16 13:07:12

标签: android listview twitter

我正在尝试创建一个Twitter应用程序,其中包括从用户的时间轴发布和检索推文,并将其设置在列表视图中,该列表视图也会在有人推文时更新。

我还希望允许用户将照片上传到Twitter。

这是我的代码:

package com.example.listtweetdemo;

import java.util.ArrayList;
import java.util.List;


import twitter4j.Paging;
import twitter4j.ResponseList;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
import twitter4j.internal.org.json.JSONArray;
import twitter4j.internal.org.json.JSONObject;
import twitter4j.json.DataObjectFactory;
import android.app.Activity;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;





public class MainActivity extends ListActivity {

        private Button twitt;
    private Button read;
    private Button login;
    private Button logout;
    private EditText edt;
    private boolean man = true;
    private TextView textName;
    private ListView list;

    List<Status> statuses = new ArrayList<Status>();

    static final String consumerKey = "RVVVPnAUa8e1XXXXXXXXX";
    static final String consumerSecretKey = "eCh0Bb12n9oDmcomBdfisKZIfJmChC2XXXXXXXXXXXX";

    static final String prefName = "twitter_oauth";
    static final String prefKeyOauthToken = "oauth_token";
    static final String prefKeyOauthSecret = "oauth_token_secret";
    static final String prefKeyTwitterLogin = "isTwitterLogedIn";

    static final String twitterCallbackUrl = "oauth://t4jsample";

    static final String urlTwitterOauth = "auth_url";
    static final String urlTwitterVerify = "oauth_verifier";
    static final String urlTwitterToken = "oauth_token";

    static SharedPreferences pref;

    private static Twitter twitter;
    private static RequestToken reqToken;

    private connectionDetector cd;

    AlertDailogManager alert = new AlertDailogManager();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setUpIds();

        cd  = new connectionDetector(getApplicationContext());

        if(!cd.isConnectivityToInternet())
        {
            alert.showAlert(MainActivity.this, "Internet Connection Error", "Please Connect to working Internet connection", false);
            return;
        }

        if(consumerKey.trim().length() == 0 || consumerSecretKey.trim().length() == 0)
        {
            alert.showAlert(MainActivity.this, "Twitter Oauth Token", "Please set your Twitter oauth token first!", false);
            return;
        }

        login.setOnClickListener(new OnClickListener() {        
            @Override
            public void onClick(View v) {
                loginToTwitter();
            }
        });

        logout.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                logoutFromTwitter();
            }
        });

        read.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                //Paging paging = new Paging(200); // MAX 200 IN ONE CALL. SET YOUR OWN NUMBER <= 200
                try {
                    statuses = twitter.getHomeTimeline();
                } catch (TwitterException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

                try {
                    String strInitialDataSet = DataObjectFactory.getRawJSON(statuses);
                    JSONArray JATweets = new JSONArray(strInitialDataSet);

                    for (int i = 0; i < JATweets.length(); i++) {
                            JSONObject JOTweets = JATweets.getJSONObject(i);
                            Log.e("TWEETS", JOTweets.toString());
                    }

                } catch (Exception e) {
                    // TODO: handle exception
                }

                /*try {
                    ResponseList<Status> statii = twitter.getHomeTimeline();
                    statusListAdapter adapter = new statusListAdapter(getApplicationContext(), statii);
                    setListAdapter(adapter);
                    Log.d("HOME TIMELINE", statii.toString());
                } catch (TwitterException e) {
                    e.printStackTrace();
                }

                //list.setVisibility(View.VISIBLE);
                read.setVisibility(View.GONE);*/
            }
        });

        twitt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                String status = edt.getText().toString();

                if(status.trim().length() > 0)
                {
                    new updateTwitter().execute(status);
                }
            }
        });

        if(!isTwitterLogedInAlready())
        {
            Uri uri = getIntent().getData();
            if(uri != null && uri.toString().startsWith(twitterCallbackUrl))
            {
                String verify = uri.getQueryParameter(urlTwitterVerify);

                try
                {
                    AccessToken accessToken = twitter.getOAuthAccessToken(reqToken,verify);

                    Editor edit = pref.edit();

                    edit.putString(prefKeyOauthToken, accessToken.getToken());
                    edit.putString(prefKeyOauthSecret, accessToken.getTokenSecret());
                    edit.putBoolean(prefKeyTwitterLogin, true);
                    edit.commit();

                    Log.d("Twitter oauth Token", ">" + accessToken.getToken());

                    login.setVisibility(View.INVISIBLE);

                    twitt.setVisibility(View.VISIBLE);
                    edt.setVisibility(View.VISIBLE);
                    read.setVisibility(View.VISIBLE);
                    textName.setVisibility(View.VISIBLE);
                    if(man == true)
                    {
                        logout.setVisibility(View.VISIBLE);
                    }

                    long userId = accessToken.getUserId();
                    User user = twitter.showUser(userId);
                    //User user = twitter.getHomeTimeline();
                    Status n = user.getStatus();
                    String userName = user.getName();
                    textName.setText(userName);
                }
                catch(Exception e)
                {
                    Log.d("Twitter Login Error", ">" + e.getMessage());
                }
            }
        }
    }

    private void setUpIds() {
        twitt = (Button)findViewById(R.id.buttTwitt);
        login = (Button)findViewById(R.id.buttLogin);
        read = (Button)findViewById(R.id.buttRead);

        edt = (EditText)findViewById(R.id.editText1);

        logout = (Button)findViewById(R.id.buttLogout);

        textName = (TextView)findViewById(R.id.textName);

        //list = (ListView)findViewById(R.id.listView1);

        pref = getApplicationContext().getSharedPreferences("myPref", 0);

    }

    protected void logoutFromTwitter() {
        Editor e = pref.edit();
        e.remove(prefKeyOauthSecret);
        e.remove(prefKeyOauthToken);
        e.remove(prefKeyTwitterLogin);
        e.commit();

        login.setVisibility(View.VISIBLE);  
        logout.setVisibility(View.GONE);
        twitt.setVisibility(View.GONE);
        edt.setVisibility(View.GONE);
        read.setVisibility(View.GONE);
        textName.setVisibility(View.GONE);

    }

    protected void loginToTwitter() {

        if(!isTwitterLogedInAlready())
        {
            ConfigurationBuilder builder = new ConfigurationBuilder();
            builder.setOAuthConsumerKey(consumerKey);
            builder.setOAuthConsumerSecret(consumerSecretKey);
            builder.setJSONStoreEnabled(true);
            builder.setIncludeEntitiesEnabled(true);
            builder.setIncludeMyRetweetEnabled(true);
            builder.setIncludeRTsEnabled(true);
            Configuration config = builder.build();

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

            try{
                reqToken = twitter.getOAuthRequestToken(twitterCallbackUrl);
                this.startActivity(new Intent(Intent.ACTION_VIEW,
                        Uri.parse(reqToken.getAuthenticationURL())));
            }
            catch(TwitterException e)
            {
                e.printStackTrace();
            }
        }
        else
        {
            Toast.makeText(getApplicationContext(), "Already Logged In", Toast.LENGTH_LONG).show();
            logout.setVisibility(View.VISIBLE);
            man = false;
        }
    }

    private boolean isTwitterLogedInAlready() {

        return pref.getBoolean(prefKeyTwitterLogin, false);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


    public class updateTwitter extends AsyncTask<String , String, String>{

        private ProgressDialog pDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Updating to Twitter status..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }
        @Override
        protected String doInBackground(String... args) {
            Log.d("Tweet Text", "> " + args[0]);
            String status = args[0];
            try {
                ConfigurationBuilder builder = new ConfigurationBuilder();
                builder.setOAuthConsumerKey(consumerKey);
                builder.setOAuthConsumerSecret(consumerSecretKey);

                // Access Token
                String access_token = pref.getString(prefKeyOauthToken, "");
                // Access Token Secret
                String access_token_secret = pref.getString(prefKeyOauthSecret, "");

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

        @Override
        protected void onPostExecute(String result) {
            pDialog.dismiss();
            runOnUiThread(new Runnable() {
                public void run() {
                    Toast.makeText(getApplicationContext(), "Status update successfully", Toast.LENGTH_SHORT).show();
                    edt.setText("");
                }
            });
        }
    }
}

1 个答案:

答案 0 :(得分:0)

使用适用于Android的新Twitter Fabric SDK。需要先注册。如果您不想等待批准注册,那么我建议您使用以下链接

https://github.com/Rockncoder/TwitterTutorial

上面的链接解释了如何检索推文。你应该可以使用上面的链接COMBINED与下面的链接中的信息POST推文!

https://dev.twitter.com/overview/documentation