美文网首页
android 更新apk兼容7.0 解析包失败

android 更新apk兼容7.0 解析包失败

作者: Lna_35da | 来源:发表于2018-05-05 10:40 被阅读0次

兼容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;
    }

框架自行更换就可以了。。

相关文章

网友评论

      本文标题:android 更新apk兼容7.0 解析包失败

      本文链接:https://www.haomeiwen.com/subject/pqysrftx.html