[43→100]Android M上的權限獲取問題

問題描述

高德地圖晌涕,在我的小米4(Android 6.0)上出現(xiàn)bug,日志如下:

06-07 17:58:52.761 31095-32257/com.freetek.deepsea W/System.err: java.lang.SecurityException: getCellLocation: Neither user 10549 nor current process has android.permission.ACCESS_COARSE_LOCATION.
06-07 17:58:52.762 31095-32257/com.freetek.deepsea W/System.err:     at android.os.Parcel.readException(Parcel.java:1620)
06-07 17:58:52.763 31095-32257/com.freetek.deepsea W/System.err:     at android.os.Parcel.readException(Parcel.java:1573)
06-07 17:58:52.763 31095-32257/com.freetek.deepsea W/System.err:     at com.android.internal.telephony.ITelephony$Stub$Proxy.getCellLocation(ITelephony.java:2428)
06-07 17:58:52.763 31095-32257/com.freetek.deepsea W/System.err:     at android.telephony.TelephonyManager.getCellLocation(TelephonyManager.java:831)
06-07 17:58:52.763 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.ce.m(CgiManager.java)
06-07 17:58:52.763 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.ce.l(CgiManager.java)
06-07 17:58:52.763 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.ce.f(CgiManager.java)
06-07 17:58:52.763 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.bv.G(APS.java)
06-07 17:58:52.763 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.bv.a(APS.java)
06-07 17:58:52.763 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.d.a(APSServiceCore.java)
06-07 17:58:52.764 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.d.c(APSServiceCore.java)
06-07 17:58:52.764 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.d$a.run(APSServiceCore.java)
06-07 17:58:52.772 31095-32257/com.freetek.deepsea W/System.err: java.lang.reflect.InvocationTargetException
06-07 17:58:52.773 31095-32257/com.freetek.deepsea W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
06-07 17:58:52.773 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.cu.a(Reflect.java)
06-07 17:58:52.773 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.ce.m(CgiManager.java)
06-07 17:58:52.773 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.ce.l(CgiManager.java)
06-07 17:58:52.773 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.ce.f(CgiManager.java)
06-07 17:58:52.773 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.bv.G(APS.java)
06-07 17:58:52.773 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.bv.a(APS.java)
06-07 17:58:52.773 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.d.a(APSServiceCore.java)
06-07 17:58:52.773 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.d.c(APSServiceCore.java)
06-07 17:58:52.773 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.d$a.run(APSServiceCore.java)
06-07 17:58:52.774 31095-32257/com.freetek.deepsea W/System.err: Caused by: java.lang.SecurityException: getAllCellInfo: Neither user 10549 nor current process has android.permission.ACCESS_COARSE_LOCATION.
06-07 17:58:52.774 31095-32257/com.freetek.deepsea W/System.err:     at android.os.Parcel.readException(Parcel.java:1620)
06-07 17:58:52.774 31095-32257/com.freetek.deepsea W/System.err:     at android.os.Parcel.readException(Parcel.java:1573)
06-07 17:58:52.774 31095-32257/com.freetek.deepsea W/System.err:     at com.android.internal.telephony.ITelephony$Stub$Proxy.getAllCellInfo(ITelephony.java:3060)
06-07 17:58:52.774 31095-32257/com.freetek.deepsea W/System.err:     at android.telephony.TelephonyManager.getAllCellInfo(TelephonyManager.java:2899)
06-07 17:58:52.774 31095-32257/com.freetek.deepsea W/System.err:    ... 10 more
06-07 17:58:52.783 31095-32257/com.freetek.deepsea W/System.err: java.lang.SecurityException: getCellLocation: Neither user 10549 nor current process has android.permission.ACCESS_COARSE_LOCATION.
06-07 17:58:52.784 31095-32257/com.freetek.deepsea W/System.err:     at android.os.Parcel.readException(Parcel.java:1620)
06-07 17:58:52.784 31095-32257/com.freetek.deepsea W/System.err:     at android.os.Parcel.readException(Parcel.java:1573)
06-07 17:58:52.784 31095-32257/com.freetek.deepsea W/System.err:     at com.android.internal.telephony.ITelephony$Stub$Proxy.getCellLocation(ITelephony.java:2428)
06-07 17:58:52.784 31095-32257/com.freetek.deepsea W/System.err:     at android.telephony.TelephonyManager.getCellLocation(TelephonyManager.java:831)
06-07 17:58:52.784 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.ce.d(CgiManager.java)
06-07 17:58:52.784 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.bv.G(APS.java)
06-07 17:58:52.784 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.bv.a(APS.java)
06-07 17:58:52.784 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.d.a(APSServiceCore.java)
06-07 17:58:52.784 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.d.c(APSServiceCore.java)
06-07 17:58:52.784 31095-32257/com.freetek.deepsea W/System.err:     at com.loc.d$a.run(APSServiceCore.java)

