2013年12月13日 星期五

[Android]使用ScorllView解決裝置解析度差異過大問題

解決裝置解析度差異過大問題

Android裝置相容性問題,最常遇到的就是不同的螢幕解析度,因此官方文件建議Layout上使用的距離單位盡量使用dp,能部分解決多解析度上的問題,但裝置的解析度差異過大時,還是會出現操作介面上的缺陷,雖然在這種情況下要兼顧介面美觀會有困難,但至少要維持操作上不能有缺陷,評估這樣的原則,因此選擇使用ScrollView來解決解析度相容性的問題,雖然不能保有一致美觀,但至少不會有功能上的缺陷。


以Login畫面為例,處理解析度上的問題。
如下圖為高解析度裝置顯示的畫面,介面完整顯示,功能操作上正常。



[Android]操作鍵盤,造成畫面元件擠壓的問題

操作鍵盤,造成畫面擠壓問題

在Android畫面要輸入資訊時,會彈出模擬鍵盤,此時可能造成畫面擠壓,讓背景或元件變形,解決方法是在AndroidManifest.xml中,將輸入畫面的activity加入:

android:windowSoftInputMode="adjustPan"


如此一來就能解決這樣的狀況。

2013年12月11日 星期三

Google Analytics SDK for Android v3(一)-使用EasyTracker

開發Web系統的人,一定知道Google Analytics工具,Google Analytics提供Web SDK,開發人員者將程式碼埋在各功能或頁面中,取得使用者回饋,上傳至Google Analytics平台上,再進一步分析使用者的行為,讓系統設計師,利用此依據來改善系統的設計,Google Analytics也提供了Android的SDK,讓Android開發者也可以很容易的分析使用者的行為,以下是Android App 加入 Google Analytics步驟說明:

2013年9月1日 星期日

[Android]改變Layout發生後,卻ClassCastException的問題

在開發Android APP的過程中,有時候因為需求改變,常常需要改變元件的位置,在改變XML的Layout後,重新build App,卻發生 java.lang.ClassCastException,只動Layout的位置,沒有新增或刪除,卻發生ClassCastException,要解決此狀況,只要在Eclipse中執行clean可以解決這個問題 。

解決方法:

STEP1 :Eclipse選取 Project選項,執行Clean

STEP2: 重新執行Run As -> Android Application

如果Layout的設計沒有問題的話,就不會發生ClassCastException的例外錯誤了。

2013年8月30日 星期五

[Android] 錯誤排除 :Activity ActivityName has leaked window ...

Window Leaked

Activity ActivityName has leaked window ...若出現類似的錯誤訊息,代表Window Leaked的錯誤發生,Window Leaked通常是因為有Dialog或其他元件還在執行,但Activity已經被關閉了。

常見的情境:
  • 1. Dialog或其他元件還在執行,但此時使用者將螢幕翻轉,造成Activity重新執行,就會造成Window Leaked
  • 2. Dialog或其他元件還在執行,使用者將Activity關閉。

[Android] 手動處理螢幕翻轉


Android系統中,當畫面翻轉時,預設會將Activity重新載入,但每次都重新載入程式效率似乎不太好,且某些情況可能會造成異常發生,如Activity啟動一個Dialog去執行某些操作時,使用者在此時將螢幕翻轉,會造成發生錯誤,要避免此情況,就要手動處理螢幕翻轉,處理步驟如下:

2013年7月22日 星期一

2013年7月17日 星期三

SSL憑證建立

SSL憑證建立


主要分為兩個流程Server憑證建立流程,和Client憑證建立流程,Server建立流程會產生Server的私鑰和Client的公鑰。Client憑證建立流程,則會產生Client的私鑰和Server的公鑰。

2013年7月8日 星期一

Ubuntu Server 安裝GUI

1.修改 /etc/network/interfaces
這是第一件要做的事,就是把 DHCP 的設定給註解掉,然後加入下面的 IP 設定。

#iface eth0 inet dhcp
iface eth0 inet static
address 192.168.1.8
netmask 255.255.255.0

2. 新增或修改 /etc/resolv.conf ( 不是 resolve.conf )
再來是要設定 DNS Server,不過,如果只是要讓兩台電互通,這裡是可以不用設定的,如果需要加入 DNS Server 就要把 DNS 的 IP 填入如下:( 以中華電信的 DNS Server 為例 )

