OneDrive へ移動 ListView で表示されている画像は、『private Drawable[] image_icon = new Drawable[100];』を定義しておいて、検索結果分を保存しておくようにしています。アダプタ内の getView で行うと、Android の仕様により、画像の表示がスクロールに追いつかない状態になります。 TwitterSearch.java
package com.example.listviewobjectjson; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collections; import java.util.Random; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import android.os.AsyncTask; import android.util.Base64; public class TwitterSearch { // AsyncTask のインラインで参照する為の final private final String _consumer_key; private final String _consumer_secret; private final String _token; private final String _secret; // API private final String _tweet_api = "https://api.twitter.com/1.1/search/tweets.json"; // ************************************************************** // コンストラクタ // ************************************************************** public TwitterSearch(String _consumer_key, String _consumer_secret, String _token, String _secret) { this._consumer_key = _consumer_key; this._consumer_secret = _consumer_secret; this._token = _token; this._secret = _secret; } // ************************************************************** // AsyncTask の onPostExecute から外部イベントとして呼び出す為のインターフェイス // ************************************************************** public interface Searched { public void onSearchResult(String result); } // ************************************************************** // Twitter 投稿 // ************************************************************** public void Search(String query, int count, final Searched OnSearchResult) { new AsyncTask<String, Void, String>() { // ************************************************************** // 非同期処理 // ************************************************************** @Override protected String doInBackground(String... params) { ArrayList<String> lst = new ArrayList<String>(); String nonce = getNonce(); String timeStamp = getTimeStamp(); String result_string = ""; try { // ********************************* // 投稿に必要なデータ (1) // ********************************* lst.add("count=" + params[1]); lst.add("oauth_consumer_key=" + _consumer_key); lst.add("oauth_nonce=" + nonce); lst.add("oauth_signature_method=" + "HMAC-SHA1"); lst.add("oauth_timestamp=" + timeStamp); lst.add("oauth_token=" + _token); lst.add("oauth_version=1.0"); lst.add("q=" + rfc3986(URLEncoder.encode(params[0], "utf-8"))); Collections.sort(lst); String work = ""; for(int i = 0; i < lst.size() ; i++ ){ if ( i != 0 ) { work += "&"; } work += lst.get(i); } // ********************************* // 投稿に必要なデータ (2) // ********************************* String work2 = "GET" + "&"; // API のエントリポイント work2 += rfc3986(URLEncoder.encode(_tweet_api,"utf-8")) + "&"; // 投稿に必要なデータ (1) work2 += rfc3986(URLEncoder.encode(work,"utf-8")); // ********************************* // 投稿に必要なデータ (3) // ********************************* String oauth_signature = getSignature(work2); // ********************************* // 投稿に必要なデータ (4) / ヘッダ // ********************************* String data = "oauth_consumer_key=" + dD(_consumer_key) + ",oauth_nonce=" + dD(nonce) + ",oauth_signature=" + dD(rfc3986(URLEncoder.encode(oauth_signature, "utf-8"))) + ",oauth_signature_method=" + dD("HMAC-SHA1") + ",oauth_timestamp=" + dD(timeStamp) + ",oauth_token=" + dD(_token) + ",oauth_version=" + dD("1.0"); // 投稿先 URL url = new URL(_tweet_api + "?q=" + rfc3986(URLEncoder.encode(params[0], "utf-8")) + "&count=" + params[1] ); // 接続準備 HttpURLConnection http = (HttpURLConnection)url.openConnection(); http.setConnectTimeout(30000); http.setReadTimeout(30000); http.setRequestMethod("GET"); // ヘッダ http.setRequestProperty("Authorization", "OAuth " + data); InputStreamReader isr = null; try { // 受信用ストリーム isr = new InputStreamReader(http.getInputStream(), "UTF-8"); } catch( Exception e ) { isr = new InputStreamReader(http.getErrorStream(), "UTF-8"); } // 受信 BufferedReader br = new BufferedReader(isr); String line_buffer; while ( null != (line_buffer = br.readLine() ) ) { // コマンドプロンプトに表示 result_string += line_buffer; } // 終了処理 br.close(); isr.close(); http.disconnect(); } catch( Exception e ) { result_string = "{\"errors\":\"unknown\"}"; } return result_string; } // ************************************************************** // 非同期処理終了後の処理( 画面へのアクセスが可能 ) // ************************************************************** @Override protected void onPostExecute(String result) { // Tweet メソッドの引数のインターフェイス内のメソッドを呼び出す OnSearchResult.onSearchResult(result); } }.execute(query,String.valueOf(count)); } private String rfc3986( String param ) { param = param.replace("+", "%20"); param = param.replace("*", "%2A"); param = param.replace("%7E","~"); return param; } private String dD(String param){ return "\""+param+"\""; } private String getNonce(){ Random random = new Random(); return String.valueOf(random.nextInt(1000000000)); } private String getTimeStamp(){ return String.valueOf(System.currentTimeMillis() / 1000L); } private String getSignature(String baseString){ String work = ""; work += _consumer_secret; work += "&"; work += _secret; String signature = ""; SecretKeySpec key = new SecretKeySpec(work.getBytes(), "HmacSHA1"); try { Mac mac = Mac.getInstance(key.getAlgorithm()); try{ mac.init(key); } catch(InvalidKeyException ike){ } byte[] rawHmac = mac.doFinal(baseString.getBytes()); signature = new String (Base64.encodeToString(rawHmac, Base64.NO_WRAP)); } catch(NoSuchAlgorithmException e){ } return signature; } }
※ リストビューの処理(MyListview.java) ソース全体
|
【Androidの最新記事】
- デバイスを探す / Find My Device - Google / Android Find
- JavaScript から Android へアクセス
- Monaca と 本当の 『Onsen UI最小限のテンプレート』
- Android 5.1 リリース済み。SDK( android-sdk_r24.0.2-windows.zip ) でまずエミュレータ作って、あとから Eclipse と Android Studio..
- クラウドでアプリを作成してスマホで動作させる『Monaca』を Android エミュレータの 5.1 で動作確認しました
- Android で Post と Get
- 別の ADT(Android) で作成されたワークスペースを最新の ADT で開く場合の操作方法
- トラブル : AndroidManifest.xml に XML 宣言があるとエラーになる???
- Twitter API の自分のアプリのトークンを使って投稿するだけの class Android_Twitter
- Android 単純リストビューを google-gson で最速構築
- Android をテストするのにほんの少し楽になるかもしれないクラス
- Android : Google Spreadsheets API version 3.0でGoogleスプレッドシートを参照
- Android 4.2.2(ADT) : class MyDatePicker extends DatePickerDialog
- Android : 日付ダイアログをインナーで使う( 完了ボタンをクリックした場合としない場合の対応 )
- Android(4.2.2) ADT から Post や Get をできるかぎり簡単にするサンプル
- Android ADT : 単純画面遷移
- HashMap の Key と Value をそれぞれソートして、最終的には 配列に変換して テンプレートを使って for ループを簡単に記述する
- ADT Eclipse : sysout テンプレートの変更
- Android(ADT Eclipse) 用 ボタンイベントテンプレート
- Android から Post 投稿 / HttpPostAndXml extends AsyncTask<Map, Void, Document>