解决:安卓7.0以上自动更新无法安装问题
我是做unity開(kāi)發(fā)的,當(dāng)需要調(diào)用安卓原生的功能的時(shí)候往往會(huì)遇到很多權(quán)限的問(wèn)題,沒(méi)有系統(tǒng)的去學(xué)過(guò)安卓,遇到這樣的問(wèn)題只能去百度、google,但是解決這樣問(wèn)題的博客太多了,好多說(shuō)的也都不對(duì),要么有的只解決了7.0的,現(xiàn)在我給大家介紹一下我這邊怎么解決的,包括安卓8.0。
我主要針對(duì)unity開(kāi)發(fā)人員說(shuō)一下,其它的應(yīng)該都差不多,只是調(diào)用方式有區(qū)別。
對(duì)于unity開(kāi)發(fā)人員,怎么調(diào)用安卓,我在這里也不做過(guò)多的說(shuō)明,不會(huì)的可以看一下雨松MOMO的博客,或者其它博客,我現(xiàn)在假設(shè)大家都已經(jīng)創(chuàng)建了一個(gè)最基本安卓項(xiàng)目了,在你現(xiàn)有的項(xiàng)目上來(lái)寫這個(gè)功能。我們需要的調(diào)用安卓的功能其實(shí)很簡(jiǎn)單,就是調(diào)用一下安裝命令,我們只要在unity中給這個(gè)方法傳過(guò)去文件的路徑就可以了,其它自動(dòng)更新邏輯完全可以在unity中寫完了。下面我們來(lái)寫一下添加步驟:
1、我們需要在我們的AndroidManifest.xml 標(biāo)簽中加入
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />這個(gè)代碼< manifest/>的子標(biāo)簽,不要加到< application/>中,這個(gè)權(quán)限是8.0必須的,不加這個(gè)權(quán)限,在7.0下是沒(méi)問(wèn)題的,然后我們解決7.0中的問(wèn)題,7.0做了很大的變動(dòng),所以變動(dòng)也比較大,我們還是先說(shuō)文件中需要添加什么,我們要在< application> 標(biāo)簽中加入
<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="com.XXX.XXX.fileprovider"android:grantUriPermissions="true"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider>在這里我們需要注意兩個(gè)地方,
android:authorities="com.XXX.XXX.fileprovider" //這個(gè)值最好是你的包名,當(dāng)然可以隨便寫,下面還會(huì)提到,需要和這個(gè)保持一致 android:resource="@xml/file_paths" //這個(gè)需要在你自己添加,需要在你的安卓項(xiàng)目目錄結(jié)構(gòu)中res文件夾下面創(chuàng)建xml文件,并創(chuàng)建file_paths.xml file_paths.xml文件中的內(nèi)容為: <?xml version="1.0" encoding="utf-8"?> <resources><paths><external-path path="" name="updateversion_apkfile" /></paths> </resources>2、下面就是在安卓項(xiàng)目中添加的java代碼
public void install(String dir, String apkName) {Uri uri = null;File file = new File(dir, apkName);Intent intent = new Intent(Intent.ACTION_VIEW);if(Build.VERSION.SDK_INT >= 24){ // try{ //這種方式直接可以適配到7.0,8.0的不會(huì)報(bào)錯(cuò),但是安裝不成功 // Method m = StrictMode.class.getMethod("disableDeathOnFileUriExposure"); // m.invoke(null); // }catch(Exception e){ // e.printStackTrace(); // }uri = FileProvider.getUriForFile(getCurrentContext(), "com.XXX.XXX.fileprovider", file); //這個(gè)里面第二個(gè)參數(shù)就是上面提到的,需要和AndroidManifest文件中配置的要一直,不然會(huì)報(bào)錯(cuò),其實(shí)這個(gè)是安卓做的一個(gè)安全機(jī)制,用這個(gè)名字代替你要訪問(wèn)的真是路徑,大家可以打log看一下} else {uri = Uri.fromFile(file);}intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);intent.setDataAndType(uri, "application/vnd.android.package-archive");startActivity(intent);}public static Context getCurrentContext() {if (mContext == null) {mContext = UnityPlayer.currentActivity.getApplicationContext();}return mContext;}這里我只貼出了部分代碼,其它的都和你普通安卓項(xiàng)目一樣,為了大家方便,我可以給大家打好jar包,上傳到我的csdn資源上去。到現(xiàn)在安卓項(xiàng)目寫完了,大家可以打jar包放到你的unity項(xiàng)目中,并配置你unity項(xiàng)目中的AndroidManifest.xml文件和你res/xml/file_paths.xml文件。下面我給大家貼出我安卓項(xiàng)目中的目錄結(jié)構(gòu)圖:
好了,到這里一般做unity的開(kāi)發(fā)人員應(yīng)該都沒(méi)有問(wèn)題,但是有的人可能會(huì)閑麻煩,直接就想要一個(gè)jar包,然后在unity項(xiàng)目里面直接調(diào)用就可以了,為了方便這些人,我這里給出相關(guān)jar包和相關(guān)配置,現(xiàn)在給大家做一個(gè)使用步驟:
1、修改AndroidManifest.xml 文件,按照上面的修改,將android:authorities="com.XXX.XXX.fileprovider"
改為android:authorities="com.autoinstall.fileprovider" jar包里面調(diào)用的也是這個(gè),添加file_paths.xml文件到res/xml中,沒(méi)有文件的自己創(chuàng)建即可。文件下載路徑為:所需資源jar包
2、下面是unity中調(diào)用jar包中install方法的代碼說(shuō)明:
總結(jié)
以上是生活随笔為你收集整理的解决:安卓7.0以上自动更新无法安装问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [yueqian_scut]蓝牙防丢器原
- 下一篇: 《小说朗读器》又增新功能