問題原因

Android M(版本號6.0 api:23)對原來的權限系統(tǒng)做了升級临梗。在6.0之前,Android系統(tǒng)的app的權限是在安裝的時候申請的,用戶同意安裝后刚陡,無需再次申請。

這樣的的設計系統(tǒng)有明顯的弊端株汉。用戶安裝時被app的功能吸引筐乳,不會仔細閱讀權限,一般都直接點擊安裝了乔妈,甚至有些應用基本上申請了app級別的所有權限蝙云。這樣由權限來保障的安全系統(tǒng)幾乎就不起作用了。

所以在很多第三方開發(fā)的Android系統(tǒng)里面路召,會對一些敏感權限勃刨,如 地理位置獲取、打電話股淡、發(fā)短信 進行限制朵你,當app執(zhí)行相關api時,會彈出提醒揣非,讓用戶確認是否可行。

定位提醒.png

6.0上Google也試圖來解決這個問題躲因,但是它的解決方案比第三方要粗暴——開發(fā)者必須在調用接口前再次確定權限早敬,否則直接拒絕。所以就出現(xiàn)了一開始的那個錯誤

java.lang.SecurityException: getCellLocation: Neither user 10549 nor current process has android.permission.ACCESS_COARSE_LOCATION.

吐槽一下:這個解決方式太坑爹了大脉,原生系統(tǒng)應該向miui它們學學搞监,對開發(fā)者友好一點。

問題解決

解決方案有兩種:

  1. 不要用23的sdk編譯镰矿,即 targetSdkVersion和compileSdkVersion不要等于23琐驴。基于兼容性原則,Android對用23已下sdk編譯的app依然使用舊的權限模型绝淡。

  2. 自己在需要用到權限前進行權限判斷宙刘,提醒用戶打開相應的權限。相關代碼參考github的開源工程PermissionsChecker牢酵。

Panda
2016-06-07

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末悬包,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子馍乙,更是在濱河造成了極大的恐慌布近,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丝格,死亡現(xiàn)場離奇詭異撑瞧,居然都是意外死亡,警方通過查閱死者的電腦和手機显蝌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門预伺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人琅束,你說我怎么就攤上這事扭屁。” “怎么了涩禀?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵料滥,是天一觀的道長。 經(jīng)常有香客問我艾船,道長葵腹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任屿岂,我火速辦了婚禮践宴,結果婚禮上,老公的妹妹穿的比我還像新娘爷怀。我一直安慰自己阻肩,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布运授。 她就那樣靜靜地躺著烤惊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吁朦。 梳的紋絲不亂的頭發(fā)上柒室,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音逗宜,去河邊找鬼雄右。 笑死空骚,一個胖子當著我的面吹牛,可吹牛的內容都是我干的擂仍。 我是一名探鬼主播囤屹,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼防楷!你這毒婦竟也來了牺丙?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤复局,失蹤者是張志新(化名)和其女友劉穎冲簿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亿昏,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡峦剔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了角钩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吝沫。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖递礼,靈堂內的尸體忽然破棺而出惨险,到底是詐尸還是另有隱情,我是刑警寧澤脊髓,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布辫愉,位于F島的核電站,受9級特大地震影響将硝,放射性物質發(fā)生泄漏恭朗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一依疼、第九天 我趴在偏房一處隱蔽的房頂上張望痰腮。 院中可真熱鬧,春花似錦律罢、人聲如沸膀值。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沧踏。三九已至,卻和暖如春稀余,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背趋翻。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工睛琳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盒蟆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓师骗,卻偏偏與公主長得像历等,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辟癌,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內容