發表文章

目前顯示的是有「Android」標籤的文章

Android RenderScript

圖片
上回泰勞介紹了處理圖片特效的方法,這回要來介紹如何提升效能,也許很多人第一時間會想到 JNI,那確實是個不錯的選擇,不過泰勞想介紹一個有點不一樣 、 使用場合跟 JNI 不盡相同的 API,那就是 RenderScript! 參考資料: [Developers]RenderScript Overview [Developers]Type [Developers]Element [Developers]Allocation 使用 RenderScript 最大的優勢在於它可以實現「 平行運算 」,在擁有多核心處理器的裝置上速度一定會快上許多,同時它也支援 GPU。但因為是平行運算,有些場合是不能使用的,當然也有些場合特別適合,像是圖像處理就非常適合使用 RenderScript。 延續上一回的範例,這次改用 RenderScript 來實作負片效果,先準備一個簡單的 Context,作為主程式調用 RenderScript 的中繼站。 RenderScriptContext.java public class RenderScriptContext {   // for RenderScript   private RenderScript rs;   // ScriptC 和底線為格式所需,Invert 是我的 RS 腳本名稱   private ScriptC_Invert scriptC;   // 用於設定 RS 物件類型   private Type rType;   // 將 Java 物件傳給 RS 處理的媒介   private Allocation allocIn;   private Allocation allocOut;   //   private Bitmap outputBitmap;   public RenderScriptContext(Context context, int width, int height) {     // 初始化 RS 的 Context     rs = RenderScript.create(con...

圖片特效

圖片
一開始以為寫程式製作圖片特效是很複雜困難的事情,最近接觸了一點點之後,發現其實沒有想像中的那麼難,並不是什麼天才科學家才能做的事呢!本章將示範在 Android 上實作修圖特效,並以簡單的負片效果作為範例。 參考資料: [Android Developer]Color 首先介紹一下負片效果,簡單的說就是將色彩反轉,以補色的模式呈現,例如:黑色(0,0,0)的補色是白色(255,255,255),黃色(255,255,0)的補色是藍色(0,0,255)。在 Android 上處理圖片必須先將圖轉為 Bitmap 格式,才能進行處理。 Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test); 轉為 Bitmap 格式之後,透過 getPixels 方法將其轉為整數陣列,此時圖上的每一個像素都已經分別轉為一個個整數並且存放在整數陣列裡面,而在 Java 裡面一個 int 是 32 位元,所以此時你看到的整數,這 32 位元包含:透明度 ( alpha) 、紅(r) 、藍(g) 、綠(b)。拆解開來之後就可以進行補色的運算囉! public Bitmap invertColor(Bitmap bitmap) {     int width = bitmap.getWidth();     int height = bitmap.getHeight();     int[] pixels = new int[width*height];     // Convert bitmap to int array     bitmap.getPixels(pixels, 0, width, 0, 0, width, height);     for(int i = 0; i < pixels.length; i++){         // Extracted from a color ...

Create A Single-Choice Mode Dialog with Images

圖片
This is the first time I write article in English, please don't hesitate to correct me if I make a mistake. Preface: Android has already provided a method to show items in Dialog with Single-Choice mode, we can achieve that via setSingleChoiceItems, the example is shown below. AlertDialog.Builder mDialog =     new AlertDialog.Builder(context).     setSingleChoiceItems ( R . array . items, defaultItem,      new DialogInterface . OnClickListener () {         @Override         public void onClick ( DialogInterface dialog , int which ){             ......             ......         }     } ); Below is the output of above sample code. But, this method can only allow developer showing String in, how can I do...

使用 ACRA 回報應用程式錯誤訊息

圖片
前陣子泰勞剛上架了新的應用程式到Google Play商店,雖然已經過數百次的測試,還是免不了千奇百怪的臭蟲(Bug),這個問題困擾了我很久,也因此得到很多1分的評論。最大的原因是我自己的手機 、平板 、電腦裡的模擬器都複製不出那些錯誤現象,而Google Play Console提供的資訊又不夠豐富......,為了從使用者的裝置上取得更詳盡的錯誤訊息,只好另尋方法來徹底解決。 參考資料: [Stackoverflow]How do I obtain crash-data from my Android application? [Github]ACRA/acra/wiki 先來看看 Google Play Console提供給我的資訊。 因為我使用了AsyncTask來封裝儲存資料的動作,因此僅能得知應用程式在儲存資料時 發生錯誤,無法得知根本的原因,而這現象非常大量的發生在三星手機身上,但我身邊並沒有任何三星手機讓我做測試,要解決這問題,勢必需要應用程式回傳完整的錯誤訊息回來,才能夠進一步的分析。 最佳解答: 基本上ACRA在Github上的介紹已經非常詳細了,只要照著 說明 一步一步設定,就可以完成最基本的功能囉!泰勞在這邊就不多做解釋,僅簡單的帶過步驟。 1.在build.gradle裡加入dependency 2.新增一個繼承Application的類別。 3.寫入最基本的格式,因為沒有伺服器可用,只能先將錯誤訊息透過電子郵件回傳。 4.更新AndroidManifest 到這邊已經完成最基本的功能囉!再來要加入提示訊息,讓使用者知道應用程式遇到狀況了,需要回報錯誤訊息給開發者, 同時這也是尊重使用者的態度, 比起在背景偷偷回傳來的好 。 5.使用Dialog顯示應用程式發生錯誤的訊息。 6.為了讓回報的訊息更完整,可以加入Log設定,圖中為預設的Logcat指令,可以依不同需求來設定這些字串。 測試一下,故意讓應用程式出現意外錯誤,一方面要看看Dialog介面,一方面要確認回報的Log訊息是否完整。 有錄到我想要的重點,看來測試結果是沒其他問題了,只是預設的Dialog有點陽春,我是懶得改,想套用自己設計的介面就去參考官方的文獻吧...

Repo 實用指令

圖片
泰勞撰寫本篇文章的主要目的是『記錄』,就如學生時期會在課堂上做筆記一樣(有這麼認真?),將自己在做開發或研究的過程中,時常使用且泰勞覺得實用的指令記錄下來,一方面讓自己再複習,一方面提供給大家參考,也許能夠幫助到有需要的人。 註:此文章要 感謝Yungwen 、 Makson 、 George與Ouyang這些長輩們的耐心指導。 前言: 看到文章標題和標籤,應該不難發現泰勞主要活躍於Android領域,尤其是Android的原始碼(Source Code),偶爾寫寫簡單的應用程式。因此,泰勞會時常使用Repo與Git來操作存放原始碼的倉庫(Repository),整合不同的分支(Branch),這也是本文真正要記錄的主題喔! 參考資料: Repo command reference Git reference   Git是一個被設計用來處理分散式大型專案的版本控制系統,而Android也採用了這套軟體來管理不同的版本。Repo則是由Google開發出來的工具,其用Python封裝了一些Git指令,目的為幫助開發者能夠更容易的在Git架構之下管理Android原始碼。 在安裝完Git與Repo之後,先從初始化並下載原始碼的動作開始,也就是"Init"與"Sync"! Init $ repo init -u <URL> <Options> -u :指定一個網址,告訴Repo你想從哪裡取得manifest倉庫 -m :選擇倉庫裡的其中一個manifest -b :指定一個版本,在這裡也可以說是指定一個分支 泰勞特別解釋-m這個參數的用意,在開發Android的過程中,原始碼幾乎每天都會有變動,為了方便日後的測試與除錯,會習慣將每日原始碼的『狀態』做一個『快照Snapshot』,在Repo的架構下,就是用manifest來儲存當日原始碼的狀態,指令如下所示。 $ repo manifest -r -o $DATE .xml 日後若突然發現有一個Bug,想要測試這個Bug從何日何時出現,即可透過-m這個參數加上指定的manifest來做追蹤。 $ repo init -u $URL -b $BRANCH -m $DATE .xml 另外,An...

Execute Shell Command in Android App

圖片
只要是Android開發者,一定都知道Android在SDK當中提供了一個好用的工具叫做ADB(Android Debug Bridge),它可以讓開發者透過電腦與裝置做溝通、安裝應用程式和除錯,也可以進入Unix Shell裡下其他指令。要使用ADB之前,必須先將Android裝置與電腦做連線,接著執行下列指令來確認裝置已經成功聯繫: $ adb devices 成功連接就會出現裝置序號(Serial Number),如下圖所示。 此時,可以開始使用指令來操作系統了,最常使用的莫過於讀取Log資訊,其他像是取得系統資訊、查看目錄、搜尋檔案等等,都是時常需要使用的,下面列出一些泰勞本身常用的指令。 $ adb shell dmesg --> 核心(Kernel)Log資訊 $ adb shell logcat --> 系統和應用程式的除錯(Debug)訊息 $ adb shell dumpsys --> 提供在Services、Memory或其他系統詳細的資訊 當然也可以僅透過"adb shell"單純進入Android系統的Shell,接著你會看到終端機的開頭標示著"shell@xxxxx",通常會是裝置的某個代號。此時,不須再經由adb開頭的指令來操作了,一般Linux上常用的指令,只要Android有支援,都可以直接使用,例如:cd、cp、mv、ls、ls -la等等,如下圖所示。 簡單的講完前情提要之後,回到本篇文章的重點,要如何從應用程式的角度對系統下指令呢? 其實並不難,只要使用Java提供的一些API並套入正確的指令就可以完成。有興趣想更深入研究的話,可以先詳閱以下參考資料喔! 參考資料: Execute shell command from Android Process - Oracle Help Center Runtime - Oracle Help Center 廢話不多說,直接來看程式碼吧!以下範例為應用程式執行logcat指令並將包含關鍵字 " android.intent.action. " 的Log紀錄篩選出來。 try {      //在系統裡,一般應用程式受到UID的限制,僅能查看屬於自己的L...

處理觸控事件與其優先權

圖片
onTouchEvent是View類別提供的方法之一,主要用來處理「觸控」事件,我們只要繼承View,就可以將其覆寫並設計自己需要的功能。覆寫onTouchEvent的時後,必須將MotionEvent這個物件帶入,使其能夠找到對應的Case,然後執行相對應的動作。 簡單的範例程式碼如下所示: @Override public boolean onTouchEvent(MotionEvent event) {          paint.setColor(Color.WHITE);     paint.setStyle(Paint.Style.FILL);     switch(event.getAction())     {       case MotionEvent.ACTION_MOVE:           canvas.drawLine(mov_x, mov_y, event.getX(), event.getY(), paint);           invalidate();           break;       case MotionEvent.ACTION_DOWN:           mov_x=(int) event.getX();           mov_y=(int) event.getY();          ...