兼容7.0代码 经过个人验证的
1.在manifest的application节点下添加
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.yousheng.wallet.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
2.在res目录下创建xml文件 创建file_paths文件
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!--name创建file时的路径例如 File file=new File(getFilesDir(),"apk");-->
<!--path为apk路径下的-->
<files-path name="apk/" path="." /><!--getFilesDir()-->
<external-files-path name="apk/" path="." /><!--getExternalFilesDir-->
</paths>
3.安装 这里对7.0已经处理过了
/**下载完成直接更新apk*/
private void installApk(Context context,File apkfile) {
Intent i = new Intent(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= 24) { //适配安卓7.0
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_ACTIVITY_NEW_TASK);
Uri apkFileUri = FileProvider.getUriForFile(context,
BuildConfig.APPLICATION_ID+".fileprovider", apkfile);
i.setDataAndType(apkFileUri, "application/vnd.android.package-archive");
} else {
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setDataAndType(Uri.parse("file://" + apkfile.getAbsolutePath()),
"application/vnd.android.package-archive");// File.toString()会返回路径信息
}
context.startActivity(i);
}
至此已经完成了 总感觉有点笼统 我整理了一下我的下载类 下面贴出来 但是上面的1,2步骤是必须要的
/**
* Created by :方燚
* Time :2018/5/5.
* Description: 兼容7.0以上
*/
public class DownloadAPKUtil {
/**
* 获取服务器上的版本
* @param context 上下文
* @param url 获取版本地址
*/
private void getVersion(final Context context,String url) {
/**自定义的加载框 可以不用 */
LoadDialog.show(context);
/**自己封装的网络框架 可替换为自己的*/
HttpUtil mHttpUtil= HttpUtil.getInstance(context);
// get方式请求
mHttpUtil.setUrl(url).get().execute(new HttpListener() {
@Override
public void onError(Exception e) {
// 网络访问失败回调
Toast.makeText(context,"已经是最新版本了",Toast.LENGTH_SHORT).show();
LoadDialog.dismiss(context);
}
@Override
public void onSuccess(String result) {
// 网络访问成功
LoadDialog.dismiss(context);
// 解析json
VersionBean bean= JsonUtil.getObjectFromString(result,VersionBean.class);
// 判断返回的状态码
if(bean.getStatus()==200){
// 获取当前手机的版本 begin--------
// 获取packagemanager的实例
PackageManager packageManager = context.getPackageManager();
// getPackageName()是你当前类的包名,0代表是获取版本信息
PackageInfo packInfo = null;
try {
packInfo = packageManager.getPackageInfo(context.getPackageName(),0);
String version = packInfo.versionName;
// 获取当前手机版本结束end---------------
// 和服务器的版本做比较
if(!version.equals(bean.getData().getApp_version())){
// 版本不同有新版本 弹出dialog
showDialog(context);
}else{
Toast.makeText(context,"已经是最新版本了",Toast.LENGTH_SHORT).show();
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}
});
}
/**弹出dialog*/
public void showDialog(final Context context){
Activity activity= (Activity) context;
// dialog的布局
View view = LayoutInflater.from(context).inflate(R.layout.update_layout,(ViewGroup)activity.findViewById(android.R.id.content), false);
// 初始化dialog 为自己封装
final BaseDialog dialog = initDialog(context,view);
TextView update= dialog.getView(R.id.update);
TextView pro = dialog.getView(R.id.p);
// 点击下载的点击事件
update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
downloadAPK(context,dialog);
}
});
TextView cancle= dialog.getView(R.id.cancle);
cancle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
dialog.show();
}
/**根据view初始化不同的dialog*/
private static BaseDialog initDialog(Context context , View view){
return new BaseDialog.Builder(context)
.setContentView(view)
.addDefaultAnimation()
.setCancelable(true)
.setWidthAndHeight(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT)
.create();
}
/**下载APK*/
public void downloadAPK(final Context context, final BaseDialog dialog){
// 获取应用外部文件路径 好处不需要去申请读写权限
File file=new File(context.getExternalFilesDir(null),"apk");
// 如果之前有该文件就删除
if(file.exists()){
deleteDir(file);
}
// 再从新创建文件夹
if (!file.exists()) {
file.mkdir();
}
HttpUtil mHttpUtil=HttpUtil.getInstance(context);
String url="https://wallet.unicorndc.com/static/app-release.apk";
// 下载apk
mHttpUtil.setUrl(url).setFileName(file.getAbsolutePath()).down().execute(new HttpListener() {
@Override
public void onError(Exception e) {
dialog.dismiss();
}
@Override
public void onSuccess(String result) {
}
@Override
public void onDownloading(int p) {
// 下载进度回调
super.onDownloading(p);
LogUtil.d("TAG",p+"");
dialog.setText(R.id.p,"已下载:"+p+"%");
}
@Override
public void onSuccessFile(File result) {
super.onSuccessFile(result);
// apk下载成功
LogUtil.d("TAG",result.getAbsolutePath());
// 安装apk
installApk(context,result);
dialog.dismiss();
}
});
}
/**下载完成直接更新apk*/
private void installApk(Context context,File apkfile) {
Intent i = new Intent(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= 24) { //适配安卓7.0
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_ACTIVITY_NEW_TASK);
Uri apkFileUri = FileProvider.getUriForFile(context,
BuildConfig.APPLICATION_ID+".fileprovider", apkfile);
i.setDataAndType(apkFileUri, "application/vnd.android.package-archive");
} else {
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setDataAndType(Uri.parse("file://" + apkfile.getAbsolutePath()),
"application/vnd.android.package-archive");// File.toString()会返回路径信息
}
context.startActivity(i);
}
/**
* 递归删除目录下的所有文件及子目录下所有文件
*
* @param dir 将要删除的文件目录
* @return boolean Returns "true" if all deletions were successful. If a
* deletion fails, the method stops attempting to delete and returns
* "false".
*/
private boolean deleteDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
// 递归删除目录中的子目录下
for (int i = 0; i < children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}
// 目录此时为空,可以删除
return true;
}
框架自行更换就可以了。。
网友评论