文章

目前顯示的是 十一月, 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> 裡可設置網頁的各個 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) !…