2012年9月9日 星期日

目前進度



我們使用G-sensor程式撰寫"酒醉判定"
計畫是使用G-sensor之加速度來判定是否為酒駕
當加速度大於一定得數值並在短時間內累計三次則判定為酒駕
目前進度已完成項目:
1.      三軸重力之感測
2.      抓取三軸之數據
3.      抓取ROLL之最大值(g的最大值)
4.      時間的計時

以下為G-seneor部分程式


 @Override
     public void onCreate(Bundle savedInstanceState)//
     {                                                                              //保存當前的訊息or資料
          super.onCreate(savedInstanceState);              //

          /* 取得感測器服務 */
          mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        
          /* 註冊加速度監聽器,並可設定感測器類型及其它設定 */
          mSensorManager.registerListener(mSensorListener,
          mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
          SensorManager.SENSOR_DELAY_FASTEST);

          setContentView(R.layout.main);
          textview1 = (TextView)findViewById(R.id.text1);
          textview2 = (TextView)findViewById(R.id.text2);
          button_1=(Button)findViewById(R.id.button1);
          button_1.setOnClickListener(Handler);
         
     }
   
     private Button.OnClickListener Handler=new Button.OnClickListener()
     {
             public void onClick(View v)
             {    
                      startTime = System.currentTimeMillis();//取得目前時間
                      mHandlerTime.postDelayed(timerRun, 0);//計算目前已過秒數
             }
     };
    
     
     private final SensorEventListener mSensorListener = new SensorEventListener()
     {   
             
          public void onSensorChanged(SensorEvent se)
          {
                 
              x = se.values[0];
              y = se.values[1];
              z = se.values[2];
              NumberFormat nf = NumberFormat.getInstance();
              nf.setMaximumFractionDigits(2);
           
              textview1.setText("x: "+ nf.format(x) +", y: "+ nf.format(y) +", z: " + nf.format(z)+",max:"+nf.format(temp));
             
              if(z>temp)
                      {
                              temp=z;                            
                      }
                      System.out.print(temp);                                
          }         
       
          public void onAccuracyChanged(Sensor sensor, int accuracy)
          {
          }
     };
   
     @Override
     protected void onResume()
     {
          super.onResume();
          /* 註冊監聽器 */
          mSensorManager.registerListener(mSensorListener,
          mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
          SensorManager.SENSOR_DELAY_FASTEST);
     }
   
     @Override
     protected void onStop()
     {
      /* 註銷監聽器 */
          mSensorManager.unregisterListener(mSensorListener);
          super.onStop();
     }
    
       
     private final Runnable timerRun = new Runnable()
     {
       public void run()
       {
               Long spentTime = System.currentTimeMillis() - startTime;
               Long minius = (spentTime/1000)/60;
               Long seconds = (spentTime/1000) % 60;
               textview2.setText("time:"+minius+""+seconds+"");
               mHandlerTime.postDelayed(this, 1000);

       }
     };



androids計時

較直觀之timer寫法

public class MainActivity extends Activity  
  
  public class timerTask extends TimerTask   
timer.cancel();//停止timer

timer為一個子程式,在子程式中不能對UI進行布局更新,UI實行更新應該在主程式進行,所以利用handler可以作為中間傳遞,實現子程式對UI布局更新的控制。
所以HandlerRunnable方法,更加簡潔。


private Button.OnClickListener Handler=new Button.OnClickListener()
     {
             public void onClick(View v)
             {
                                   
  startTime = System.currentTimeMillis();//取得目前時間                      mHandlerTime.postDelayed(timerRun, 0);//計算目前已過秒數                      //mHandlerTime.removeCallbacks(timerRun);//設定定時要執行的方法                       
}    

{   

Timer timer = new Timer(true);

@Override   

public void onCreate(Bundle savedInstanceState)   

{     

super.onCreate(savedInstanceState);     

timer.schedule(new timerTask(), 1000, 1000);   

}

{     

public void run()     

{     

}   

}; 

}

private Button.OnClickListener Handler=new Button.OnClickListener()     

{             

public void onClick(View v)             

{                                

}     

}; 

private final Runnable timerRun = new Runnable()     

{       

public void run()      

{               

Long spentTime = System.currentTimeMillis() - startTime;               

Long minius = (spentTime/1000)/60;                

Long seconds = (spentTime/1000) % 60;                

textview2.setText("time:"+minius+""+seconds+"");              mHandlerTime.postDelayed(this, 1000);      

};



2012年8月31日 星期五

QR Code簡介


QR碼是二維條碼的一種,1994年由日本DENSO WAVE公司發明。QR來自英文「Quick Response」的縮寫,即快速反應的意思,源自發明者希望QR碼可讓其內容快速被解碼。QR碼最常見於日本,並為目前日本最流行的二維空間條碼。QR碼比普通條碼可儲存更多資料,亦無需像普通條碼般在掃描時需直線對準掃描器。
QR碼的基本格式

QR碼呈正方形,只有黑白兩色。在3個角落,印有較小,像「回」字的的正方圖案。這3個是幫助解碼軟體定位的圖案,使用者不需要對準,無論以任何角度掃描,資料仍可正確被讀取。
QR code有容錯能力,QR碼圖形如果有破損,仍然可以被機器讀取內容,最高可以到7%~30%面積破損仍可被讀取。相對的,容錯%愈高, QR code 圖形面積愈大。所以一般折衷使用15%容錯能力。
RFID相比感應的距離較長,使用及設定上也較方便。RFID需有感應裝置而QR Code只需擁有鏡頭即可使用。