nameserver 168.95.1.1
nameserver 168.95.192.1

一般Linux Server安裝後都沒有GUI, 只能以command操作.
以Ubuntu Server為例, 若要加回GUI, 可執行以下:

sudo apt-get update

sudo apt-get install ubuntu-desktop
這便會令Ubuntu Server去download所有GNOME desktop的套件並安裝. 完成後重新啟動便可.

若不想安裝太多套件, 諸如Evolution, LibreOffice等, 可用以下command: (只裝GUI)


sudo apt-get install --no-install-recommends ubuntu-desktop

若想安裝KDE desktop, 可用以下command:


sudo apt-get install kubuntu-desktop

2013年4月21日 星期日

Spring Framework 基礎學習筆記(二)

Spring Core主要是實現反向控制(IoC)與相依植入(DI)的精神,這篇主要針對Spring Core的特性和用法,延續Spring Framework 基礎學習筆記(一),做一些較為詳細紀錄和重點整理。

2013年3月21日 星期四

Spring Framework 基礎學習筆記(一)

Spring  是由 Rod Johnson 撰寫,它是個輕量級(Lightweight)容器(Container),實現 IoC(Inversion of Control)、AOP(Aspect-oriented programming)概念。使用Spring有以下優點:


1.鬆耦合 ( loosely-coupled )

物件導向語言的程式寫法中,讓物件間呈現一種鬆耦合的關係,有很多好處,例如:透過Spring提供的Ioc(控制反轉)功能,所有物件的關係都只需要在XML組態檔裡做設定,Spring會自動根據組態檔的設定將物件間的關係建立起來,開發人員就能很輕易的就做到鬆耦合的程式寫法。


2.整合多個Framework

Spring是個相當全面的應用程式框架,常見的Framework,Spring也都提供了整合的方式,例如Struts、Hibernate,經由Spring整合後,更加簡單易用。

2013年3月7日 星期四

Java資料型態(Data type)

資料型別是程式設計中最基礎的一部分,若觀念不清楚,寫出來程式就很容易與預期的結果不同,所以求職面試的時候常常會有這種基礎題型,來測試這方面的觀念是否清楚,下面做了一些整理和註記,以釐清一些觀念。


2013年3月5日 星期二

2013年2月20日 星期三

Design pattern-Singleton


In software engineering, the singleton pattern is a design pattern that restricts the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system. The concept is sometimes generalized to systems that operate more efficiently when only one object exists, or that restrict the instantiation to a certain number of objects. 
Singleton 模式可以保證一個類別只有一個實例

2013年1月23日 星期三

Java 使用JDBC存取MySQL


