Galaxy Nexus 購入了算是第二天!
玩了兩天,來PO點心得!
到底Android 4.0 ICS和先前Android 2.3以下的裝置,到底有甚麼差別!
以及介紹ICS比較特殊的地方!
這邊拿Nexus One做比較! (恩,都原生機! 這樣才有比較介面差別的意義!)
底下的照片主要是拿參加GOOGLE ADL送的Flyer拍的...
畫質有點差,有些我沒有對焦,但能表達我要表達的意思就好了~"~
側面照,其實Nexus One(上),比較厚! 以重量來說,Nexus One也比較重! 跟外殼材質也有相關! 畢竟Galaxy Nexus(下)並不是用金屬材質,但老實說,我還是覺得Nexus One摸起來的質感比較好!
接著來看Nexus One和Galaxy Nexus在我手上的樣子,因為不少人擔心Galaxy Nexus螢幕很大,一手無法掌握!!!
恩,我在男生中的手算大了,算是可以一手hold住Galaxy Nexus,
但老實說要一手Key 文字,跟Nexus One比起來,的確會有點ㄍㄧㄥ。
下面是圖片,可以看一下實際拿起來的樣子!
用右手拿Galaxy Nexus
要去點最左邊的ㄅ鍵時,跟Nexus One相比,的確有點點ㄍㄧㄥ,更別說要碰到左上角了!
下面是拿Nexus One的樣子
恩,相較起來,Nexus One在我手中變小好多XD 應該是A CUP(誤)
可以看到我輕易地碰到ㄅ鍵,也可以輕易地碰到左上角!
下面要介紹ICS比較特別之處!!!
記得Android 2.3以下的裝置,想要擷取手機畫面,必須用Android SDK裡面的DDMS去擷取嗎? 這對一個不懂技術的人來說,的確是一大門檻! 而iPhone就不用,iPhone可以輕易地擷取手機畫面!
但是!!!!! Android 4.0 ICS 有了這項功能了!!!!!!
只要同時按下音量減少鍵(手機左方),以及電源鍵(手機右方)
下面是操作圖
按下手機音量減少鍵(手機左方)
以及同時按下手機電源鍵(手機右方)
同時按下以後,就會出現此圖,白色框框裡面就是你擷取的圖!! 此範例是擷取我的桌面XD 是Amanda Seyfried!!!!!!!!!!! >//////<
接下來要介紹ICS!!!
看到上圖有三個框框,紅、橘、藍!
紅色框框是Android 2.3以下裝置沒有的!這是虛擬鍵盤,從左到右,分別是BACK, Home, Task,在Android 2.3以下的手機上面,通通都有實體按鍵(BACK,Home,Menu,Search),偏偏這幾種按鍵,每一家廠商都放得不一樣,有些可能是HOME先,有些可能是BACK先,有些還沒有SEARCH,某支手機還很智障設置了facebook的按鍵..................... 老實說,這對Android系統來說,不是件好事,這樣的usability非常不好!!!! 拜託別荼毒這些end user,end user只會覺得,【靠,android很爛耶,怎都亂擺】! 殊不知,這些都是那些廠商搞得鬼.......所以ICS直接內建了虛擬按鍵,我想就是為了解決這些第三方廠商不統一設置按鍵的問題吧!
(咦? 我很納悶,現在有實體鍵盤的裝置,將來要更新ICS時,那...不就有兩個鍵盤了嗎? 不過說不定這些廠商又去改Android Kernel,又把虛擬鍵盤改掉.....)
橘色框框算是navigation bar了,有用過iPhone的都知道,使用者可以將APP拖曳到下方,這樣可以方便我們快速使用,現在ICS也有了! 等等會有圖說明!
藍色框框,哈! 我覺得這是ICS很失敗的地方耶! 這塊是search bar....是不能刪除的== 它永遠都在那!!
這張圖,我們可以看到,我可以將APP拖曳到下方的navigation bar,方便我們快速使用!!! 超方便! 但可惜只能放四個!
喔,對了,iPhone有分類的功能,就是可以將2個以上的app放在一個資料夾裡面,現在ICS也有了!!! 可以看到這張圖,我把一個名稱為Utility的資料夾,放在navigation bar裏頭!! 點開以後就是圖中的樣子!!
可以看到這張圖的桌面,我就放了三個資料夾
點開某一個,展開來就是長這樣
喔,對了,上面有講到Task這個按鍵,在虛擬鍵盤中的最右方,它的作用就是,點了你可以看到最近執行過的程式!!!!
用的這幾天,我對ICS還算滿意瞜!!! 至少我很愛它的分類和navigation bar功能!!!
可能是桌面是Amanda Seyfried...也因此讓我更愛它吧!(誤)
嘿!期待已久的Galaxy Nexus終於入手了!
下面是開箱文喔! 相片是拿我去參加Google ADL送的Flyer照的!
最後還有臉部解鎖的影片 (解鎖很快!!)
手機盒子,和贈送的Android公仔盒子
打開以後才發現,裡面還有一個盒子,且竟然是第一代的
在打開才發現,這隻我已經有了! 囧
手機正面照
手機背面照! 好有質感
配件(電池,耳機,USB傳輸線)
電池轉接頭
拿在手上的樣子,原本以為會太大! 發現也還好!
開機照
開機比N1快多了
和它爺爺(Nexus One)的合照! 莫名感傷
下面是臉部解鎖的影片! 解鎖很快! 不到一秒鐘!
最後可以來
這篇看我的使用心得
在Android實作(模擬)一個form,
不管method是用POST或者GET傳遞普通參數(type="text/password/hidden"),都很簡單!
那要傳遞type="fiile"的呢?
也就是說要上傳一個檔案呢?
在Android裡面就稍嫌複雜了一點點點點!
這篇將會結合使用camera,將上傳照相完以後的相片!
至於怎麼
取得camera的照完相的照片,可以去看我先前PO的教學!
來這看!這邊就不多說怎麼取得,就假設已經取得照片了!
我們知道在HTML裡,要上傳含有file的參數,
<form>必須加上enctype="multipart/form-data"
在實作之前,必須說明一下發出這個form的request的格式會怎樣!
--==============
Content-Disposition: form-data; name="image"; filename="image.jpg"
Content-Type: image/jpeg
!@#!FAWE@#$!A=fj2j12r
--==============--
第一行是--==============,是由--加上boundary組成的
boundary很重要! 是用來區隔參數的!!
也就是說,如果裡有很2個參數,
那這2個參數前面都會有這一行!!!
對了,boundary可以自己設定,但是前提是要告訴server你的boundary是甚麼!
等等會說明到! 這裡的boundary假設是===========
第二行Content-Disposition: form-data; name="image"; filename="image.jpg"這是宣告你的參數名稱,以及他的當案名稱
第三行Content-Type: image/jpeg是宣告你的file是甚麼型態,因為我們這邊是拿圖片說明,
所以就是jpeg。
第四行是空白行,在你寫入參數之前,前面一定是一行空白行
第五行!@#!FAWE@#$!A=fj2j12r這行就是資料行了,開始寫入資料,因為是上傳圖片,
所以這樣看一定是亂碼!
如果今天type不是file,是text,
那麼就會是明文!
第六行--==============--最後一個參數傳遞完,一定要加上這一行,
告訴server,傳完了!
了解格式後,現在就來實作,
而在Android的實作如下,
// 先取得圖片
// uriFilePath是當初設定照相完,要存在哪
// 如果忘記可以去看文章上面說的教學文
FileInputStream fileInputStream = new FileInputStream(new File(uriFilePath.getPath()));
final String BOUNDARY = "==================================";
final String HYPHENS = "--";
final String CRLF = "\r\n";
URL url = new URL("http://xxx.xxx.xxx/uploadImage");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST"); // method一定要是POST
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 把Content Type設為multipart/form-data
// 以及設定Boundary,Boundary很重要!
// 當你不只一個參數時,Boundary是用來區隔參數的
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
// 下面是開始寫參數
String strContentDisposition = "Content-Disposition: form-data; name=\"image\"; filename=\"image\"";
String strContentType = "Content-Type: image/jpeg";
DataOutputStream dataOS = new DataOutputStream(conn.getOutputStream());
dataOS.writeBytes(HYPHENS+BOUNDARY+CRLF); // 寫--==================================
dataOS.writeBytes(strContentDisposition+CRLF); // 寫(Disposition)
dataOS.writeBytes(contentType+CRLF); // 寫(Content Type)
dataOS.writeBytes(CRLF);
int iBytesAvailable = fileInputStream.available();
byte[] byteData = new byte[iBytesAvailable];
int iBytesRead = fileInputStream.read(byteData, 0, iBytesAvailable);
while (iBytesRead > 0) {
dataOS.write(byteData, 0, iBytesAvailable); // 開始寫內容
iBytesAvailable = fileInputStream.available();
iBytesRead = fileInputStream.read(byteData, 0, iBytesAvailable);
}
dataOS.writeBytes(CRLF);
dataOS.writeBytes(HYPHENS+BOUNDARY+HYPHENS); // (結束)寫--==================================--
file.close();
dataOS.flush();
dataOS.close();
這樣完成了!!