ソースコード

package your.test;

import java.io.*;
import java.util.*;
import java.util.concurrent.*;

import android.app.*;
import android.content.*;
import android.hardware.*;
import android.os.*;
import android.os.PowerManager.*;
import android.util.Log;
import android.view.*;
import android.view.View.*;
import android.widget.*;

public class TestActivity extends Activity implements SensorEventListener {
    /** Called when the activity is first created. */

    private SensorManager mSensorManager ;
    private ScheduledExecutorService sla,sori,sgra,smag,srv;
	private Handler handler = new Handler();
	private Runnable la,ori,gra,mag,rv;
	private PowerManager pm;
	private WakeLock lock;
	protected boolean MODE;
	protected String type;
	protected float arg1,arg2,arg3;
	protected int temp_voltage;
    private int wait_la,wait_ori,wait_gra,wait_mag,wait_rv;
    int [] sCount=new int [6],swich=new int[6];
	int [][] temp = new int[6][3];
	private String str,item,path = android.os.Environment.getExternalStorageDirectory().getPath()+"/log.txt";
	private File file = new File(path);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //----------------------------------------------------------------------[[ インスタンス ]]

        mSensorManager = (SensorManager)this.getSystemService(SENSOR_SERVICE);	//センサマネージャ
        pm = (PowerManager)getSystemService(Context.POWER_SERVICE);        		//パワーマネージャ
        lock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My tag");		//ロックモード

        //----------------------------------------------------------------------[[ デフォルトサンプルレート ]]

        wait_la=1000*1;
        wait_ori=1000*1;
        wait_mag=1000*1;
        wait_gra=1000*1;
        wait_rv=1000*1;

        //----------------------------------------------------------------------[[ GUI部品 ]]

        Button 	button1 = (Button)findViewById(R.id.button1),					//STARTボタン
        		button2 = (Button)findViewById(R.id.button2),					//STOPボタン
        		button3 = (Button)findViewById(R.id.button3);
        Spinner spinner = (Spinner)findViewById(R.id.spinner1);					//行動タグ選択ボックス
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        adapter.add("walk");
        adapter.add("train");
        adapter.add("stop");
        adapter.add("operate");
        adapter.add("car");
        spinner.setAdapter(adapter);

