發表文章

目前顯示的是 11月, 2015的文章

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> 裡可設

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 false proguardFiles 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.Back

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.permiss