Thursday, February 26, 2009

android location

locationListener.onLocationChanged
當作標改變的時候會觸發事件,但是當location設備傳進相同的座標位置時,不會觸發此事件。
locationListener.onProviderDisabled
當location的設備被關閉時,觸發此事件。相反的就是onProviderEnabled
locationListener.onStatusChanged
location設備的狀態改變時,觸發此事件。共有三個狀態,location連線、location離線、location暫時離線。

得到座標的方式可以從LocationManager得到目前裝置有幾個LocationProvider,再從連線狀態的LocationProvider抓到座標資訊Location,再從Location中抓取座標經緯度或高度等其他資訊。

LocationManager locationManager;

locationManager = (LocationManager)this.getSystemService(Activity.LOCATION_SERVICE);

locationManager.requestLocationUpdates("gps", 5000, 1000, new LocationListener(){
@Override
public void onLocationChanged(android.location.Location location) {
Log.v("GPSTest", " gps onLocationChanged:"+location.getLatitude());

}

});

locationListener還有幾個方法要實作出來才行compile,這邊只列出跟抓取經緯度有關的程式碼。 另外在程式執行時,onProviderEnable事件被觸發時,表示gps的設備尚未開啟,想把介面用intent帶到android的設定頁面,程式碼如下:
startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));

Tuesday, February 24, 2009

XMLHttpRequest的411 length required錯誤訊息

在IIS 6.0的環境下,當使用XMLHttpRequest傳送訊息的時候,若訊息為空的話,需要特別註明傳送""(空字串),無法只傳送null。例如下面程式在IIS 6的環境下會有411的錯誤
xmlReq = new XMLHttpRequest();
xmlReq.open('POST', url, true);
xmlReq.send(null);

這個程式在IIS 5測試是正常可以work,在IIS6 則會出現411,其他http server則沒有測試。若不傳送訊息的話,則需要改成下列程式

xmlReq = new XMLHttpRequest();
xmlReq.open('POST', url, true);
xmlReq.send("");

如果有傳送內容的話,則在 ii5, iis6都可以正常執行。

Friday, February 20, 2009

signed apk

在發布程式至android market前程式需要使用jarsigner 加入認證,jarsigner是JDK提供的工具,至於apk的產生,在eclipse中執行run之後就會產生在專案底下的/bin中。
先建立一個目錄keytools,以及子目錄keytools/keys

D:\java\keytools>keytool -genkey -alias kkk.android.demo.location -keyalg RSA -v

alidity 20000 -keystore keys/location.keystore
輸入 keystore 密碼: password
您的名字與姓氏為何?
[Unknown]: liu
您的編制單位名稱為何?
[Unknown]: org
您的組織名稱為何?
[Unknown]: org
您所在的城市或地區名稱為何?
[Unknown]: taipei
您所在的州及省份名稱為何?
[Unknown]: TW
該單位的二字國碼為何
[Unknown]: TW
CN=liu, OU=org, O=org, L=taipei, ST=TW, C=TW 正確嗎?
[否]: 是

輸入 <kkk.android.demo.location> 的主密碼
(RETURN 如果和 keystore 密碼相同):

會產生keytools/keys/location.keystore。-v alidity是認證時間,market上需要25年的有效認證期間。
建立完key之後,要把這個key嵌入apk中,用jarsigner
D:\java\keytools>jarsigner -verbose -keystore keys\location.keystore -signedjar

Location_singned.apk Location.apk kkk.android.demo.location
Enter Passphrase for keystore: password
adding: META-INF/MANIFEST.MF
adding: META-INF/KKK_ANDR.SF
adding: META-INF/KKK_ANDR.RSA
signing: res/drawable/icon.png
signing: res/layout/main.xml
signing: AndroidManifest.xml
signing: resources.arsc
signing: classes.dex

之後在keytools/目錄下會產生Location_singned.ask,完成。

android的log訊息

android.util.log這個類別提供了輸出log的功能,在程式中加入

Log.v("TAG", "logMessage");
即可在DDMS的console看見輸出的訊息。

log的類別分為

  • Log.e()----錯誤(error)

  • Log.w()----警告(warn)

  • Log.i()------資訊(info)

  • Log.d()------除錯debug

  • Log.v()-----多餘verbose


不同的類別除了在DDMS中會顯示不同的顏色以利區別外,再編譯與記憶體配置上也有所不同。verbose只會在開發環境才被編譯,debug雖然會被編譯但是在非開發環境下則不會執行,error, warning, info都是會被編譯與執行。

Wednesday, February 18, 2009

手動安裝linux下的驅動程式

找到的驅動程式包裝成.img檔,先mount起來才能讀取其中的檔案
#mount -o loop rr154x-rhel-4-i386.img  ./

解壓縮modules.cgz這個檔案,裡面包含驅動模組
#gzip -dc /modules.cgz | cpio -idumv

找到與目前kernal相對應的驅動程式版本
#uname -r  //找目前的kernel版本
#cd 2.6.9-5.EL/i686

安裝驅動模組,模組可能有相依性,須照順序安裝
#modprobe sd_mod //先安裝sd_mod這個模組
#insmod hpt374.o

