顯示具有 Android 標籤的文章。 顯示所有文章
顯示具有 Android 標籤的文章。 顯示所有文章

2016-05-04

emulator: ERROR: x86 emulation currently requires hardware acceleration!

在建立一個使用 ARM 的 AVD 之後,啟動時會跳出以下的提醒訊息。
Running an x86 based Android Virtual Device(AVD) is 10x faster. We strongly recommend creating a new AVD.
有用過 Android emulator 的人都知道,慢死了!現在居然說可以快10倍,那還不快來試試看!

立刻建立一個使用 Intel Atom(x86) 的 AVD,正在開心的迎接10倍速的時代時,爆出這個錯誤訊息!
emulator: ERROR: x86 emulation currently requires hardware acceleration!
Please ensure Intel HAXM is properly installed and usable.
還好,記得在 SDK Manager 裡有看到這個 Intel HXAM 關鍵字,立刻去安裝!


安裝完再來啟動 AVD,x的,還是一樣的錯誤!

拜完 Google 大神,x的 Google(Android 算你們的),只下載不安裝,這是哪門的安裝?

找到 [android-sdk]\extras\intel\Hardware_Accelerated_Execution_Manager\intelhaxm-android.exe 並手動安裝。

終於可以啟動 Intel Atom(x86) 的 AVD,啟動有比較快但也沒快到會讓人笑出來的程度。

---
---
---

2014-12-06

AsyncTask 與 UI Thread

緣由

在開發 Google Cloud Message(GCM)時遇到 AsyncTask,但沒有提供 sendRegistrationIdToBackend() 實做,事實上沒辦法也不需要,這是個人的事。

一開始我是用 HttpClient 將 registrationId 送到後台 Web Server,這樣沒問題,可是後來 Web Server 改用 Http over SSL,也就是 https,哇靠,HttpClient 預設不通未公開憑證的 https 網站。

後來使了個小聰明,當時 Activity 裡有個 WebView 元件,那就用 WebView 元件來送 request,應該就沒問題吧!

果然,只要 WebView 加上以下的設定,就可以通 https 了。
this.webview.setWebViewClient(new WebViewClient() {
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        Log.e(TAG, "onReceivedSslError - " + error);
        handler.proceed();
    }
});
順利交差沒多久,暴了。

2014-12-02

Anddroid Device Chooser(Eclipse) 找不到 Android Device(ASUS ME181C) 的一種可能性

以前用 Sony Ericsson 的 Android 手機時,Android Device Chooser 從來沒有說找不到手機的,最近改用 ASUS ME181C 後,Android Device Chooser 不管怎樣就是說找不到我的平板!

而 Emulator 又慢到暴,所以還是只能讓 Eclipse 找到我的平板才行。

平板一接上電腦,檔案總管理就看到啦,所以應該不用裝驅動程式(?),但是 Eclipse 裡就是看不到,怪。

2013-11-18

java.lang.RuntimeException: Unable to instantiate service - IntentService

練習 IntentService 時發生奇怪的錯誤。
public class HelloIntentService extends IntentService {

  public HelloIntentService(String name) {
      super("HelloIntentService");
  }

  @Override
  protected void onHandleIntent(Intent intent) {
      // ...
  }

}
啟動 service 時發生錯誤。
java.lang.RuntimeException: Unable to instantiate service com.xxx.HelloIntentService: java.lang.InstantiationException: com.xxx.HelloIntentService
瞎子摸象後找到奇怪的原因,要實作沒有參數的 constructor(No-args Constructor)
public class HelloIntentService extends IntentService {

  public HelloIntentService(String name) {
      super("HelloIntentService");
  }

  @Override
  protected void onHandleIntent(Intent intent) {
      // ...
  }

}
---
---
---

2013-11-15

No HTML/CSS/Javascript Editors in Eclipse ADT (Eclipse for Android) !!!

一般在 Android 開發 App 不太會遇到 HTML, CSS 或者 Javascript 之類的 Web 檔案,但是在遇到 Phonegap 之後就有這個需求了!

可是 Eclipse ADT(adt-bundle-windows-x86-20131030.zip)沒有內建 Web Editor,這真的有點傷腦筋。

Google 沒結果,不是安裝了官方的 plugin 之後出現找不到 JSF class 的問題,就是要安裝 3rd party 的 plugin。

今天運氣不錯,一下子就解決了!

Eclipse > Help > Install New Software...

Work WithJuno - http://download.eclipse.org/releases/juno

下方勾選 Web, XML, Java EE and OSGi Enterprise Development 下的 Eclipse Web Developer ToolsJavaScript Development Tools 就可以了。

