我正在制作一个Twitter项目,用特定关键字搜索所有公开推文。 以下崩溃我的应用程序:
private void searchTweets() {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey(getString(R.string.twitter_consumer_key))
.setOAuthConsumerSecret(getString(R.string.twitter_consumer_secret))
.setOAuthAccessToken(getString(R.string.twitter_access_token))
.setOAuthAccessTokenSecret(getString(R.string.twitter_token_secret));
TwitterFactory tf = new TwitterFactory(cb.build());
Twitter twitter = tf.getInstance();
try {
Query query = new Query("India");
QueryResult result;
do {
result = twitter.search(query);
List<Status> tweets = result.getTweets();
for (Status tweet : tweets) {
// System.out.println("@" + tweet.getUser().getScreenName() + " - " + tweet.getText());
Log.e("TweetSearch",tweet.getUser().getScreenName() + " - " + tweet.getText() ) ;
}
} while ((query = result.nextQuery()) != null);
System.exit(0);
} catch (TwitterException te) {
te.printStackTrace();
// System.out.println("Failed to search tweets: " + te.getMessage());
Log.e("TweetSearch", te.getMessage());
System.exit(-1);
}
}
我想在列表中显示推文。我已经处理了所需的所有身份验证,并且应用程序身份验证流程也没问题。我如何知道搜索到的推文的JSON数据,以便我可以将其解析到我的列表中?
我试过这个,如何实现asyntask?
public class LimetrayTweets extends Activity {
public static final String TAG = "TweetSearch";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_limetray_tweets);
SearchTweet("Limetray");
}
public static String SearchTweet(String searchTerm) {
HttpURLConnection httpConnection = null;
BufferedReader bufferedReader = null;
StringBuilder response = new StringBuilder();
try {
URL url = new URL(Constants.URL_SEARCH + URLEncoder.encode("#" + searchTerm) + "&result_type=mixed&lang=en");
Log.e(TAG, "url twitter search: " + url.toString());
httpConnection = (HttpURLConnection) url.openConnection();
httpConnection.setRequestMethod("GET");
String jsonString = appAuthentication();
JSONObject jsonObjectDocument = new JSONObject(jsonString);
String token = jsonObjectDocument.getString("token_type") + " " +
jsonObjectDocument.getString("access_token");
httpConnection.setRequestProperty("Authorization", token);
httpConnection.setRequestProperty("Content-Type", "application/json");
httpConnection.connect();
bufferedReader = new BufferedReader(new InputStreamReader(httpConnection.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null){
response.append(line);
}
Log.d(TAG, "GET response code: " + String.valueOf(httpConnection.getResponseCode()));
Log.d(TAG, "JSON response: " + response.toString());
} catch (Exception e) {
Log.e(TAG, "GET error: " + Log.getStackTraceString(e));
}finally {
if(httpConnection != null){
httpConnection.disconnect();
}
}
return response.toString();
}
public static String appAuthentication(){
HttpURLConnection httpConnection = null;
OutputStream outputStream = null;
BufferedReader bufferedReader = null;
StringBuilder response = null;
try {
URL url = new URL(Constants.URL_AUTHENTICATION);
httpConnection = (HttpURLConnection) url.openConnection();
httpConnection.setRequestMethod("POST");
httpConnection.setDoOutput(true);
httpConnection.setDoInput(true);
String accessCredential = Constants.CONSUMER_KEY + ":" + Constants.CONSUMER_SECRET;
String authorization = "Basic " + Base64.encodeToString(accessCredential.getBytes(), Base64.NO_WRAP);
String param = "grant_type=client_credentials";
httpConnection.addRequestProperty("Authorization", authorization);
httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
httpConnection.connect();
outputStream = httpConnection.getOutputStream();
outputStream.write(param.getBytes());
outputStream.flush();
outputStream.close();
// int statusCode = httpConnection.getResponseCode();
// String reason =httpConnection.getResponseMessage();
bufferedReader = new BufferedReader(new InputStreamReader(httpConnection.getInputStream()));
String line;
response = new StringBuilder();
while ((line = bufferedReader.readLine()) != null){
response.append(line);
}
Log.d(TAG, "POST response code: " + String.valueOf(httpConnection.getResponseCode()));
Log.d(TAG, "JSON response: " + response.toString());
} catch (Exception e) {
Log.e(TAG, "POST error: " + Log.getStackTraceString(e));
}finally{
if (httpConnection != null) {
httpConnection.disconnect();
}
}
return response.toString();
}
答案 0 :(得分:0)
我正在为您发布我的实时代码。希望它适合您。 SearchTerm是search.Below方法的关键字,它将在String中返回一个json响应。
如果你想要gson序列化类。我会为你提供
ProgressDialog pd;
new DownloadTwitterTask().execute(keyword);
private class DownloadTwitterTask extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pd = ProgressDialog.show(Mainactivity.this, "",
"Loading.....", true, false);
}
protected String doInBackground(String... searchTerms) {
String result = null;
if (searchTerms.length > 0) {
result = TwitterUtils.getTimelineForSearchTerm(searchTerms[0]);
}
return result;
}
@Override
protected void onPostExecute(String result) {
if (pd != null && pd.isShowing()) {
pd.dismiss();
}
Log.e("twitter Result ", result);
//Result contains json response. take a arraylist of objects and pass //arralist to adpater of listview.
}
}
getTimelineForSearchTerm方法:
public static String getTimelineForSearchTerm(String searchTerm){
HttpURLConnection httpConnection = null;
BufferedReader bufferedReader = null;
StringBuilder response = new StringBuilder();
try {
URL url = new URL(ConstantsUtils.URL_SEARCH + URLEncoder.encode("#"+searchTerm) + "&result_type=mixed&lang=en");
Log.e(TAG, "url twitter search: " + url.toString());
httpConnection = (HttpURLConnection) url.openConnection();
httpConnection.setRequestMethod("GET");
String jsonString = appAuthentication();
JSONObject jsonObjectDocument = new JSONObject(jsonString);
String token = jsonObjectDocument.getString("token_type") + " " +
jsonObjectDocument.getString("access_token");
httpConnection.setRequestProperty("Authorization", token);
httpConnection.setRequestProperty("Content-Type", "application/json");
httpConnection.connect();
bufferedReader = new BufferedReader(new InputStreamReader(httpConnection.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null){
response.append(line);
}
Log.d(TAG, "GET response code: " + String.valueOf(httpConnection.getResponseCode()));
Log.d(TAG, "JSON response: " + response.toString());
} catch (Exception e) {
Log.e(TAG, "GET error: " + Log.getStackTraceString(e));
}finally {
if(httpConnection != null){
httpConnection.disconnect();
}
}
return response.toString();
}
}
appAuthentication Method:
public static final String TAG = "TwitterUtils";
public static String appAuthentication(){
HttpURLConnection httpConnection = null;
OutputStream outputStream = null;
BufferedReader bufferedReader = null;
StringBuilder response = null;
try {
URL url = new URL(ConstantsUtils.URL_AUTHENTICATION);
httpConnection = (HttpURLConnection) url.openConnection();
httpConnection.setRequestMethod("POST");
httpConnection.setDoOutput(true);
httpConnection.setDoInput(true);
String accessCredential = ConstantsUtils.CONSUMER_KEY + ":" + ConstantsUtils.CONSUMER_SECRET;
String authorization = "Basic " + Base64.encodeToString(accessCredential.getBytes(), Base64.NO_WRAP);
String param = "grant_type=client_credentials";
httpConnection.addRequestProperty("Authorization", authorization);
httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
httpConnection.connect();
outputStream = httpConnection.getOutputStream();
outputStream.write(param.getBytes());
outputStream.flush();
outputStream.close();
// int statusCode = httpConnection.getResponseCode();
// String reason =httpConnection.getResponseMessage();
bufferedReader = new BufferedReader(new InputStreamReader(httpConnection.getInputStream()));
String line;
response = new StringBuilder();
while ((line = bufferedReader.readLine()) != null){
response.append(line);
}
Log.d(TAG, "POST response code: " + String.valueOf(httpConnection.getResponseCode()));
Log.d(TAG, "JSON response: " + response.toString());
} catch (Exception e) {
Log.e(TAG, "POST error: " + Log.getStackTraceString(e));
}finally{
if (httpConnection != null) {
httpConnection.disconnect();
}
}
return response.toString();
}
Utils:
public class ConstantsUtils {
public static final String URL_ROOT_TWITTER_API = "https://api.twitter.com";
public static final String URL_SEARCH = URL_ROOT_TWITTER_API + "/1.1/search/tweets.json?q=";
public static final String URL_AUTHENTICATION = URL_ROOT_TWITTER_API + "/oauth2/token";
public static final String CONSUMER_KEY = "";
public static final String CONSUMER_SECRET = "";
}
答案 1 :(得分:0)
Twitter4j成功实施:
@Override
protected ArrayList<String> doInBackground(String... arg0) {
List<twitter4j.Status> tweets = new ArrayList();
tweetTexts.clear();
Twitter mTwitter = getTwitter();
try {
tweets = mTwitter.search(new Query(searchText)).getTweets();
for (twitter4j.Status t : tweets) {
tweetTexts.add(t.getText() + "\n\n");
}
} catch (Exception e) {
Log.e("Error", "Exception");
}
return tweetTexts;
}