驅動程式安裝成功後,就可以使用新增的硬體了,但是每次重開機後,都必須在安裝驅動程式一次。為了不要這麼麻煩,把驅動程式放入核心。
#install -c hpt374.o /lib/modules/'uname -r'/kernel/drivers/scsi //把編譯完的驅動程式複製到kernel中
#depmod //檢查相依性,並把相依性更新至/lib/modules/'uname -r'/modules.dep

放入核心之後,在通知系統在開機的時候要執行的指令
#echo "modprob hpt374" > /etc/init.d/hptdriver  //如果有相依性的話,也要在這邊寫入
#chmod 755 /etc/init.d/hptdriver
#ln -sf /etc/init.d/hptdriver /etc/rc.d/rc3.d/S01hptdriver
#ln -sf /etc/init.d/hptdriver /etc/rc.d/rc4.d/S01hptdriver
#ln -sf /etc/init.d/hptdriver /etc/rc.d/rc5.d/S01hptdriver

Tuesday, February 10, 2009

android 的 adb指令

透過adb可與android模擬器或是android device作溝通

  • adb devices 
    列出目前的連線的devices。emulator-5554表示為模擬器,連接port為5554。HT850GZ01053為設備的sn。連接至device的話,須要先安裝android_usb_driver。
  • adb -s <serial number>
    指定連接上哪一個裝置,若目前只有一個連接裝置,則可不需要設定。
  • adb -d 
    指定連接上實體的device,如果實體device只有一個的話,就可使用。
  • adb -e
    指定連接上 模擬器, 如果模擬器超過一個的話,則需要用-s 來指定是哪一個模擬器。
  • adb shell
    進入模擬器或是device的shell,可執行符合權限內的指令。目前G1 RC30的版本需要downgrad到RC29才能得到root的權限,可參考Root_For_RC30。拿到root權限後可開啟telnetd,由PC上透過telnet也可以連進去G1的shell。
  • adb shell monkey
    用來產生隨機事件,可以對程式介面進行測試用。例如:monkey -v -p com.adroid.demo.notepad3 100 會在notepad3產生100個隨機事件,並列出事件的處理訊息。
  • adb install <xxxx.apk>
    安裝指定的apk至連接的裝置。相對應的指令為adb uninstall

 

android進入資料庫方法

notepad範例中的資料庫擺放位置為 /data/data/com.android.demo.notepad2/databases/data,開啟方法為進入shell後,執行 sqlite3 /data/data/com.android.demo.notepad2/databases/data 開啟資料庫後,可執行 .help開啟操作指令說明。

Friday, February 6, 2009

android 幾個常用class

  • Intent
    可透過startActivity()用來啟動Activity。或透過broadcastIntent()把intent傳送到BroadcastReceiver中,並藉由startService(intent)與在背景執行的Service。
    Intent可以提供不同的application之間的聯繫,例如在一個activity中啟動另外一個activity,切換畫面也是用Intent來呼叫不同的畫面
    Intent常見的屬性有兩個,action以及category。action用來描述activity的的行為別,常見的值有MAIN or EDIT等。category是用來描述activity的類別,常見的值有LAUNCHER。 Intent的屬性可以寫在manifest.xml中的<intent filter>
    Intent在聯繫不同的activity時,可以透過putExtra傳遞需要互通的資料。
    google文件
  • Activity
    最常見的class,與使用者互動的視窗就是由這個類別負責,啟動activity會觸發onCreate(),離開activity時會觸發onPause()。activity的各個狀態可以參考activity lifecycle
  • Bundle
    一種類似hashtable的儲存結構,提供許多存取的method。當Intent傳遞資訊的時候,可以使用Bundle來封裝資料。
  • android.widget
    這個package裡面包含重要的外觀介面的元件,例如Button, TextView, RadioButton等。
  • 常見的layout
    有Absolutelayout, AdapterView, Framelayout, Linearlayout, mapView, Relativelayout等。都是繼承自android.view.viewGroup這個類別。

Thursday, February 5, 2009

android activity生命狀態

activity執行中會經過不同的狀態,例如啟動、暫停等。以下就不同的狀態會觸發的事件紀錄一下

  • onSaveInstanceState
    當activity因為記憶體不足時被android停止時就會觸發(此時onDestroy也會被觸發),或是使用者切換activity等 activity停止時也會觸發,會儲存目前的狀態。
  • onPause
    離開該activity時、設定改變(screen orientation, language, input devices)被觸發,但是該actiity仍存在記憶體中,尚未被釋放記憶體空間。
  • onResume
    由pause的狀態回復到執行的狀態被觸發,也就是目前使用者互動的狀態。
  • onCreate
    activity第一次被執行時會被觸發。
  • onStop
    離開該activity時、設定改變(screen orientation, language, input devices)被觸發
  • onDestroy
    離開該activity時、設定改變(screen orientation, language, input devices)被觸

Monday, February 2, 2009

aspx轉excel, word

Word
Response.AddHeader("content-disposition", "attachment;filename=KS-0-9602.doc")
Response.ContentType = "application/vnd.ms-word"

excel
Response.AddHeader ("Content-Disposition", "attachment; filename=KS-0-9602..xls")
Response.ContentType = "application/ms-excel"

加上 style="mso-number-format:" 以指定excel中資料的格式,以下把數字轉為文字
<td style="mso-number-format: @">0121111</td>