話說,Accipiter君,最近又開始怒學Android了,記得剛開始還是09年學的,現在的手機還是華為出的最早的一款Android手機C8500,那時候就想好好學習Android,賺點小錢,可是~~~沒有堅持學習!遺恨這麼幾年啊!所以現在從頭學習Android確有一種考古探密的感覺啊!進入正題吧,今天就對Android中的一個經典的異常進行一次探密行吧。。
一、進入密室
嗯,一是我想從浩瀚的Internet抓點東西,二是我想給浩瀚的Internet提供點東西,自己搭個服務,如何讓小伙伴們看到了,現在的小伙伴們都流行移動,也得整個移動的平台吧。無奈,寫了幾句代碼,就報了個java.net.ConnectException: socket failed: EACCES (Permission denied)異常。它就像個進入密室的門,從此就得去密室觀光一番。
二、密室見聞
碰到問題,先看了日志,雖然是小白,但是有Internet大神在身邊,相信神馬都不是秘密!馬上就搜索!搜索之,哈,難兄難弟還真多!有直接就是這個問題的【http://www.cnblogs.com/Lewis/p/3298994.html】,還有就是:java.io.IOException: open failed: EACCES (Permission denied)【http://blog.csdn.net/liranke/article/details/17239977】,總結之,都是和Permission【http://hi.baidu.com/spare_h/item/1c1b4ee8941e04f0e1a5d4cd】有關系。 神馬?還有和JDK有關系的【https://www.java.net/node/703177】。
三、密室揭秘
1.最直接的就是java.net.ConnectException: socket failed: EACCES (Permission denied)異常,這個只需要在AndroidManifest.xml中加上:
<uses-permission android:name="android.permission.INTERNET"/>
2.什麼?加上了,還是沒看到真相啊!哦,你加的位置對嗎?【http://stackoverflow.com/questions/8854359/android-open-failed-eacces-permission-denied】中有位置加錯的解決方案,但是我用的Android是不建議加在:
</application>
</manifest>
之間的位置的,給報一個警告,我放到<application>上邊去之後,就好了。
3.啊,位置對了,怎麼還是沒看到真相?那就看你用的Android的版本,這時候的log應該是報:android.os.NetworkOnMainThreadException異常按照【http://www.cnblogs.com/Lewis/p/3298994.html】的說法,基本上4.0之後的版本由於Android考慮到可能引起阻塞,程序假死的情形,就不推薦activity中直接寫了,你要真想用的加上:
1
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
加到什麼位置?這個我是加到了java文件連接請求的開始位置。
但是經過我用3.0的虛擬機測試,報java.lang.SecurityException: Permission denied (missing INTERNET permission?)異常,之後依舊報:
android.os.NetworkOnMainThreadException異常。用同樣的方式也可以解決。
4.正常真相應該已經明了,但是JDK神馬的有影響的話,這裡也有個解決方案:More digging around and it seems the VPN client has IPv6 disabled which is causing issues with JDK7.If I use the following flag -Djava.net.preferIPv4Stack=true I no longer see the errors. 出自【https://www.java.net/node/703177】
5.還是不行,那你可以嘗試所有的都重啟一下,重新來過吧【http://stackoverflow.com/questions/17549920/socket-failed-eacces-permission-denied】
6.我的疑團,經過這幾番的折騰,看了不少的疑點,也有不少的釋疑。但是,我疑團已然還在,奈何!艹,居然把AndroidManifest.xml中的android.permission.INTERNET寫成了android.premission.INTERNET!這~~~~原來一切的疑問都是自己問自己~~~一切的疑團都是自己懷疑自己~~一切的恐怖都是自己嚇唬自己!
探密結束!