Android apk升级 兼容6.0 7.0 低版本 华为手机

上篇博客写了用DownloadManager,进行下载,结果发现有些手机并不能兼容,查找原因是DownloadManager.Request 的setDestinationInExternalPublicDir()函数问题,这直接根源挂钩,Request 有个默认路径,导致android 7.0的不兼容,具体原因不说,你们也应该知道了(API 禁止向您的应用外公开 file://URI,若要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider类。 如需有关权限和共享文件的更多信息。)那,您说该怎么玩呢?那我们就用原始的HttpURLConnection 下载呗,你想呀,无非就是下载一个文件而已。

多的不说直接上代码,下面是个工具类直接用就可以:

public class UpdataAPP {
public Context context;
private ProgressDialog pBar;
private DownloadApkAsyncTask mAsyncTask = null;
private int apkSzie;

public UpdataAPP(Context context) {
    this.context = context;
}

/**
 * 版本更新----起
 */
// 更新版本要用到的一些信息
public void updateAPP(String url) {
    mAsyncTask = new DownloadApkAsyncTask();
    mAsyncTask.execute(url);
    pBar=new ProgressDialog(context);
    pBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    pBar.setTitle("正在下载");
    pBar.setMessage("请稍候...");
    pBar.setCanceledOnTouchOutside(false);
    pBar.setProgress(0);
    pBar.show();
}


class DownloadApkAsyncTask extends AsyncTask<String, Integer, Integer> {

    private static final int DOWNLOAD_OK = 0x00;
    private static final int DOWNLOAD_ERROR = 0x01;

    private File apkFile = null;
    private File updateDir = null;

    public DownloadApkAsyncTask() {
        super();
    }

    @Override
    protected Integer doInBackground(String... params) {
        try {
            URL url = new URL(params[0]);
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setConnectTimeout(15000);
            InputStream in = connection.getInputStream();
            int curSize = 0;
            int progress = 0;
            int totalSize = connection.getContentLength();
            apkSzie=totalSize;
            pBar.setMax(totalSize); // 设置进度条的总长度
            if (android.os.Environment.MEDIA_MOUNTED
                    .equals(android.os.Environment
                            .getExternalStorageState())) {
                updateDir = new File(Environment
                        .getExternalStorageDirectory().getPath()
                        + "/townnet/apk/");
            } else {
                updateDir = new File("/data/data/" + context.getPackageName()
                        + "/apk/");
            }
            if (!updateDir.exists()) {
                updateDir.mkdirs();
            }
            apkFile = new File(updateDir.getPath(), "townnet.apk");
            if (apkFile.exists()) {
                apkFile.delete();
            }
            // 修改文件夹及安装包的权限,供第三方应用访问
            try {
                Runtime.getRuntime().exec(
                        "chmod 705 " + updateDir.getPath());
                Runtime.getRuntime().exec("chmod 604 " + apkFile.getPath());
            } catch (Exception e) {
                e.printStackTrace();
            }

            int temp;
            byte[] bytes = new byte[1024];
            FileOutputStream out = new FileOutputStream(apkFile);
            while ((temp = in.read(bytes)) != -1) {
                out.write(bytes, 0, temp);
                curSize += temp;
                progress = curSize * 100 / totalSize;
                publishProgress(curSize);
            }
            in.close();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
            return DOWNLOAD_ERROR;
        }
        return DOWNLOAD_OK;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Integer result) {
        super.onPostExecute(result);
        if (result == DOWNLOAD_OK) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            Uri photoURI = FileProvider.getUriForFile(context,
                    context.getPackageName() + ".provider", new File(apkFile.getPath())
            );
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            if (Build.VERSION.SDK_INT >= 24) {

                intent.setDataAndType(photoURI, "application/vnd.android.package-archive");

            } else {
                intent.setDataAndType(Uri.parse("file://" + apkFile.getPath()),
                        "application/vnd.android.package-archive");
            }
            context.startActivity(intent);
        }
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        pBar.setProgress(values[0]); // 这里就是关键的实时更新进度了!
        if (pBar.getProgress()==apkSzie){
            pBar.cancel();
        }
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
        if (pBar!=null){
            pBar.cancel();
        }

    }

}

}

那你说怎么用呢?很简单呀。

//开始下载
new UpdataAPP(mContext).updateAPP(apkDownLoadUrl);

下面是:AndroidManifest.xml的FileProvider:

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/filepaths" />
    </provider>

xml下的filepaths:

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
任意反编译安卓应用 自由定制任何没有加固过的APK安装包,可以修改应用程序图标和应用程序名称、替换界面吗上面的任何文字和图片、翻译或者汉化制作多语言版本,更支持通过高级的SMALI代码,实现对应用软件的破解。 海量安卓应用,游戏模板 提供海量最新最全的应用作为定制模板,可以直接下载后进行反向工程、破解、修改、查看源代码、查看安装包信息等操作(部分应用由于做了加固,暂时不能进行反向工程)。 多渠道打包发布 通过已经打包的APK安装包作为模板,反编译后,动态修改配置文件或者SMALI代码中的渠道标志来实现批量重新多渠道打包,由于不是源代码级别的打包,所以大大提升了批量打包的速度和效率。 随机包名,应用名打包 对于成人影院、成人游戏等APP,经常会出现被手机安全软件和手机管家类软件报毒的情况,可以通过本功能定时随机更换包名和应用名称重新打包,再配合网页下载程序,用户就可以实时下载到最新的安装包,避免了报毒等情况。 查看安卓应用源代码 经过对APK安装包进行反编译,然后通过反映射的方式获取源代码。反编译获取的JAVA代码适合对源代码进行分析,查看应用内部逻辑,不可进行反编译,反编译工程只能在SMALI代码基础上修改。 众多安卓应用反编译应用 软件还提供了大量的小工具,用来查看安装包信息,并可以在手机连接电脑的情况下,查看手机信息、实时日志、安装和管理手机的应用程序、管理手机的文件等等,并可以直接定制修改手机已经安装的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值