文章

目前顯示的是 2015的文章

Fragment 迷航記

最近為了 "吹哨找手機" 的其中一個 bug issue,好幾天睡眠不足,每天挑燈夜戰,查遍各大論壇,雖然釐清了不少觀念,但是還是解不出來。

問題是這樣,當這 app 被 android 回收後,再重新執行會出現 ANR crash,檢查 log 會發現 No view found for id (:packageName) 之類的錯誤,雖然在上架前我用其它方法躲過 ANR,可是顯示上還是有異常。

整個佈局是 PreferenceActivity 鑲嵌 PreferenceFragment,就在剛才翻了翻 google api,才驚覺原來 Fragment 在鑲嵌進 Activity 時,有兩種方式,其一是以前用過的 getFragmentManager().beginTransaction().replace(R.id.query_container,new PrefsFragment()).commit(),另一種是用 xml 方式套入 fragment。

在 AS 開新專案時使用的是 SettingActivity 範本,預設是用 xml 嵌套的,但是原始範例是兩層的設定頁面,看不是很懂,所以改成以往的 getFragmentManager().beginTransaction().replace(R.id.query_container,new PrefsFragment()).commit() 方式在套入,但是原本範例內的 xml 嵌套仍然保留,所以才會在 android 回收 Activity 後,出現 ANR 錯誤。

解決方法就是把自作聰明的 getFragmentManager().beginTransaction().replace(R.id.query_container,new PrefsFragment()).commit() 拿掉就好了。

為了這一行失去了好幾個晚上的睡眠,天呀。


話說我還是比較喜歡從實作中學習整個概念或使用方法,要我去翻 api 再逐一驗證,要嘛是睡著,整個學習沒有衝勁看不到成果,要嘛就是放棄的早。

雖然這樣的學習方式跌跌撞撞,但也會慢慢建立起自己對這 api 的世界觀,我果然是實作派的。

-----------------------------------------------

最近做很多自打嘴…

吹哨找手機

圖片
吹哨找手機 (WhistleWakeUp) 是不是跟我一樣,手機隨手亂放,櫃子裡、枕頭下、棉被裡、包包裡,翻遍了可能出現的地方就是找不到!
老婆、小孩不給你玩手機,把手機藏起來!

不喜歡手機鈴聲響起吵到人,常常設定靜音。 沒有開啟網路、沒有啟動 Google android 裝置管理員功能。

這時候多希望呼喊手機,讓手機自己跳出來說 "我在這裡! 我在這裡!"

[特色]
 1. 定時重置哨音計數,避免在不適當場合喚醒手機
 2. 設定哨音長短目標值,掌控喚醒手機難易程度
 3. 調整喚醒音量,建議同預設最大音量,以利找尋手機
 4. 喚醒音效重複撥放設定,若關閉循環撥放,在播放完畢時會重啟哨音偵測服務
 5. 選取提醒音效
 6. 開啟服務, 離開設定頁面即開啟
 7. 開機自動開啟服務 (參考 Q&A: Q6)
 8. 通話時服務自動停止
 9. 螢幕開啟自動停止提醒音樂
*10. 哨音偵測敏感度設定
*11. 螢幕關閉啟動哨音偵測服務
*12. 手機靜置3~6分鐘後觸發哨音偵測服務,手機翻轉移動則終止哨音偵測

註: "*" 表示吹哨找手機 Pro 版本獨有
請先下載免費版評估使用,體驗功能後確定合用再購買 Pro

[如何使用]
下載後開啟 app 設定、選取音樂,系統裡授權吹哨找手機自啟動服務,把手機藏起來 (option),吹吹口哨即可

[如何停止喚醒後的音樂]
全版本均可透過點選系統提醒訊息,或是開啟設定頁面或是螢幕開啟即自動停止提醒音樂

[問與答]
Q1: 不會吹口哨怎麼辦?
任何高頻聲音均可以取代口哨,例如小孩的哭鬧聲、笛音壺煮開的聲音、哨子聲、垃圾車音樂...etc

Q2: 口哨聲太小,手機聽不到?
請用替代音源或是麥克風擴大效果 XD

Q3: 過度吵雜的環境,手機偵測哨音能力?
安靜的使用環境有助於手機的尋獲

Q4: 手機經常誤判亂響怎麼辦?
1. 重置哨音計數設定重置秒數縮短
2. 哨音長短設定提高

Q5: 會不會很耗電?
手機隨時要注意聽哨音,是需要點精力的,或是購買 "吹哨找手機 Pro" 作節電設定的調整
不過維持良好的充電習慣是必要的.