        //----------------------------------------------------------------------[[ センサリスナー登録スレッド作成 ]]
        la=new Runnable(){
        	public void run(){
		    	registerListener(mSensorManager.getSensorList(Sensor.TYPE_LINEAR_ACCELERATION).get(0),mSensorManager);
		    }};
        ori=new Runnable(){
        	public void run(){
		    	registerListener(mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION).get(0),mSensorManager);
        	}};
        mag=new Runnable(){
        	public void run(){
		    	registerListener(mSensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD).get(0),mSensorManager);
        	}};
        gra=new Runnable(){
        	public void run(){
        		registerListener(mSensorManager.getSensorList(Sensor.TYPE_GRAVITY).get(0),mSensorManager);
        	}};
        rv=new Runnable(){
           	public void run(){
		    	registerListener(mSensorManager.getSensorList(Sensor.TYPE_ROTATION_VECTOR).get(0),mSensorManager);
           	}};

        //----------------------------------------------------------------------[[ リスナー登録 ]]

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        	// スピナーのアイテムが選択された時に呼び出されるコールバックリスナーを登録
            public void onItemSelected(AdapterView<?> parent, View view,int position, long id) {
                Spinner spinner = (Spinner) parent;
                // 選択されたアイテムを取得します
                item = (String) spinner.getSelectedItem();
            }
            public void onNothingSelected(AdapterView<?> arg0) {
            }
        });
        button1.setOnClickListener(new OnClickListener(){
        	//STARTボタンが押された時に呼び出されるリスナーを登録
			public void onClick(View v) {
				(new Thread(new Runnable(){
					public void run(){//センサー始動
		                lock.acquire();											//画面のパワーモードロック
		        		//----------------------------------------------------------------------[[一定周期でセンサリスナー登録]]
		        		sla=sori=sgra=smag=srv = Executors.newSingleThreadScheduledExecutor();
		        		sla.scheduleAtFixedRate(new Runnable(){public void run() {handler.post(la);}
		        		}, 0, wait_la,TimeUnit.MILLISECONDS);
		        		sori.scheduleAtFixedRate(new Runnable(){public void run() {handler.post(ori);}
		        		}, 0, wait_ori,TimeUnit.MILLISECONDS);
		        		sgra.scheduleAtFixedRate(new Runnable(){public void run() {handler.post(gra);}
		        		}, 0, wait_gra,TimeUnit.MILLISECONDS);
		        		smag.scheduleAtFixedRate(new Runnable(){public void run() {handler.post(mag);}
		        		}, 0, wait_mag,TimeUnit.MILLISECONDS);
		        		srv.scheduleAtFixedRate(new Runnable(){public void run() {handler.post(rv);}
		        		}, 0, wait_rv,TimeUnit.MILLISECONDS);
//		                MODE = true;											//アクティブモードON
					}
				})).start();
			}
        });
        button2.setOnClickListener(new OnClickListener(){
        	//STOPボタンが押された時に呼び出されるリスナーを登録
			public void onClick(View v) {
				(new Thread(new Runnable(){
					public void run(){//センサー停止
//						lock.release();										//画面のパワーリリース
						unregisterListener(mSensorManager);
						sla.shutdown();
						sori.shutdown();
						smag.shutdown();
						sgra.shutdown();
						srv.shutdown();
						MODE = false;
					}
				})).start();
			}
        });
        button3.setOnClickListener(new OnClickListener(){
        	//バッテリー監視ボタンが押された時に呼び出されるリスナーを登録
			public void onClick(View v) {
				(new Thread(new Runnable(){
					public void run(){//BatteryActivityに切り替え
						Intent i = new Intent(getApplicationContext() , BatteryActivity.class);
						startActivity(i);
					}
				})).start();
			}
        });
    }

    public void SensorObserver(){//センサー状態を監視
/*    	(new Thread(new Runnable(){
    		public void run(){

*1357197385*/    			StringBuffer sb = new StringBuffer();
    			TextView tv = (TextView)findViewById(R.id.textView3);

    			sb.append("TAG  :"+item+"\r\n");
                sb.append("TYPE  :"+type+"\r\n");
                sb.append("ARG1  :"+String.valueOf(arg1)+"\r\n");
                sb.append("ARG2  :"+String.valueOf(arg2)+"\r\n");
                sb.append("ARG3  :"+String.valueOf(arg3)+"\r\n");
                tv.setText(sb);
/*    		}
    	})).start();

*1357197386*/    }

    public void onResume(){
    	super.onResume();
//    	if(MODE){

    		//----------------------------------------------------------------------[[ バッテリー状態監視 ]]
    		IntentFilter filter = new IntentFilter();
    	    filter.addAction(Intent.ACTION_BATTERY_CHANGED);

    	    //----------------------------------------------------------------------[[ バッテリー状態監視 ]]
    	    SensorObserver();

      	}
