JNI DETECTED ERROR IN APPLICATION:java.lang.SecurityExceptionandroid--解決JNI安全許可權異常
好幾月了,部落格一直沒有動靜。因為專案太大,太忙了,終於可以空出幾天透透氣哩。
廣東最近天氣不是很好,一個星期連續來了兩個颱風。雖然說下雨天緩解了天氣的悶熱,但是連續好多天下雨,讓整個人都沒那麼精神,沉悶沉悶滴。哈哈,還是陽光明媚好,
心情也好,整個人都好。
今天講講一個最近有人問我的一個android問題。大概是這樣子的,小夥子公司主要是做平板專案,而且是定製平板跑他們的android專案。但是,他們之前一直都
使用華為或者聯想5.1的android版本。然後最近他們公司想要換裝置,換成一種工業平板,很重、很厚那種。因為是工業平板,定製性很強,android系統被閹割得很少。
使用的是android 6.0系統的工業平板,一跑起專案就會崩潰。專案在android5.1平板跑起來完全沒問題,關鍵是沒有做任何混淆,檔案沒被忽略。我就讓他把logcat日誌
發給我看,我看看什麼原因導致程式cash掉。
我貼上logcat日誌,方便看出error
很容易,你可以看到JNI異常,提示的安全異常,一目瞭然。然後後面提示是許可權,因為程式啟動,android系統都會去讀取裝置的一些許可權。很快,那哥們知道了這個READ_
PHONE_STATE許可權,然後他就去查找了專案中清單檔案這個許可權,發現已經有這個許可權了,感覺很奇怪,為什麼還有這個報許可權的異常。
我馬上意識到他應該是引用了第三sdk專案中,專案中也應該存在不安全的許可權。我想到以前專案引用螢石雲,也報了這個異常。因為android6.0以上系統有危險許可權
去判斷,由使用者去選擇是否允許授權。當你沒有讓用去選擇允許授權,應用程式將直接被cash掉。谷歌公司認為如果你強制為使用者開啟許可權是不安全的,肯定不讓你幹啦。
我具體解決方案是這樣子:
1.首先你呼叫的第三方sdk初始化,要去動態判斷許可權
2.當你不知道在哪裡呼叫許可權的時候,你可以只用放到登入介面去判斷許可權
3.動態判斷完許可權,你再去初始化
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) //許可權判斷
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, //新增許可權
1);
} else {
initSDK(); //初始化
}
這是解決危險許可權的問題程式碼,如果放置到登入介面,就會去提醒使用者開啟許可權,這樣android6.0系統就不會cash掉。問題也就解決了。