事實上,之前的 PHP Eclipse 也是這麼做的,網路下載的 PHP Eclipse 很多問題,後來是用 Eclipse Standard 版,然後再安裝 PHP 功能搞定的。

2012-01-23

Android Launch Mode

Task 進階

Android Task、Home 鍵與 Back 鍵 裡講的 Task 預設行為應該滿足大部分 App 的需求,除此之外,Task 也可以應付一些特別的需求:
  • 在新的 Task 裡啟動 Activity,而不是在目前的 Task 上堆疊
  • 啟動一個已經啟動過的 Activity 時,不要產生新的 instance,而是回到既有的 instance
  • 當離開 Task 時,清掉 Task 裡所有的 Activity,除了最後一個 Activity

Android Task、Home 鍵與 Back 鍵

Task 與 Back Stack

每個 App  可以有多個 Activity,每個 Activity 負責一些功能,也能視需要啟動其他 Activity 來滿足 User 的需求,可以啟動的 Activity 包括同一個 App 的 Activity 或者其他 App 的 Activity。

啟動其他 App 的 Activity 是透過指定特定 Action 的 Intent,若同時有多個 Activity 提供相同的 Action,Android 會讓 User 決定要用哪一個 Activity。

若 Activity A 啟動 Activity B,則 Activity A 停止(onStop)並保留 UI 現況,當 Activity B 按下 Back 鍵後,就會回到 Activity A 並回復 UI,而 Activity B 則被銷毀(onDestroy)。

若 A 啟動 B,B 又啟動 C,Android 以一個稱為「Back Stack」的堆疊依序紀錄每個 Activity,然後在 Back  鍵按下後,依據「後進先出」的原則依序從 C 回到 B 再回到 A,而這串 Activities 則稱之為「Task」。

2011-12-20

Android AsyncTask 與 Handler Thread 的差異

Android UI 不是 Thread Safe,所以 UI 的互動均由 Main Thread 負責,即執行 Activity 那個 Thread,其他 Thread 均不能更新 UI,基於 UI 的親善,Main Thread 不可以執行費時的工作,否則 User 會因此看到一個失能的 UI 而暴走,因此當 Main Thread 出現五秒以上的運算時,Android 就會丟出 ANR 讓 User 可以選擇等待或離去。

費時的工作包括網路存取、檔案處理、資料庫讀取或僅只是費時的計算。

因此,費時的工作得另起 Thread 來處理,如果這費時的工作處理過程或結果不用與 UI 互動,那麼只要起一個一般的 Thread 即可,但是多半不會這樣,所以就出現了 AsyncTaskHandler Thread

之所以會一起比較 AyncTask 與 Handler Thread 的原因就在於他們提供相同的功能,即另起 Thread 進行費時的工作,且可以透過 Main Thread 修改 UI。

2011-12-19

在 Android 裡使用 AsyncTask 來處理費時的運算

由於 Android 有五秒的 ANR 限制,所以像是網路存取(HttpGetHttpPost)這類費時的運算,就不適合由 Main Thread 處理。

因為 Android UI 不是 Thread safe,因此所有的 UI 操作都得透過 Main Thread,而當費時的運算過程或者結果不會影響到 UI 的話,那只要起一個 Thread 去處理就可以了,但是當過程或結果需要與 UI 互動時,就得用上 AsyncTask。

AsyncTask 會起一個背景執行的 Thread,並提供前中後三個 callback 供開發者使用。

至於 AsyncTask 與同樣可以更新 UI 的 Handler + Worker Thread 的差異,改天再做研究。

在 Android 裡使用 HttpPost 讀取網頁與上傳檔案

使用 HttpPost 讀取網頁與 HttpGet 大同小異,比較不一樣的地方在於使用 HttpPost 上傳檔案時,需要使用三個外部的 Jar 檔:commons-io、httpmime 與 mime4j。

2011-12-17

在 Android 裡加入外部 Jar 檔(3rd party library)

因為 Android 獨特的檔案結構,一直以為不能用外部的 Jar 檔,原來還是可以用。

只要在 Eclipse > [Project Name] 右鍵 > Properties > Java Build Path > Libraries > Add External JARs... 或 Add Variables... 就可以加入想要的外部 Jar 檔,Android 在包 APK 檔時,就會將這些外部的 Jar 檔包進去。

2011-12-16

在 Android 裡使用 HttpGet 讀取網頁

主角為 HttpClient 與 HttpGet,HttpClient 是高貴的物件,整個 App 共用同一個 HttpClient,每一次存取網路建立一個新的 HttpGet 而不是建立新的 HttpClient(要包成 Singleton)。

不可以在 Activity 的 Main Thread 裡直接呼叫網路存取,因為很有可能出現五秒鐘的 ANR。