Java 存取資料庫是很常見的一種應用,紀錄一下Java存取 MySQL範例說明 ,這裏使用Connector/J來連接MySQL,所以要先下載Connector/J(http://www.mysql.com/downloads/connector/j/),下載完成後解壓縮,可以得要一個mysql-connector-java-5.1.17-bin.jar就是MySQL的JDBC-Driver了, 接著在Eclipse建立一個Java Project,簡易步驟如下:

2013年1月20日 星期日

[Android]取得相機照片後儲存方法

在開發Android相機應用時,處理照片檔案是必經的過程,首先要面對的相片儲存的位置,依應用程式的需求,可將照片儲存至外部的SDCard裡,或是內部的記憶體(內存)中,這兩種儲存位置的做法不太相同,分別介紹兩種方法。

儲存至內部記憶體(內存):

以下程式碼是將照片以.JPG檔的形式儲存至內部記憶體中

PictureCallback camJpegCallback = new PictureCallback() {
  public void onPictureTaken(byte[] data, Camera camera) {
  // 用來接收壓縮成jpeg格式的影像資料
  
  FileOutputStream outStream = null;
  try {
   //儲存在內部記憶體
   Bitmap bm =BitmapFactory.decodeByteArray(data, 0, data.length);
   outStream = openFileOutput("photo.jpg", Context.MODE_PRIVATE);
   bm.compress(CompressFormat.JPEG, 80, outStream);
   outStream.flush();
   outStream.close();
   Toast.makeText(PKActivity.this, "存檔完成!", Toast.LENGTH_SHORT)
   .show();
   Intent intent=new Intent();
   intent.setClass(PKActivity.this, PK_ResultActivity.class);
   startActivity(intent);
   PKActivity.this.finish(); 
  
  
  } catch (IOException e) {
   Toast.makeText(PKActivity.this, "影像檔儲存錯誤!", Toast.LENGTH_SHORT)
   .show();
  }


程式說明:


Bitmap bm =BitmapFactory.decodeByteArray(data, 0, data.length);

將char[] 轉換成Bitmap 的形式。


FileOutputStream outStream = openFileOutput("FileName",MODE_WORLD_READABLE);


使用openFileOutput來建立FileOutputStream 。
FileName只要檔名即可,不用完整路徑。
Context.MODE_PRIVATE:代表該檔是私有資料,只能被APP本身存取。如果檔案已存在,會覆蓋原檔。 Context.MODE_APPEND:會檢查檔案是否存在,檔案存在會將內容新增檔案內;如檔案不存在就建立新檔。 Context.MODE_WORLD_READABLE:其它應用程式也可以讀取。如果要在APP中使用 intent.ACTION_SEND,要使用此模式。
Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。 Context.MODE_PRIVATE:代表該檔是私有資料,只能被APP本身存取。如果檔案已存在,會覆蓋原檔。
Context.MODE_APPEND:會檢查檔案是否存在,檔案存在會將內容新增檔案內;如檔案不存在就建立新檔。 Context.MODE_WORLD_READABLE:其它應用程式也可以讀取。如果要在APP中使用 intent.ACTION_SEND,要使用此模式。
Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。
Context.MODE_APPEND:會檢查檔案是否存在,檔案存在會將內容新增檔案內;如檔案不存在就建立新檔。 Context.MODE_WORLD_READABLE:其它應用程式也可以讀取。如果要在APP中使用 intent.ACTION_SEND,要使用此模式。
Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。 Context.MODE_WORLD_READABLE:其它應用程式也可以讀取。如果要在APP中使用 intent.ACTION_SEND,要使用此模式。
Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。 Context.MODE_WORLD_WRITEABLE:其它應用程式也可以寫入此檔。

bm.compress(CompressFormat.JPEG, 80, outStream);


將Bitnap以80%的壓縮存成JPG檔,用FileOutputStream 方式存入。


儲存至SD卡


PictureCallback camJpegCallback = new PictureCallback() {
  public void onPictureTaken(byte[] data, Camera camera) {
  // 用來接收壓縮成jpeg格式的影像資料
  FileOutputStream outStream = null;
  try {
   //儲存在外部SD
   outStream = new FileOutputStream("/sdcard/photo.jpg");
   outStream.write(data);
   outStream.close();
   Toast.makeText(PKActivity.this, "存檔完成!", Toast.LENGTH_SHORT)
   .show();
   Intent intent=new Intent();
   intent.setClass(PKActivity.this, PK_ResultActivity.class);
   startActivity(intent);
   PKActivity.this.finish(); 
  
  
  } catch (IOException e) {
   Toast.makeText(PKActivity.this, "影像檔儲存錯誤!", Toast.LENGTH_SHORT)
   .show();
  }

2013年1月17日 星期四

使用AXIS2建立WebService Client

 Axis2 是一個WebService的核心支援引擎。 AXIS2對舊有的AXIS重新設計及重寫,並提供兩種語言Java 及 C 的開發版本,這裡介紹使用Eclipse配合AXIS2建立WebService Client專案 。

2013年1月16日 星期三

AXIS2 WebService Client存取Server憑證過期解決方法

當Server端的憑證過期,無法直接用Eclipse直接連接https的URL時,可利用瀏覽器將.wsdl檔下載至Local端,再將檔案匯入Eclipse中,使用axis2建立一個WebServiceClient的project,詳細建立步驟

由於Server憑証過期,Client端要存取Server時會造成錯誤,在axis2中可加入以下程式碼,忽略憑証過期的警告。程式碼如下:

public static void trustAllSSL() {
   TrustManager[] trustAllCerts = new TrustManager[] {
            new X509TrustManager() {
                public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
                public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
                public X509Certificate[] getAcceptedIssuers() { return null; }
            }
    };
    HostnameVerifier hostVerify = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

    try {
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier(hostVerify);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

在Client初始化前執行 trustAllSSL(),就可正常存取WebService了。