2015-02-01 3 views
0

Я делаю твиттер-проект, чтобы искать все общедоступные твиты с определенным ключевым словом. Следующие врезается мое приложение:Twitter4j, поиск твитов с ключевым словом

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

уфф ... Чувак. Что вы устали? Я дал вам свой рабочий код для вас. вы не знаете, как его реализовать? пока не увидите, что метод возвращает ответ результатов запроса. Где вы его сохранили? 1 узнайте, как реализовать Listview. пожалуйста .. Я собираюсь удалить свой ответ .. достаточно. вы не можете даже знать, что метод возвращает что-то? Stackoverflow не ваш репетитор .. – SreeAndroidDev

+0

Я очень ценю ваши комментарии. Я вернусь к этому проекту после обновления моих концепций. Большое вам спасибо – asdec90

ответ

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

Я отправляю свой живой код для вас. Надеюсь, он сработает для вас. SearchTerm - это ваше ключевое слово для search.Below Method вернет json-ответ в String.

если вы хотите класс сериализации 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 Метод:

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 = ""; 
} 
+0

Спасибо за быстрый ответ. Есть ли дополнительные библиотеки, которые вы используете или просто twitter4j? – asdec90

+0

Я использовал Twitter Rest api для поиска. Twitter4j для публикации только нового твиттера.! Мой код doenst требует twitter4j .. Пожалуйста, попробуйте. вы получите ответ. вызовите getTimelineForSearchTerm из asyntask – SreeAndroidDev

+0

Пробовав код, хотелось бы взглянуть на сериализацию GSON. – asdec90