Q6: 重開機或是 app 被系統清理掉,怎麼辦? 如何設定自啟動服務?
請設定 開機啟動,重開機會自動開啟服務
部份系統 (如 mi…

發送彩信 - 權限?

最近在寫遠端呼叫手機的 app,做了一個完整版及精簡版,兩個版本的修改過程是先做好完整版,再拿完整版的程式碼刪掉不要的代碼,原則上都是刪除代碼。

奇怪的事發生了,完整版裝起來後權限只有"錄音",精簡版的權限還多出了"發送彩信",這是甚麼道理?

我的手機是紅米Note,是 miui 的 bug? 還是我的開發環境中毒啦! 偷偷幫我加進權限要求?

不解中......


---- 2016-01-08 ----
覺得自己很愚蠢,我想應該是ADMOB廣告套件所需要的權限吧! 難怪在論壇上沒人理我。

陽光空氣水

圖片
陽光‧空氣‧水

有鑑於現代人關心週遭環境議題,加上 PM 2.5 議題發酵,當時遂此空氣污染指數為目標進行開發。開發途中思考如何豐富 app 內容,市面上相似的產品,都是整合 gps 或是使用者自行設定、查詢特定地點再顯示單一數據,更進一步設計主動通知,甚至是 widget,但是不想要過於複雜的操作、設定,兼且此種環境因素絕對不是只有單一觀測站才有數據,環境因子一定是範圍性的擴散、影響著使用者當下的感受,所以搭配 google map,圖形顯示全島各項指標,相信人類大腦的綜合判斷能力,必能從簡單圖形顯示得到使用者所需資訊。

賞圖吧!









----------------
App 商品說明

陽光、空氣、水,生命的三大要素。
提供台灣紫外線指數、空氣品質、累積雨量等環境監測數據。

陽光: 紫外線即時監測
空氣; 空氣品質監測,PSI、PM2.5、PM10、SO2、CO、NO2、O3等監測指標
水: 累積雨量監測

市面上常見的 app,經常以資料查詢的方式,提供矩陣式的資料呈現,
輔以手機主動式提醒等功能。

此 app 簡化操作步驟,隱藏不必要資訊,一眼望盡台灣各項監測數據。

秀才不出門,能知天下事。

點開 app,哪裡下雨、空氣品質不佳、大太陽一目瞭然。

再套句柴静《穹顶之下》的話:我不是多怕死,我是不想這麼活。

住在台灣的您,可以不下載這個 app,可是您一定要看看台灣這寶島怎麼了。

我們一起來關心台灣吧!

----------------
改版記錄
1.0 初版 1.1 修正 JSON 格式改變造成紫外線指數讀取異常2015/12/2 1.2 因應行政院環保署全部阻擋 android 平台存取的相應措施 2015/12/3 1.3 因應行政院環保署開放平台修改服務網址 2016/9/7 1.4 配合行政院環保署開放平台政策,開放資料的取得改為登記制
bug fixed

windows 瀏覽特定網頁正常顯示,手機瀏覽卻出 404 Error Page

遇到大麻煩,有誰可以給點想法的。

問題敘述:
是關於抓取行政院環保署開放資料的異常,先前寫的一個 app 陽光空氣水,想藉由 app 呈現在台灣的一些環境指標,自從前幾個禮拜環保署的資料出現負載過高的問題後,經過環保署的努力,據說服務已恢復,但是從此之後 app 就抓不到資料了,出現 404: Not found 的錯誤。

詭異的是在電腦的瀏覽器確實可以正常顯示,可是一換到手機,不過是手機瀏覽網頁或是 app 透過 HttpUrlConnection、Volley 都是 404。

網路上這討論很少,高度相關的就以下這兩個
下载图片404,但是浏览器可以正常打开显示
404 when accessing Tomcat with HttpUrlConnection, 200 from browser

但是都無解,試過多款手機仍是一樣的問題,目前暫定問題是在 Server side,也許行政院環保署開放資料平台真的是 Tomcat,也許真的是 Tomcat 的問題,很多的也許,但仍無法解決我的問題。

---------------------------------------------------------
2015/12/01 回覆

看來需要好好了解網頁開發怎麼玩了;經過多日的追查及驗證後,確認問題是開放資料庫的網頁問題,但是我非常不開心,因為開放資料庫將 android 的網頁存取權限封鎖了,意思是只要透過 android 到行政院環保署的網頁及子網頁,都會得到 404:Not found 的錯誤網頁。

有興趣的可以試試看,在手機上用 Chrome 瀏覽
紫外線即時監測資料
會出現 404 - 找不到檔案或目錄。
只要切換到電腦版網站就可以正常瀏覽。
這是透過 html request header User-Agent string,得知 request device 是什麼設備,藉此讓網頁做出客製化的對應。而行政院環保署開放平台將所有 android device 全部封鎖。

這樣的差別待遇讓我很不開心,站在行政院環保署的立場,我找不到理由說服自己,開放資料庫的立意不就是"開放",如今封鎖特定裝置是什麼意思?

所以接下來就是保存證據,問問行政院環保署理由是什麼,再來跟大家報告。

--------------------------------…

Deep Linking

在使用手機、平板瀏覽 google 查詢結果時,若該連結可以直接導向手機已安裝的 app,
那會是怎樣的體驗呢?
現在有許多 app 相繼支援 google Deep Linking,增加使用者對 app 的黏著度,
如 google+、twitter,你的 app 也可以唷。

怎麼作呢?
我這邊稍作簡介,詳細可至 Android Deep Link 參考。
主要在 AndroidManifest.xml 加上 intent-filter 標籤,
範例:

<activity android:name="com.recipe_app.client.RecipeActivity"           android:label="@string/app_name" >     <intent-filter android:label="@string/app_name">         <action android:name="android.intent.action.VIEW" />         <category android:name="android.intent.category.DEFAULT" />         <category android:name="android.intent.category.BROWSABLE" /> <!-- Accepts URIs that begin with "http://recipe-app.com/recipe" -->         <data android:scheme="http"               android:host="recipe-app.com"               android:pathPrefix="/recipe" />     </intent-filter> </activity>
<data> 裡可設置網頁的各個 patte…

RxJava 顛覆傳統

11/11 看完 给 Android 开发者的 RxJava 详解,我想是沒辦法寫的比這篇好的。直接看吧!

11/12 看到一篇手把手教的 slide 推薦大家看,Reactive X 响应式编程

這篇最後以瑪莉兄弟的遊戲製作來教學,真是太有感了。

11/13 那些年我们错过的响应式编程 這篇還不錯,可是最後幾段沒有很了解,有時間在反覆咀嚼。

RxJava 原始碼解析系列文章
谜之RxJava (一) —— 最基本的观察者模式
谜之RxJava (二) —— Magic Lift
迷之RxJava (三)—— 线程切换
迷之RxJava(四)—— Retrofit和RxJava的基情


我都是看這邊介紹的文章逐篇看,慢慢體會 RxJava 的強大,相信自己一定會學會,就看吧!
Awesome-RxJava

Proguard 程式碼混淆

踏入 Android 開發,雖然早已注意到 proguard 這阻止反編譯的混淆程式碼的作法,可是一點也不擔心有人將自己的 apk 反編譯,因為真的沒什麼好看的,看了還浪費時間。 XD

不過倒是擔心被看到寫那麼爛的 Code,所以還是稍作些了解 proguard 的用法。

Step 1: 打開 app.gradle  (專案目錄下 app 裡的 build.gradle)

預設
buildTypes { release { minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'} }
將 minifyEnabled false 改成 true,表示啟用 proguard

proguard-android.txt 是預設的混淆文件,路徑在 ${sdk.dir}/tools/proguard/proguard-android.txt

proguard-rules.pro 是在專案目錄下 app 裡,用來設定那些檔案不要混淆的一些設定。

詳細語法可以參考下方連結或是問問 google 大神,這邊就不占版面了。


proguard-rules.pro 裡面常用的 class 就不要混淆了,以免因混淆後找不到相應的 class,造成編譯異常。

以下是常用的
-keep public class * extends Android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * exten…

Android M run-time permissions request

圖片
首次在 Google Play Developer Console 看到 "當機與ANR" 有一筆 Exception 出現


訊息如下 java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.google.android.GoogleCamera/com.android.camera.CaptureActivity clip={text/uri-list U:file:///storage/emulated/0/Pictures/Temp/temp.png} (has extras) } from ProcessRecord{82c52a4 13909:tools.sporting.com.pictranslate/u0a36} (pid=13909, uid=10036) with revoked permission android.permission.CAMERA

Google 大神說從 Android M 以上版本的權限取得有改變。

除了以往 mainifests 要求的權限外,在執行時期還要確認使用者是否允許權限使用,

使用者不允許的話還要說明權限需求的原因。

那些權限須要特別注意呢?
Android 6.0 新增的權限模式 - 執行時要求權限 (Runtime Permissions)

-----------------
後記

手邊沒有Android M的手機可以測試,昨天改的版本是否可正常運作在 Android M以上版本有待確認。

看完 Issue 188073 的討論後,我的理解是以往透過 intent 去使用系統的 MediaStore.ACTION_IMAGE_CAPTURE、MediaStore.ACTION_VIDEO_CAPTURE、Intent.ACTION_CALL 是不須要在 mainifests 宣告權限,可是在這 Android M 以上版本的政策實施後,除了原始 app 須要宣告權限,還要在呼叫 intent 時確認權限的取得,到下一個 camera app 後,會再確認一次權限。 這無疑是對使用者跟開發人員造成困擾,看來…

app 開發心得

廣告

1. 不要放在 Main Activity,避免拖累開啟速度,影響使用者心情。按下 app 馬上看到程式畫面,是令人心情愉悅的。 譯圖文 工具類的 app 越直接快速越好。可以放在使用者執行完某個動作,需要時間等待時的頁面。

2. 插頁廣告感覺很差,除非你的 app 夠吸引人,能夠讓人無視插頁廣告的不適。
雖然插頁廣告可增加 "點擊率" (誤擊?),可是對少少下載量的 app 還是弊大於利呀。

~ 其他有想到再補充 ~


Android M 以上版本權限取得變更

Google 大神說從 Android M 以上版本的權限取得有改變。

除了以往 mainifests 要求的權限外,在執行時期還要確認使用者是否允許權限使用,

使用者不允許的話還要說明權限需求的原因。

如果 target SDK version 設在 Android 6.0 以上版本要記得使用權限前要實作相應的檢查。



// Identifier for the permission request private static final int GET_CAMERA_PERMISSIONS_REQUEST = 1; public void getPermissionToGetCamera() { // 1) Use the support library version ContextCompat.checkSelfPermission(...) to avoid // checking the build version since Context.checkSelfPermission(...) is only available // in Marshmallow // 2) Always check for permission (even if permission has already been granted) // since the user can revoke permissions at any time through Settings if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) !…

台北市安心地圖

圖片
台北市安心地圖

(非官方安心地圖)

台北市政府推竊盜地圖「霍桑效應」解決問題,

自10月13日起開放住宅竊盜、汽車竊盜 及自行車竊盜案3項資料。

此為視覺化上述三項公開資料的 app。

目前 app 內含上述三項公開資料,將隨台北市公開資料的項目及資料內容作不定期更新。

三項主題


自動提示 app 更新

自動提示資料更新


手動更新


熱點圖

資料列表


抱怨一下,每個月核對這個開放資料是花最多時間,原則上數據是每月累加的,
也就是只要針對上個月的資料作整理就好了,上上個月以前的資料應該是固定不動的,
可是不是這樣,一年多以前的資料也在變,我都不知道這資料是對還是錯了。

1. 每月更新資料,但不一定哪一天,這沒有SOP嗎?
2. 每月更新的資料,兩個月內的資料異動還可以忍受,連去年的資料也在更新,
資料是對還是錯呀!

拜託要提供資料,也請提供一定的品質
-----------------------------------

2015/11/4 透過資料更新,新增易發生婦幼犯罪被害地點


2015/11/9 依台北市政府公開資料更新汽車竊盜、自行車竊盜、住宅竊盜 104年1-10月份熱點
2015/12/9 依台北市政府公開資料更新汽車竊盜、自行車竊盜、住宅竊盜 104年1-11月份熱點
2016/1/8 依台北市政府公開資料更新汽車竊盜、自行車竊盜、住宅竊盜 104年1-12月份熱點
2016/2/3 依台北市政府公開資料更新易發生婦幼犯罪被害地點104年7-12月份資料
2016/3/11 依台北市政府公開資料更新汽車竊盜、自行車竊盜、住宅竊盜 104/01~105/02 熱點
2016/4/19 依台北市政府公開資料更新汽車竊盜、自行車竊盜、住宅竊盜 104/01~105/03 熱點
2016/4/20 依台北市政府公開資料更新易發生婦幼犯罪被害地點104年10-12月份資料
2016/5/12 依台北市政府公開資料更新汽車竊盜、自行車竊盜、住宅竊盜 104/01~105/04 熱點
2016/6/21 依台北市政府公開資料更新汽車竊盜、自行車竊盜、住宅竊盜 104/01~105/05 熱點
2016/6/29 新增每月及每季台北市各區域事件趨勢圖, 並調整為橫屏顯示

2016/7/15 依台北市政府公開資料更新汽車竊盜、自行車竊盜、住宅竊盜 104/01~105…

譯圖文

圖片
譯圖文

還記得沒多久前,前一篇 OCR and translate online (trial) 寫到要精緻化後上架,

提供給大家使用。雖然在 Google translate 打擊之下,一度想放棄上架,

不過既然都寫完了,就花點時間重新打包,視使用狀況看是要繼續擴充下去,

或是就到此為止吧。

既然是 app 網誌,總不能請大家連到前一個網頁看介紹,所以還是重新打一下介紹。

--------------------------------------

使用情境:

手機瀏覽網頁,想查英文單字或是走在路上看到想查的英文單字。

懶得背起單字、輸入到手機查詢時,可藉由手機相機拍照或是手機螢幕截圖,

透過該 app 進行文字識別後即時翻譯。

重新發佈 app 截圖:


手機正在瀏覽 BBC,想整段翻譯
直接截取螢幕畫面

app 主畫面,用大圖示及引導方式一步步完成使用 應該很顯而易見吧! 拍照載入或是讀取檔案載入

載入圖片


選擇左下角的截圖按鈕,用拖拉方式進行截圖

截圖結果

點選右下角Next進行文字辨識及翻譯,注意須連網才有翻譯功能,否則只能進行文字辨識


--------------------------------------

v3.0 擴充畫面



後續擴充說明:

目前僅支前圖檔中英文文字辨識,即時翻譯繁體中文。

將來視 app 使用狀況擴充文字辨識的語言及翻譯的目標語言

2015/11/09 v2.0 增加 Android M 以上版本執行期間 Camera 權限請求 2015/11/26 v3.0 增加多國語言翻譯功能  2017/05/26 v4.0 update Translation API

--------------------------------------

載點:

譯圖文



OCR and translate online (trial)

圖片
OCR and translate online (trial) 
各位看官有沒有這種經驗,

用手機看些網頁. 看到一些不懂的英文字,

想要查看看是什麼意思,偏偏該死的網頁又將複製功能鎖起來,

只能用那小小的腦袋將單字背起來,再跳到其它的 app 或網頁查單字, 

可是哥的腦袋不好使呀,常背了前面忘了後面,總是在兩個不同 app 切來切去。

不要叫哥先寫下來再查或是拿字典書來查,哥就想把手指頭黏在螢幕上呀。

寫了下面這支 app,也解決了哥的問題。 用上了 OCR 文字辨識及線上即時翻譯功能。
不多說,看說明

這是哥平常在看的網頁 (其實是為了 Demo)


OCRTest 名字取得這麼不專業,就知道 UI 慘不忍睹

Camera : 拍照功能,生活中看到招牌或 DM 上艱澀的英文單字,就把它拍下來
Picture :  載入手機圖片
Crop : 將載入的圖片截圖,去除不必要的圖案或字樣,以免文字辨識沒有用的怪字
OCR : 文字辨識
Translate : 線上即時翻譯 (這邊用上 Microsoft Marketplace Azure : Microsoft Translator 2,000,000 bytes/month is free)


預覽畫面


Crop 截圖


截圖預覽


OCR 文字辨識


Translate 線上即時翻譯

就是懶惰 ~ ~ ~ ----------------------------------------------------
2015-10-13 update

So sad...
發現 google translate 也有作這功能,當然是更好。
還有 Word Lens 即時翻譯、離線翻譯各國語言。
本想更精緻化這 app 後上架的念頭,一下就消滅了。

那來檢討一下這 app 開發過程得到什麼好了。
1. 如何載入其他人開發的 lib
2. 文字辨識的可能性
3. 加深對 intent 理解
4. Microsoft cloud platform 的使用

協尋毛小孩

圖片
協尋毛小孩
焦急的失主,無助的毛小孩
需要各位的協助,找到回家的路。
遺失的毛小孩,也許就在你我身邊。


使用行政院農委會提供的開放資料平台,
建置人性化查詢介面,期許更多的開放資料,創造友善社會。








--------------------------------------
PS. 可惜行政院農委會並未提供毛小孩圖片,單靠文字還是很難去協助找尋。
後記: Version 1.4.0.3 毛小孩圖片轉至寵物管理資訊平台動態載入 (應該更早想到這方法的... 慚愧)

2015/4/281.4.0.2 修復 bug2015/11/41.4.0.3
1. 加強使用者體驗,移除插頁廣告
2. 參考寵物登記管理資訊網資料載入遺失寵物圖片
3. 聯絡失主電話、email 快速撥號及發信
--------------------------------------

載點:

協尋毛小孩