//    }

    public void registerListener(Sensor s,SensorManager sm){//センサリスナー登録
		  sm.registerListener(this, s,SensorManager.SENSOR_DELAY_UI);
    }

    public void unregisterListener(SensorManager sm){//センサリスナー解除
		  sm.unregisterListener(this);
    }

    public void onPause(){
    	super.onPause();
    }

    protected void onDestroy() {
		super.onDestroy();
/*		sla.shutdown();
		sori.shutdown();
		smag.shutdown();
		sgra.shutdown();
		srv.shutdown();

*1357197387*/    	mSensorManager.unregisterListener(this);
	}

    public void onSensorChanged(SensorEvent event) {
    	mSensorManager.unregisterListener(this);//センサが値を取得した時点でリスナー解除
		if(event.values[0]*event.values[1]*event.values[2]!=0){
				//センサー別に値を取得。
//			synchronized(this){
				if(event.sensor.getType()==Sensor.TYPE_LINEAR_ACCELERATION && SensorCheck(1,(int)event.values[0],(int)event.values[1],(int)event.values[2]) && swich[1]==0){
//				if(event.sensor.getType()==Sensor.TYPE_LINEAR_ACCELERATION && swich[1]==0){
//					swich[1]=1;
					str = LogSet(event.values[0],event.values[1],event.values[2])+ "$LINEAR_ACCELERATION\r\n";
			//----------------------------------------------------------------------[[ センサー監視変数に同期 ]]
					type = "LINEAR_ACCELERATION";
					arg1 = event.values[0];
					arg2 = event.values[1];
					arg3 = event.values[2];

/*					new Thread(new Runnable(){
						public void run(){
							handler.post(new Runnable(){
								public void run(){

*1357197388*/									Log.v("Sensor", "LINEAR_ACCELERATION");
									OutputResult(str);
									swich[1]=0;
//						}});}}).start();
				}
				if(event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD && SensorCheck(2,(int)event.values[0],(int)event.values[1],(int)event.values[2])&& swich[2]==0){
//				if(event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD && swich[2]==0){
//					swich[2]=1;
					str = LogSet(event.values[0],event.values[1],event.values[2])+"$MAGNETIC_FIELD\r\n";
					//----------------------------------------------------------------------[[ センサー監視変数に同期 ]]
					type = "MAGNETIC_FIELD";
					arg1 = event.values[0];
					arg2 = event.values[1];
					arg3 = event.values[2];

/*					new Thread(new Runnable(){
						public void run(){
							handler.post(new Runnable(){
								public void run(){

*1357197389*/									Log.v("Sensor", "MAGNETIC_FIELD");
									OutputResult(str);
									swich[2]=0;
//						}});}}).start();
				}
				if(event.sensor.getType()==Sensor.TYPE_GRAVITY && SensorCheck(3,(int)event.values[0],(int)event.values[1],(int)event.values[2])&& swich[3]==0){
//				if(event.sensor.getType()==Sensor.TYPE_GRAVITY && swich[3]==0){
//					swich[3]=1;
					str = LogSet(event.values[0],event.values[1],event.values[2])+"$GRAVITY\r\n";

					//----------------------------------------------------------------------[[ センサー監視変数に同期 ]]
					type = "GRAVITY";
					arg1 = event.values[0];
					arg2 = event.values[1];
					arg3 = event.values[2];

/*					new Thread(new Runnable(){
						public void run(){
							handler.post(new Runnable(){
								public void run(){

*1357197390*/									Log.v("Sensor", "GRAVITY");
									OutputResult(str);
									swich[3]=0;
//						}});}}).start();
				}
				if(event.sensor.getType()==Sensor.TYPE_ORIENTATION && SensorCheck(4,(int)event.values[0],(int)event.values[1],(int)event.values[2])&& swich[4]==0){
//				if(event.sensor.getType()==Sensor.TYPE_ORIENTATION && swich[4]==0){
//					swich[4]=1;
					str = LogSet(event.values[0],event.values[1],event.values[2])+"$ORIENTATION\r\n";

					//----------------------------------------------------------------------[[ センサー監視変数に同期 ]]
					type = "ORIENTATION";
					arg1 = event.values[0];
					arg2 = event.values[1];
					arg3 = event.values[2];

/*					new Thread(new Runnable(){
						public void run(){
							handler.post(new Runnable(){
								public void run(){

*1357197391*/									Log.v("Sensor", "ORIENTATION");
									OutputResult(str);
									swich[4]=0;
//						}});}}).start();
				}
				if(event.sensor.getType()==Sensor.TYPE_ROTATION_VECTOR && SensorCheck(5,(int)event.values[0],(int)event.values[1],(int)event.values[2])&& swich[5]==0){
//				if(event.sensor.getType()==Sensor.TYPE_ROTATION_VECTOR && swich[5]==0){
//					swich[5]=1;
					str = LogSet(event.values[0]*10,event.values[1]*10,event.values[2]*10)+"$ROTATION_VECTOR\r\n";

					//----------------------------------------------------------------------[[ センサー監視変数に同期 ]]
					type = "ROTATION_VECTOR";
					arg1 = event.values[0];
					arg2 = event.values[1];
					arg3 = event.values[2];

/*					new Thread(new Runnable(){
						public void run(){
							handler.post(new Runnable(){
								public void run(){

*1357197392*/									Log.v("Sensor", "ROTATION_VECTOR");
									OutputResult(str);
									swich[5]=0;
//						}});}}).start();
				}
			}
		}
