これからWebにユーザーのデータを記録していくプログラムを作成します。 スマートフォントとWebとの交信プログラムについては書籍やネット検索で得たプログラム を予備的に試行しましたが、最もうまくいきそうなものを選びました。 まず、スマートフォントとWebとの交信用のクラスファイルを二つ作成します。 HPostTask.classとPHandler.classです。 HPostTaskは次の通りです。AsyncTaskクラスを継承します。 package kureishi.example.nationaldefence; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.ResponseHandler; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; public class HPostTask extends AsyncTask { // 文字コードの設定です。 private String request_encoding = "UTF-8"; private String response_encoding = "UTF-8"; // 初期化しておきます private Activity parent_activity = null; private String post_url = null; private Handler ui_handler = null; private List post_params = null; private ResponseHandler response_handler = null; private String http_err_msg = null; private String http_ret_msg = null; private ProgressDialog dialog = null; public HPostTask( Activity parent_activity, String post_url, Handler ui_handler ){ this.parent_activity = parent_activity; this.post_url = post_url; this.ui_handler = ui_handler; post_params = new ArrayList(); } public void addPostParam( String post_name, String post_value ){ post_params.add(new BasicNameValuePair( post_name, post_value )); } protected void onPreExecute() { // ダイアログを表示 dialog = new ProgressDialog( parent_activity ); dialog.setMessage("通信中です"); dialog.show(); response_handler = new ResponseHandler() { // HTTPレスポンスから,受信文字列をエンコードして文字列として返す @Override public Void handleResponse(HttpResponse response) throws IOException { Log.d( "posttest", "レスポンスコード:" + response.getStatusLine().getStatusCode() ); switch (response.getStatusLine().getStatusCode()) { case HttpStatus.SC_OK: Log.d("posttest", "レスポンス取得に成功"); HPostTask.this.http_ret_msg = EntityUtils.toString( response.getEntity(), HPostTask.this.response_encoding ); break; case HttpStatus.SC_NOT_FOUND: // ファイルがないとき Log.d("posttest", "存在しない"); HPostTask.this.http_err_msg = "404 Not Found"; break; default: Log.d("posttest", "通信エラー"); HPostTask.this.http_err_msg = "通信エラーが発生"; } return null; } }; } // メイン処理です。 protected Void doInBackground(Void... unused) { Log.d("posttest", "postします"); // URL URI url = null; try { url = new URI( post_url ); Log.d("posttest", "URLはOK"); } catch (URISyntaxException e) { e.printStackTrace(); http_err_msg = "不正なURL"; return null; } // パラメータ付きでPOSTリクエストを作成 HttpPost request = new HttpPost( url ); try { // 送信パラメータのエンコード変換 request.setEntity(new UrlEncodedFormEntity(post_params, request_encoding)); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); http_err_msg = "不正な文字コード"; return null; } // POSTリクエスト DefaultHttpClient httpClient = new DefaultHttpClient(); Log.d("posttest", "POST開始"); try { httpClient.execute(request, response_handler); } catch (ClientProtocolException e) { e.printStackTrace(); http_err_msg = "プロトコルのエラー"; } catch (IOException e) { e.printStackTrace(); http_err_msg = "IOエラー"; } // shutdownすると通信できなくなる httpClient.getConnectionManager().shutdown(); return null; } // タスクを終了する時 protected void onPostExecute(Void unused) { // ダイアログを消す dialog.dismiss(); // 受信結果をUIに渡すためにまとめる Message message = new Message(); Bundle bundle = new Bundle(); if (http_err_msg != null) { // エラー発生時 bundle.putBoolean("http_post_success", false); bundle.putString("http_response", http_err_msg); } else { // 通信成功時 bundle.putBoolean("http_post_success", true); bundle.putString("http_response", http_ret_msg); } message.setData(bundle); ui_handler.sendMessage(message); } } PHandlerは次の通りです。 package kureishi.example.nationaldefence; import android.os.Handler; import android.os.Message; public abstract class PHandler extends Handler { public void handleMessage(Message msg) { boolean isPostSuccess = msg.getData().getBoolean("http_post_success"); String http_response = msg.getData().get("http_response").toString(); if( isPostSuccess ) { onPostCompleted( http_response ); } else { onPostFailed( http_response ); } } public abstract void onPostCompleted( String response ); public abstract void onPostFailed( String response ); } なんだか良くわかりませんが、目的を達成するときのツールです。 次にInfoActivityにメッソドonClickSendを追加します。これがWebとの交信プログラムです。 交信するWebのURLを忘れないように。 package kureishi.example.nationaldefence; import java.io.*; import java.util.*; import android.app.Activity; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.provider.ContactsContract; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import android.util.SparseBooleanArray; import android.widget.Toast; public class InfoActivity extends Activity { public String[] listSample; public ArrayList mail =new ArrayList(); public String[] nickName; public ArrayList nick =new ArrayList(); public String[] listSample_1; private ListView listView; private TextView text; public String URL_PAGE= "http://upupup.kir.jp/........";//接続するファイル名を追記 String str=""; public String mailAddress; public String mailAddress_1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.info); Intent intent=getIntent(); mailAddress=intent.getStringExtra("mailAddress"); //本人のメールメールアドレスの記入がない時の処理追加 if(mailAddress.length()>8 ){ mailAddress_1="発信::"+mailAddress; text=(TextView)findViewById(R.id.textView5); text.setText(mailAddress_1); }else{ return; } //ここまで ContentResolver resolver = getContentResolver(); Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); while(cursor.moveToNext()){ String contactsId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); String contactsMail = ""; String contactsName = ""; Cursor cMail = resolver.query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ? ", new String[]{contactsId}, null); while(cMail.moveToNext()) { contactsMail = cMail.getString(cMail.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA1)); contactsName = cMail.getString(cMail.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); mail.add(contactsMail); nick.add(contactsName); } cMail.close(); } listSample=new String[mail.size()-1]; for(int i=0;i"+listSample[i];//友人の名前と //メールアドレスを<>つなぎにする } listView = (ListView)findViewById(R.id.ListView10); // アダプタの作成 ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_multiple_choice,nickName); listView.setAdapter(adapter); } //ここから追加メソッド public void onClickSend(View v){ SparseBooleanArray checked = listView.getCheckedItemPositions(); //チェックした友人のデータを取得しています for (int i = 0; i < checked.size(); i++) { if(checked.valueAt(i)){ int key = checked.keyAt(i); str=str+listSample_1[key]+",";//「,」つなぎで文字列にする } } //チェックボックスにチェックをしなかったときの処理も作成 if(str!=""){ exec_post(); }else{ Toast.makeText(getApplicationContext(),"友人リストを選択して下さい", Toast.LENGTH_SHORT).show(); return; } } private void exec_post() { // 先に作成したクラスファイル(非同期タスクを定義) HPostTask task = new HPostTask( this, URL_PAGE, // 先に作成したクラスファイル(タスク完了時に呼ばれるUIのハンドラ) new PHandler(){ @Override public void onPostCompleted(String response) { // 受信結果をTextView5に表示 text.setText( response ); } @Override public void onPostFailed(String response) { text.setText( response ); } } ); //本人メールアドレスをWebに task.addPostParam( "key",mailAddress); //友人のメールアドレスWebに task.addPostParam( "value", str); // 実行 task.execute(); } public void onClickTouroku(View v){ Intent intent=new Intent(InfoActivity.this,TourokuActivity.class); startActivity(intent); } public void onClickCancel(View v){ Intent intent=new Intent(InfoActivity.this,DefenceActivity.class); startActivity(intent); } } スマートフォンから送信されてくるリクエストを受け取るためWeb上には次のPHPファイルとデータベースを作成しておきます。 を作成しました。文字コードはすべてUTF-8に統一しました。 PHPファイルは次の通りです。 で文字列の結合 $data=$data_count."<>".$date_in ." ".$time_in."<>".$_POST["key"]."<>".$data_1."\r\n"; array_unshift($lines,$data);//新規データの配列への追加 } //新規データを追加した配列をデータベースに書き込み $ff=fopen("smartphone_data.dat","w"); for($j=1;$j",$aa[$i]); echo "TO::".$aaa[0]."\r\n"; } ?> 以上でスマートフォンには左の写真のように登録した友人のデータが表示されます。 データベースには下記の様にデータが蓄積されていきます。実際のメールアドレスを 書くのはまずいのでチョッとデータを改ざんしてあります。 10<>2014/10/01 09:01:09<>upupup@kagoya<>?????<>??????@docomo.ne.jp 9<>2014/10/01 09:01:09<>upupup@kagoya<>????<>?????y@ezweb.ne.jp 8<>2014/10/01 09:01:09<>upupup@kagoya<>????<>????@ezweb.ne.jp 8<>2014/10/01 08:51:02<>upupup@kagoya<>????<>?????@ezweb.ne.jp 8<>2014/10/01 08:50:01<>upupup@kagoya<>????<>????@docomo.ne.jp 8<>2014/10/01 08:49:10<>upupup@kagoya<>りりさん<>????@ezweb.ne.jp 7<>2014/10/01 08:49:10<>upupup@kagoya<>???<>???@ezweb.ne.jp 6<>2014/10/01 08:49:10<>upupup@kagoya<>???<>????@docomo.ne.jp