android App内下载apk 并升级

这篇具有很好参考价值的文章主要介绍了android App内下载apk 并升级。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.检测版本,弹框,确认是否需要升级;

2.下载apk流程;

主要代码

1.下载apk代码;安装APP权限申请;3.文件存储;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class UpdateActivity extends AppCompatActivity {
    private static final String TAG = UpdateActivity.class.getSimpleName();
    private static final int PROGRESS = 100;//进度
    private static final int DOWNLOAD_COMPLETE = 200;//下载完成
    private static final int INSTALL_PERMISS_CODE = 500;//安装权限
    private static final int INSTALL_COMPLETE = 600;
    private Button btnDownInstall;//下载安装
    private static String appDownloadUrl = "your apk url";//下载文件的地址
    private static int down = 0;//状态码
    File file;
    private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            switch (msg.what) {
                case DOWNLOAD_COMPLETE:
                    Toast.makeText(mContext, "下载完成,准备安装!", Toast.LENGTH_SHORT).show();
                    installApk();
                    break;
                case PROGRESS:
                    String result = (String) msg.obj;
                    mTvProgress.setText(result);
                    break;
            }
        }

    };
    private TextView mTvProgress;
    private Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_update);
        initParamsAndValues();
        initView();
    }

    private void initParamsAndValues() {
        mContext = this;
    }

    private void initView() {
        btnDownInstall = (Button) findViewById(R.id.btn_down_install);
        btnDownInstall.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                downFile(appDownloadUrl);
            }
        });
        mTvProgress = findViewById(R.id.tv_progress);
    }

    // 接收到安装完成apk的广播
    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {

            Toast.makeText(context, "安装完成!", Toast.LENGTH_SHORT).show();

            Message message = handler.obtainMessage();
            message.what = INSTALL_COMPLETE;
            handler.sendMessage(message);
        }
    };

    /**
     * 后台在下面一个Apk 下载完成后返回下载好的文件
     *
     * @param httpUrl
     * @return
     */
    private File downFile(final String httpUrl) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL url = new URL(httpUrl);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(5000);
                    FileOutputStream fileOutputStream = null;
                    InputStream inputStream;
                    if (connection.getResponseCode() == 200) {
                        inputStream = connection.getInputStream();
                        if (inputStream != null) {
                            final int appLength = connection.getContentLength();
                            file = getFile(httpUrl);
                            fileOutputStream = new FileOutputStream(file);
                            byte[] buffer = new byte[1024];
                            int length = 0;
                            int total = 0;
                            while ((length = inputStream.read(buffer)) != -1) {
                                //写入文件中
                                fileOutputStream.write(buffer, 0, length);
                                //统计进度
                                total += length;
                                String result = total * 1.0 / appLength * 100 + "%";
                                Message message = handler.obtainMessage();
                                message.what = PROGRESS;
                                message.obj = result;
                                handler.sendMessage(message);
                            }
                            fileOutputStream.close();
                            fileOutputStream.flush();
                        }
                        inputStream.close();
                    }
                    //下载完成,开始安装
                    Message message = handler.obtainMessage();
                    message.what = DOWNLOAD_COMPLETE;
                    handler.sendMessage(message);
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        return file;
    }

    /**
     * 安装APK
     */
    private void installApk() {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        if (file != null && file.exists()){
            // 兼容7.0
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                Uri contentUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileProvider", file);
                intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
                //兼容8.0
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    boolean hasInstallPermission = mContext.getPackageManager().canRequestPackageInstalls();
                    if (!hasInstallPermission) {
                        startInstallPermissionSettingActivity();
                        return;
                    }
                }
            } else {
                // <7.0
                intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }
            // activity任务栈中Activity的个数>0
            if (mContext.getPackageManager().queryIntentActivities(intent, 0).size() > 0) {
                mContext.startActivity(intent);
            }
        }
    }

    private void startInstallPermissionSettingActivity() {
        //注意这个是8.0新API
        Uri packageURI = Uri.parse("package:"+getPackageName());
        Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,packageURI);
        startActivityForResult(intent, INSTALL_PERMISS_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // 授权完成
        if (resultCode == RESULT_OK && requestCode == INSTALL_PERMISS_CODE) {
            Toast.makeText(this,"安装应用",Toast.LENGTH_SHORT).show();
            installApk();
        } else {
            Toast.makeText(this,"授权失败,无法安装应用",Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
        intentFilter.addDataScheme("package");
        // 注册一个广播
        registerReceiver(broadcastReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 解除广播
        unregisterReceiver(broadcastReceiver);
    }

    /**
     * 根据传过来url创建文件
     */
    private File getFile(String url) {
        // 使用缓存目录,这个时候不需要申请存储权限
        // 目录不存在,那么创建
        File dir = new File(getExternalCacheDir(),"download");
        if (!dir.exists()){
            dir.mkdir();
        }
        // 创建文件
        File file = new File(dir,getFilePath(url));
        return file;
    }

    /**
     * 截取出url后面的apk的文件名    
     * @param url    
     * @return
     */
    private String getFilePath(String url) {
        return url.substring(url.lastIndexOf("/"), url.length());
    }
}

兼容Android 12 版本 存储权限处理:

1.新建xml文件;

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <external-cache-path path="/download" name="download"/>
</resources>

2.manifest配置文件:文章来源地址https://www.toymoban.com/news/detail-649265.html


        <provider
            android:authorities="你的包名.fileProvider"
            android:name="androidx.core.content.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true"
            >
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

注,可运行下载链接 APP内升级代码源码

到了这里,关于android App内下载apk 并升级的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android中的app打成apk发现不能安装是什么原因呢?

    1、生成未签名的安装包 Build - Build Bundle(s)/APK(s) - Build APK(s)    会生成一个未签名的apk文件,默认为debug版,可以正常安装使用。 可以 Build - Select Build Variant - 选择生成的apk版本(debug、release),再 Build - Build Bundle(s)/APK(s) - Build APK(s) 生成对应版本的apk文件。 注意:release版本

    2024年02月16日
    浏览(42)
  • 【APP渗透测试】Android APK常用测试工具(Drozer)安装及使用方法介绍

    本篇文章主要介绍 Drozer Android测试工具的安装以及简单使用,后续会持续更新更多使用方法。 Drozer 是 MWR Labs 开发的一款Android安全测试框架。是目前最好的Android安全测试工具之一。其官方文档说道: Drozer允许你一个普通Android应用的身份与其他应用和操作系统交互。 在Web世界

    2024年02月16日
    浏览(48)
  • 使用apktool、aapt2、bundletool将apk转为aab(Android App Bundle)

    上一篇文章我们讲了AAPT2命令行使用总结,里面有个使用场景就是将apk转为aab文件,aab文件是应用上架Google play的指定包格式,下面我们就来实践下 假如我们有这样一个场景需求,一个游戏或者应用接入了我们开发的聚合SDK,然后提供给我们一个apk包,我们拿到这个apk包可以

    2023年04月27日
    浏览(62)
  • 用 Android Studio 打包 uni-app 的安卓apk;手把手教程、巨详细避坑

    Uni-app 离线打包 apk 1. Android Studio 下载 Android Studio官网 2. HBuilderX下载 HBuilderX下载 3. App离线SDK下载 Android 离线SDK - 正式版 下载后解压文件,将 HBuilder-Integrate-AS 重命名 build-template 并拷贝到一个专门打包用的文件夹下作为打包模板 该文件夹中有一个 simpleDemo 文件夹 即 build-temp

    2024年02月04日
    浏览(65)
  • Android App-targetSDKVersion28升级为30

    为什么要修改targetSDKVersion? 1、应用开发平台要求(小米) 2、更好的兼容新版本的手机 有targetSDKVersion的位置: App的targetSDKVersion Module中的targetSDKVersion 引入的第三方库中有targetSDKVersion 修改了App和Module中的targetSDKVersion。 存储权限和存储位置问题 修改原因: Android10(target

    2024年02月02日
    浏览(44)
  • uniapp:实现手机端APP登录强制更新,从本地服务器下载新的apk更新,并使用WebSocket,实时强制在线用户更新

    实现登录即更新,或实时监听更新 本文介绍的是在 App打开启动 的时候调用更新,点击下方链接,查看使用 WebSocket 实现 实时 通知 在线用户 更新。 uniapp:全局消息是推送,实现app在线更新,WebSocket,apk上传: 背景 :内部手持机app开发功能,需要更新的到车间各个手持机上。

    2024年02月03日
    浏览(40)
  • Android 系统级APP 升级方案 OTA全流程

    支持原创,请关注专栏: 高质量文章导航 一.Android ota固件编译 OTA 介绍 OTA ( over the air )升级是 Android 系统提供的标准软件升级方式。它功能强大,提供了 完全升级(完整包)、增量升级模式(差异包),可以通过本地升级,也可以通过网络升级 1.完整包 完整包所包含内容

    2024年02月02日
    浏览(86)
  • Android app targetSdk从28升级到33问题汇总

    问题说明:targetsdkversion升级到12或者以上,设备运行系统至少12的话,如果不动态申请READ PHONE STATE权限则报错SecurityException android12 过程概述: 走到TelephonyRegistryManager#listenFromListener(int subId, @NonNull String pkg, @NonNull String featureId,@NonNull PhoneStateListener listener, @NonNull int events, boole

    2024年02月03日
    浏览(84)
  • 一键搞定centos7的docker+selenium+appium+jenkins+android_app源码打包成apk的环境搭建

    git源码: https://github.com/a376230095/centos7_apkbuild/tree/master 简介 启动项目的start_all.sh,一键构建环境 安装完包含的环境 docker-ce最新版本 selenium运行环境 chrome无头运行 chromedriver是84 appium运行环境 appium 1.18版本 包含appium-docker sdk运行环境 adb 1.0.41 sdk build有29.0.3和28.0.3 - sdk编译环境

    2023年04月08日
    浏览(48)
  • Android实现App内自动升级,适配了安卓7、8及以上版本

            应用发布后,要实现灰度升级控制,如果只依赖各家应用市场是不够的,还需要自己在应用中控制升级逻辑。并且每家应用市场上新审核也是一件很麻烦的事情,尤其像至简网格这样的应用,甚至没在应用市场上架,更不可能依赖它们了。所以必须要在应用中实现自

    2024年02月10日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包