//    }

    public void OutputResult(String str){//出力形式判別モジュール
    	//保存するテキストを編集する。
    	StringBuffer sb = new StringBuffer();
    	sb.append(str);
    	//Wifiの受信状況を取得する
/*    	ArrayList<String>st = WifiAPChecker();
		if(st != null ){
			for(String string : st)
				sb.append(string);
		}*/
/*		if(CheckHttp())
			syncWeb(sb.toString());
		else

*1357197393*/			syncExtraStrage(sb.toString());
    }

    public boolean SensorCheck(int num,int x,int y,int z){//センサー値に変動があるか検査
    	double dev[]=new double[3];
    	switch(num){
    	case 1:
    		dev[0] = dev[1] = dev[2]=1;
    		break;
    	case 2:
    		dev[0] = dev[1] = dev[2]=10;
    		break;
    	case 3:
    		dev[0] = dev[1] = dev[2]=2;
    		break;
    	case 4:
    		dev[0] =40; dev[1] = 5; dev[2]=10;
    		break;
    	case 5:
    		dev[0] = dev[1] = dev[2]=1;
   		break;
    	default:
    		break;
    	}

    	if(Math.abs(temp[num][0]-x)>dev[0] || Math.abs(temp[num][1]-y)>dev[1] || Math.abs(temp[num][2]-z)>dev[2]){
    		temp[num][0]=x;
    		temp[num][1]=y;
    		temp[num][2]=z;
    		sCount[num]=0;
    		return true;
    	}else{
    		sCount[num]++;
    		return false;
    	}
    }

    public String LogSet(float x,float y,float z){//データ出力フォーマットを作成
		return //float値からshort値にキャストしてログ出力とする。
			"$"+
			String.valueOf(x)+","+
			String.valueOf(y)+","+
			String.valueOf(z);
    }

    public void syncExtraStrage(String str){
		FileOutputStream fos ;
			try {
				fos = new FileOutputStream(file,true);
				OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
				PrintWriter pw = new PrintWriter(osw);
				pw.append(item+"$"+
		    			String.valueOf(Calendar.getInstance().getTime().getMonth()+1) + ":"+
		    			String.valueOf(Calendar.getInstance().getTime().getDate()) + ":"+
		    			String.valueOf(Calendar.getInstance().getTime().getHours()) + ":"+
		    			String.valueOf(Calendar.getInstance().getTime().getMinutes()) + ":" +
		    			String.valueOf(Calendar.getInstance().getTime().getSeconds())+str);
				pw.close();
				osw.close();
				fos.close();
			} catch (FileNotFoundException e) {e.printStackTrace();}
			catch (UnsupportedEncodingException e) {e.printStackTrace();}
			catch (IOException e) {e.printStackTrace();}
    }

    //----------------------------------------------------------------------[[ 未使用メソッド ]]


