解決Android7.0更新後無法安裝的問題
阿新 • • 發佈:2019-01-10
?
12345678 | if (!apkfile.exists()) { Toast.makeText(mContext, "下載的安裝包不存在" , Toast.LENGTH_SHORT).show(); return ; } Intent install = new Intent(Intent.ACTION_VIEW); install.setDataAndType(Uri.fromFile(apkfile), "application/vnd.android.package-archive" ); install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(install); |
在測試機上一執行,妥妥的能安裝,就此完事,然後我把它打包後發到我自己的手機上(Android7.1.1)上,下載安裝,居然報錯了,然後我的同事就說你看看7.0以上的檔案,好像加了限制了,於是上百度,果然是這樣的,谷歌在Android7.0引入私有目錄被限制訪問和StrictMode API。
那麼我們在7.0以上怎麼適配呢?別急,谷歌給我們提供了方法就是使用FileProvider。知道這個解決方法之後我們就開始寫程式碼吧。
123456789101112131415161718192021 | if (!apkfile.exists()) { Toast.makeText(mContext, "下載的安裝包不存在" , Toast.LENGTH_SHORT).show(); return ; } //判讀版本是否在7.0以上 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //在AndroidManifest中的android:authorities值 Uri apkUri = FileProvider.getUriForFile(mContext, "你的包名.provider" , apkfile); Intent install = new Intent(Intent.ACTION_VIEW); install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //新增這一句表示對目標應用臨時授權該Uri所代表的檔案 install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); install.setDataAndType(apkUri, "application/vnd.android.package-archive" ); mContext.startActivity(install); } else { Intent install = new Intent(Intent.ACTION_VIEW); install.setDataAndType(Uri.fromFile(apkfile), "application/vnd.android.package-archive" ); install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(install); } |
然後在AndroidManifest.xml中配置
?123456789 | <provider android:name= ".service.MyFileProvider" android:authorities= "你的包名.provider" android:exported= "false" android:grantUriPermissions= "true" > <meta-data android:name= "android.support.FILE_PROVIDER_PATHS" android:resource= "@xml/file_paths" /> </provider> |
最後在res資料夾底下新建一個xml資料夾,裡面新建file_paths.xml檔案
?123456 | <? xml version = "1.0" encoding = "utf-8" ?> < resources > < paths > < external-path path = "" name = "download" /> </ paths > </ resources > |
當這些都寫完之後,別以為就此完事了,別忘了許可權
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
最後,別忘了在程式碼中動態申請許可權(6.0的坑)。
123456789 |