最近公司遇到一个关于安装包的问题,出现的情况有两个:一个是8.0的手机下载完成以后不能跳转到系统安装界面进行安装;
另一个就是安装包下载下来以后,在安装过程中出现解析失败现象。
首先针对情况二进行分析:
我拿到的项目是有的android自带的下载安装那一套,安装失败,我换成了平常下载文件的方法,用流去操作,就ok了,说来也奇怪。。。。下载成功以后保存到路径:Environment.getExternalStorageDirectory()+“/vip.apk”;注意这里路径不能一定不能出现中文的,然后跳转到系统升级的界面去
/**
* 升级
*/
void update() {
Intent intent = new Intent(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//Build.VERSION_CODES.N 这里我的版本是24
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK);
Uri contentUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".fileprovider", new File("/storage/emulated/0/vip.apk"));
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
} else {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "vip.apk")), "application/vnd.android.package-archive");
}
startActivity(intent);
}
下面来说第二种:我拿到的项目是没有做android 8.0的兼容的,而且由于android8.0做了更严格的权限,所以根本就不会跳转到系统安装界面去,上面的代码可以继续用,只不过在Mainifest中加一项权限就可以了。
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
最后,说一下上面用到了Android 的组件Content Provider,在在 Mainifest文件中增加provider节点,
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="你的包名.fileprovider"//(如你应用程序包名为com.you.ming,则应该是com.you.ming.fileprovider)
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />//@xml/file_paths 这个表示你要在res的xml目录下新建的一个资源文件,名字叫file_paths
</provider>
节点建完,接下来最后一步,建res目录下xml资源文件,
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="files_root"
path="Android/data/com.you.ming/" />
<external-path
name="external_storage_root"
path="." />
<external-path
name="camera_photos"
path="." />
</paths>
还有人说可以这样建
<resources>
<paths>
<external-path path="" name="download"/>
</paths>
</resources>
(provider作为android四大组件之一,也可以看作是android的存储方式之一),好了,ok了