/*	public void timeScheduler(){

		if(sCount[1]>2){
			wait_la = 1000*1;
			Log.v("timeScheduler",String.valueOf(sCount[1])+ "wait_la sleep");}
		else{
			wait_la = 1000*1;
			Log.v("timeScheduler", String.valueOf(sCount[1])+"wait_la wake");}
		if(sCount[2]>5){
			wait_mag = 1000*1;
			Log.v("timeScheduler", "wait_mag sleep");}
		else{
			wait_mag = 1000*1;
			Log.v("timeScheduler", "wait_mag wake");}
		if(sCount[3]>5){
			wait_gra = 1000*1;
			Log.v("timeScheduler", "wait_gra sleep");}
		else{
			wait_gra = 1000*1;
			Log.v("timeScheduler", "wait_gra wake");}
		if(sCount[4]>5){
			wait_ori = 1000*1;
			Log.v("timeScheduler", String.valueOf(sCount[4])+"wait_ori sleep");}
		else{
			wait_ori = 1000*1;
			Log.v("timeScheduler", String.valueOf(sCount[4])+"wait_ori wake");}
		if(sCount[5]>2)
			wait_rv = 1000*1;
		else
			wait_rv = 1000*1;

	}

/*    public boolean CheckHttp(){//通信可否判定
    	//-----[クライアント設定]
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://sgw-fky.ddo.jp/sensor_data.php");

        //-----[POST送信するデータを格納]
        List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
        nameValuePair.add(new BasicNameValuePair("check","check"));

        try {
            //-----[POST送信]
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePair,HTTP.UTF_8));
            HttpResponse response = httpclient.execute(httppost);
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            response.getEntity().writeTo(byteArrayOutputStream);
        	Log.v("httpcheck", "syncing now");

            //-----[サーバーからの応答を取得]
            if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) return true;
        	} catch (UnsupportedEncodingException e) {e.printStackTrace();}
        	catch (IOException e) {e.printStackTrace();}
		return false;
    }

    public void syncWeb(String str){//データをwebサーバにPOST送信
    	//-----[ログデータ取得]
		FileInputStream fis ;
		String s;

    	//-----[クライアント設定]
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://sgw-fky.ddo.jp/sensor_data.php");

        //-----[POST送信するストレージデータを格納]
        List<NameValuePair> nameValuePair2 = new ArrayList<NameValuePair>();
		try {
	    		fis = new FileInputStream(file);
	    		InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
	    		BufferedReader br = new BufferedReader(isr);
	    		while((s=br.readLine())!=null)
	    			nameValuePair2.add(new BasicNameValuePair("log",s+"\n"));
	    		//ストレージを削除
	    		file.delete();
	    		br.close();
	    		isr.close();
	    		fis.close();

	    		//-----[POST送信 - ストレージ]
	    		httppost.setEntity(new UrlEncodedFormEntity(nameValuePair2,HTTP.UTF_8));
	    		HttpResponse response2 = httpclient.execute(httppost);
	    		ByteArrayOutputStream byteArrayOutputStream2 = new ByteArrayOutputStream();
	    		response2.getEntity().writeTo(byteArrayOutputStream2);
	    		Log.v("syncWeb", "syncing now");
	    		//-----[サーバーからの応答を取得]
	    		if(response2.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {}
	    		else
	    			Toast.makeText(this, "[error]: "+response2.getStatusLine(), Toast.LENGTH_LONG).show();
		} catch (FileNotFoundException e) {e.printStackTrace();}
		catch (UnsupportedEncodingException e) {e.printStackTrace();}
		catch (IOException e) {e.printStackTrace();}

		//-----[POST送信する生データを格納]
        List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
        nameValuePair.add(new BasicNameValuePair("log",item+"$"+
    			String.valueOf(Calendar.getInstance().getTime().getDate()) + ":"+
    			String.valueOf(Calendar.getInstance().getTime().getHours()) + ":"+
    			String.valueOf(Calendar.getInstance().getTime().getMinutes()) + ":" +
    			String.valueOf(Calendar.getInstance().getTime().getSeconds()) + str));

        try {
            //-----[POST送信 - 生データ]
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePair,HTTP.UTF_8));
            HttpResponse response = httpclient.execute(httppost);
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            response.getEntity().writeTo(byteArrayOutputStream);
        	Log.v("syncWeb", "syncing now");
        	//-----[サーバーからの応答を取得]
            if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {}
            else
            	Toast.makeText(this, "[error]: "+response.getStatusLine(), Toast.LENGTH_LONG).show();

        }catch (UnsupportedEncodingException e) {e.printStackTrace();}
        catch (IOException e) {e.printStackTrace();}
    }

*1357197394*/

/*    public ArrayList<String> WifiAPChecker(){//Wifiのアクセスポイント一覧を取得
	WifiManager wManager = (WifiManager)getSystemService(WIFI_SERVICE);
    	if(wManager.getWifiState()==WifiManager.WIFI_STATE_ENABLED){
    		//APをスキャン
    		wManager.startScan();
    		//スキャン結果を取得
    		List<ScanResult> apList = wManager.getScanResults();
    		ArrayList<String> aps = new ArrayList<String>();
    		for(int i=0;i<apList.size();i++){
    			aps.add("#" + apList.get(i).SSID
    			+ apList.get(i).frequency + " MHz " + apList.get(i).level + "dBm\n");
    		}
    		return aps;
    	}else
    		return null;
    }

*1357197395*/



	public void onAccuracyChanged(Sensor arg0, int arg1) {
	}

}