1. 程式人生 > >JNI DETECTED ERROR IN APPLICATION:java.lang.SecurityExceptionandroid--解決JNI安全許可權異常

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掉。問題也就解決了。