另外要在 AndroidManifest.xml 開啟網路權限 android.permission.INTERNET。

記得測試的時候,若要連到本機,不可以用 localhost 或者 127.0.0.1,因為這時的本機指的是手機或 Emulator,不是開發的電腦。

2011-12-15

在 Android 裡使用 Local Service

Android Service

Android Service 是與 Activity 同位階的元件,不同於 Activity 的地方在於 Service 是在背景執行,沒有 UI 可以操作,所以不像 Activity 會有 onPause(...) 或 onResume(...) 的情況,Service 只有 onCreate(...)、onDestroy(...) 與負責工作的 onStartCommand(...),因此當 Activity 被關掉時,可以將未完成的工作交給 Service 執行。

Android Service 的生命週期獨立於 Activity,就是說,關閉 Activity 不會一併關閉 Service。

Android Service 可以分成 Local 與 Remote 兩種,Local Service 只能由同一 App 存取,而 Remote Service 則可以由同一 Android 裡的所有 App 存取。

非常重要的一點是,Android Service 預設是在 Main thread 裡執行,所以 Service 不可以執行費時的工作,否則 UI 會停住,因此 Service 若要執行費時的工作,得另起 thread 去處理;跑在 Main Thread 的 Service 因此可以透過 Activity 來修改 UI,而另起 Thread 後就不行了。

2011-12-14

在 Android 裡區別 standard 與 singleTop 兩種 launchMode 的差別

在 AndroidManefest.xml 裡可以對 activity 設定不同的 launchMode(standard、singleTop、singleTask、singleInstance),預設為 standard,前兩個功能類似,可以歸為比較常用的一組,後兩者歸為比較不常用的一組。

先看看官方文件的說法:
  • standard - The system always creates a new instance of the activity in the target task and routes the intent to it.
  • singleTop - If an instance of the activity already exists at the top of the target task, the system routes the intent to that instance through a call to its onNewIntent() method, rather than creating a new instance of the activity.
白話說,就是 standard 不會 reuse 已有的 instance,而 singleTop 會 reuse 已有的 instance,但條件是該 instance 得在 stack 最上方。

這裡用發送通知做測試兩種的差異,啟動 activity 後立即發送 notification,然後到 notification bar 點選 notification 回到同名的 activity,這時 standard 的 activity 就會另外產生一個新的 instance 在原來的 instance 上,而 singleTop 則會回到原來的 instance,可以從唯一的 key 值做判斷,也可以使用 Back 鍵來測試,standard 的要按兩下才會離開該 activity,事實上是離開兩個 instance,而 singleTop 的只要按一下就離開了。

2011-12-13

在 Android 裡傳送通知(Notification)

通知(Notification)就是出現在畫面左上方,往下一拉可以看到詳細內容,點下通知還可以開啟指定的 activity。

可以設定 flag 為 Notification.FLAG_NO_CLEAR,表示該通知不可以刪除,用來傳達重要的訊息,或保留回到特定 activity 的機會。

每個通知會有一個唯一的 id,如果前後兩個通知使用一樣的 id,後發的通知會覆蓋同 id 的通知,可以作為更新通知的方式。

2011-12-11

在 Android 裡呼叫錄音程式(RECORD_SOUND_ACTION)

先說,這個練習失敗了,原因不明。

在 Android 使用語音辨識(RecognizerIntent)與網頁查詢

呼叫 Google 提供的語音辨識程式進行語音辨識後取得辨識結果,辨識結果可能有多筆,也可以使用查詢結果開啟 Google 做查詢。

2011-12-10

在 Android 裡呼叫相機

呼叫相機的 Intent action為 MediaStore.ACTION_IMAGE_CAPTURE,預設的照片存放位置為相機的預設位置,可以另外加上 MediaStore.EXTRA_OUTPUT 設定自訂的位置。

但是 API 裡卻說使用預設的位置只會產生小圖,自訂位置才能產生大圖,我發現回傳給 activity 的都是小圖(透過 Intent 取得的 Bitmap),可能是根據螢幕尺寸縮小的,但是去找原始的圖檔卻都是大圖,不知道是 API 有改,或者我預設的位置是在 SD 卡裡的關係。

2011-12-08

在 Android 裡以 ImageView 看照片

練習三件事:挑照片、看照片、顯示路徑。

在 Android 裡使用攝影機預覽(Camera)

除了之前用過的 MediaRecorder 可以使用 Camera 的預覽功能外,也可以直接使用 Camera 來達成相同的功能。

這邊除了 Camera  預覽外,再使用自訂的 View 加上拍照功能常有的對焦框,為了讓對焦框可以疊在 Camera 預覽視窗上方,就是一定要用 FrameLayout