这2天碰到一个问题,从一个客户预制的应用商店下载的apk,从文件管理这个路径可以正常安装,但是从downloadProvider这里却安装不了,
分析:
在filemanager和downloadprovider两处解析出的mimetype不一样,
在filemanager代码里,查看mimetype类型是:application/vnd.android.package-archive,
而在downloadprovider代码里,查看mimetype类型是:application/octet-stream,
通过比对mimetype的属性表,也就是文件:mime_types.properties 路径在:\code\LINUX\android\packages\apps\CMFileManager\res\raw目录下,
。。。
# Application
apk = APP | application/vnd.android.package-archive | fso_type_app_drawable
pkg = APP | application/octet-stream | fso_type_app_drawable
deb = APP | application/x-debian-package | fso_type_app_drawable
udeb = APP | application/x-debian-package | fso_type_app_drawable
msi = APP | application/x-msdownload | fso_type_app_drawable
rpm = APP | application/x-rpm | fso_type_app_drawable
。。。
只有mime是这个类型 application/vnd.android.package-archive 才是能正常安装的apk。
至于,同一个应用为什么在downloadprovider里面解析出不一样的mimetype,还在分析,这里先做个笔记,后面补充。
接着前面的问题描述,下面是解决方法:
mimetype不同的原因是,在downloadprovider这里,当从网络下载一个应用,在把它写进数据库库时,会去设置它的mimetype,
所以修改方法是在写入数据库时,写入mimetype的值
DownloadProvider.java{
public Uri insert(final Uri uri, final ContentValues values) {
String uriStr = values.getAsString(Downloads.Impl.COLUMN_URI);
String fileNameStr = values.getAsString(Downloads.Impl.COLUMN_FILE_NAME_HINT);
if(uriStr.endsWith(".apk") || fileNameStr.endsWith(".apk")){
filteredValues.put(Downloads.Impl.COLUMN_MIME_TYPE,"application/vnd.android.package-archive");
}
}
}