参考教程地址:
https://www.jianshu.com/p/ac5fe346a5b7
https://blog.csdn.net/wanghao200906/article/details/79218051
https://www.cnblogs.com/yishaochu/archive/2017/09/07/7488589.html
http://lazybios.com/2016/12/install-apk-by-intent-compatible-adnroid-n/
https://blog.csdn.net/qq_36707431/article/details/81774055 //跟Android8.0安装权限问题
出现2个问题 卡了好久
第一个问题 从服务器端下载通过retrofit获取到输入流 下载到sdk指定目录 然后 切忌要记得判断
文件或者文件夹是否存在
第二个问题 由于Android7.0以上 安装要安装 权限必须要在配置清单文件中进行配置
配置清单文件的authorities="${applicationId.fileProvider}" //这个fileProvider 注意打小写 一定要跟
java代码里面的intent里面所对应的大小写一致 不然直接gg 报以下错误
Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.PackageItemInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
我的配置清单代码如下: (因为我是在分工程 所以没有运行的Activity)
?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.admin.rxjava">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 请求安装权限 8.0 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<application>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.admin.rxjava.fileProvider" //这里的fileProvider一定要跟 下面的 uri的fileProvider一致
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<activity android:name=".ui.activity.PublishMainActivity"></activity>
</application>
</manifest>
res目录下新建的xml目录的file_paths.xml文件代码如下:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<paths>
<external-path
name="."
path="." />
</paths>
</resources>
app版本升级 拿到服务器端的apk地址 将apk下载到本地的目录 通过Javaio流
// Environment.getExternalStorageDirectory() 那么file_paths文件就是用 <external-path name="." path="." />
public void installApk(Activity activity) {
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
String path = Environment.getExternalStorageDirectory().getPath();
File dir = new File(path);
File file = new File(dir, "gdchent.apk");
if(!file.exists()){
try {
file.createNewFile(); //创建文件
} catch (IOException e) {
e.printStackTrace();
}
}else{
Log.i("gdchent","文件存在");
}
Intent intent = new Intent(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
//小于7.0
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
} else {
//com.example.admin.rxjava
//大于7.0
// 声明需要的临时权限
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
// 第二个参数,即第一步中配置的authorities
String packageName = activity.getApplication().getPackageName();
Log.i("gdchent","package:"+packageName);
Log.i("gdchent","ab_path:"+file.getAbsolutePath());
Uri contentUri = FileProvider.getUriForFile(activity, packageName + ".fileProvider", file);
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
}
activity.startActivity(intent);
}
}
github传送门地址:https://github.com/gdchent/AppUpdateDemo
网友评论