Android应用安装apk版本升级,适配Android 8.0和Android 10.0下载安装,shell命令安装APK

安装失败,gradle.properties文件下添加  即可

android.injected.testOnly = false

 

shell命令安装

/*** 安装apk** @param path apk文件路径*/
public void installAPK(String path) {Log.i(TAG, "installAPK:" + path);com.dlc.xiaohaitun.utils.ShellUtils utils = new com.dlc.xiaohaitun.utils. ShellUtils();if (utils.isRoot()) {LogPlus.e("###已經root, 開始 pm install ");utils.run("pm install -r " + path, 600 * 1000);} else {spm("没有root");}
}

1、Android 8.0已上版本需要添加必要权限

依赖

implementation 'com.github.lovetuzitong:MultiImageSelector:1.2'

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

2、适配Android 10.0所需xml文件——file_paths

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"><paths><!--external-path用来指定Uri共享的name属性的值可以随便填path属性的值表示共享的具体路径,这里设置为空代表将整个SD卡进行共享,当然你也可以共享存放的图片地址--><external-path name="my_images" path=""/></paths></resources>

3、适配Android 10.0所需provider

<!--authorities是自定义的,调用是复制即可-->
<providerandroid:name="androidx.core.content.FileProvider"android:authorities="a.b.c.fileprovider"android:grantUriPermissions="true"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" />
</provider>

4、根据Android版本,不同安装配置

int version = android.os.Build.VERSION.SDK_INT;
if (version > 24) {//android 7.0-10.0及以上版本installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);installIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);installIntent.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {//android 5.0-7.0installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);installIntent.setDataAndType(Uri.fromFile(updateFile), "application/vnd.android.package-archive");}
startActivity(installIntent);

5、完整demo,实现下载与安装:android应用下载安装apk升级版本实现demo适配Android10_android升级apk,androidapk版本升级-Android文档类资源-CSDN下载

6、在线交流解决下载安装bug:QQ1085220040 

方法二

//在线更新
implementation ('com.teprinciple:updateapputilsx:2.3.0'){exclude group: 'org.jetbrains:annotations:13.0'
}

    public void postApp(AppDownloadBean bean) {//        if (!UserHelper.get().getSettingBean().isWifiUpdate()) {UpdateConfig updateConfig = new UpdateConfig();updateConfig.setNeedCheckMd5(false);updateConfig.setNotifyImgRes(R.mipmap.ic_launcher);updateConfig.setForce(bean.getEnforce() == 1);
//            updateConfig.setForce(true);updateConfig.setDebug(false);updateConfig.setAlwaysShowDownLoadDialog(true);UiConfig uiConfig = new UiConfig();uiConfig.setUiType(UiType.PLENTIFUL);uiConfig.setCustomLayoutId(R.layout.view_update_dialog_plentiful);UpdateAppUtils.getInstance().apkUrl(bean.getDownloadurl()).updateTitle(bean.getTitle()).updateContent(bean.getContent()).uiConfig(uiConfig).updateConfig(updateConfig).setOnInitUiListener(new OnInitUiListener() {@Overridepublic void onInitUpdateUi(@Nullable View view, UpdateConfig updateConfig,  UiConfig uiConfig) {TextView mTitle = view.findViewById(R.id.tv_update_title);TextView mContent = view.findViewById(R.id.tv_update_content);mTitle.setText(bean.getTitle());mContent.setText(Html.fromHtml(bean.getContent()));}}).setUpdateDownloadListener(new UpdateDownloadListener() {@Overridepublic void onStart() {}@Overridepublic void onDownload(int progress) {}@Overridepublic void onFinish() {}@Overridepublic void onError(Throwable e) {}}).update();//        }}/*** 获取版本号** @return 当前应用的版本号*/public int getVersion(Activity activity) {try {PackageManager manager = activity.getPackageManager();PackageInfo info = manager.getPackageInfo(activity.getPackageName(), 0);return info.versionCode;} catch (Exception e) {e.printStackTrace();return 0;}}

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="280dp"android:layout_height="wrap_content"android:background="@drawable/bg_update_dialog"android:paddingBottom="10dp"><ImageViewandroid:id="@+id/iv_update_logo"android:layout_width="80dp"android:layout_height="80dp"android:layout_marginTop="15dp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:srcCompat="@drawable/ic_kzf"/><TextViewandroid:id="@+id/tv_update_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:textColor="@color/text_title"android:textSize="16sp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/iv_update_logo"tools:text="版本更新啦!"/><ScrollViewandroid:id="@+id/scrollView2"android:layout_width="match_parent"android:layout_height="90dp"android:layout_marginTop="10dp"android:overScrollMode="never"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/tv_update_title"><TextViewandroid:id="@+id/tv_update_content"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="top"android:gravity="start"android:lineSpacingExtra="5dp"android:paddingLeft="20dp"android:paddingRight="20dp"android:textColor="@color/text_content"android:textSize="14sp"tools:text="1、快来升级最新版本\n2、这次更漂亮了\n3、快点来吧"/></ScrollView><TextViewandroid:id="@+id/btn_update_sure"android:layout_width="0dp"android:layout_height="35dp"android:layout_marginStart="20dp"android:layout_marginTop="10dp"android:layout_marginEnd="20dp"android:background="@drawable/bg_btn_lv_selector"android:gravity="center"android:text="@string/update_now"android:textColor="@color/white"android:textSize="14sp"app:layout_constraintBottom_toTopOf="@+id/btn_update_cancel"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/scrollView2"app:layout_goneMarginBottom="10dp"/><TextViewandroid:id="@+id/btn_update_cancel"android:layout_width="0dp"android:layout_height="35dp"android:layout_marginStart="20dp"android:layout_marginTop="5dp"android:layout_marginEnd="20dp"android:gravity="center"android:text="@string/update_cancel"android:textColor="@color/text_content"android:textSize="14sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/btn_update_sure"app:layout_goneMarginTop="10dp"/></androidx.constraintlayout.widget.ConstraintLayout>

 

{
    "code":1,
    "msg":"app下载",
    "time":"1615343899",
    "data":{
        "id":9,
        "title":"Android回收员端",
        "downloadurl":"http://szhdljhsxshg.app.xiaozhuschool.com/uploads/20200831/b995d216dc9297ca9350ac48ee7193a0.apk",
        "newversion":"139",
        "packagesize":"1",
        "content":"<p>版本2升级测试</p>",
        "enforce":0,
        "brief":"版本更新啦!"
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 自定义Switch,仿微信开关键Switch

switch (changeFragmentEvent.getViewId()) {//启动设备&#xff08;安卓接收&#xff09;case 1:textView.setText("vvvvv555"changeFragmentEvent.getstring());break;case 2:textView.setText("vvvvv555WWW22");break; } 效果 实现方法 1、drawable下创…

工作207:修改表头按钮样式

<el-card><div style"display: flex;justify-content: space-between"><h1 style"float: left;margin-top: 34px;margin-left: 32px;">我的任务</h1><el-button style"float: right;margin-top: 14px;margin-right: 10p…

Android 带阴影背景图片

1、添加依赖 compile com.dingmouren.paletteimageview:paletteimageview:1.0.7 2、引用 <com.dingmouren.paletteimageview.PaletteImageViewandroid:id"id/palette"android:layout_width"400dp"android:layout_height"400dp"android:lay…

Android画板控件,可以写字,签名,画画并生成图片

1效果图 实现步骤 1、添加画板控件module 画板控件module下载&#xff1a;https://download.csdn.net/download/meixi_android/10774781 2、xml文件 <?xml version"1.0" encoding"utf-8"?> <LinearLayoutandroid:id"id/content_main&q…

工作209:整理订单的重置逻辑

1点击新增 2找到子组件下面的混入 3找到混入 4这一块或许就是重置逻辑

位域操作

看runtime源码时&#xff0c;看到如下声明变量的&#xff0c;变量后分号前加冒号和数字": 数字"即为位域操作。 uintptr_t indexed : 1; 1个字节包含8位&#xff0c;有些变量保存的数据不需要占用这么长的空间&#xff08;比如bool类型&#xff0c;只有两个…

工作211:新的封装组件 秒呀

<!-- 可以动态新增的 tag 列表 --> <template><div><el-tagv-for"(tag, index) in dynamicTags":key"index":closable"true":disable-transitions"false"close"handleClose(tag)">{{ tag }}</el…

HTTP协议简介,数据安全 如何保证http传输安全性,http与https区别

目前大多数网站和app的接口都是采用http协议&#xff0c;但是http协议很容易就通过抓包工具监听到内容&#xff0c;甚至可以篡改内容&#xff0c;为了保证数据不被别人看到和修改&#xff0c;可以通过以下几个方面避免。 重要的数据&#xff0c;要加密&#xff0c;比如用户名密…

mongoose只更新数组中某一项的字段

只是需要一个特殊符号$代表匹配某一项 数据库设计如下&#xff1a; 核心代码如下&#xff1a; // 回答试题public async userPaperAnswer(request: IRequest, _h: IResponse) {const { user_paper_id, question_id, option_user } request.payload;const updOne await Use…

工作213:不能改变父组件值

父组件通过props传值给子组件&#xff0c;如何避免子组件改变props的属性值报错问题 报错Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop’s v…

Android 下拉式抽屉折叠动画

自定义listview工具类1、 public class ViewMeasureUtils {/*** 根据父 View 规则和子 View 的 LayoutParams&#xff0c;计算子类的宽度(width)测量规则** param view*/public static int getChildWidthMeasureSpec(View view, int parentWidthMeasureSpec) {// 获取父 View …

beta冲刺总结

团队成员及分工 姓名学号分工陈家权031502107前端&#xff08;消息模块&#xff09;赖晓连031502118前端&#xff08;问答模块&#xff09;雷晶031502119服务器林巧娜031502125前端&#xff08;首页模块&#xff09;一、项目预期计划及现实进展 项目预期计划现实进展解决页面异…

cesium polygon 悬浮在半空中

效果如下&#xff1a; 代码&#xff1a; let arr [[120.87140893447473, 31.877030830389447, 128.64],[120.87140872335587, 31.876963534304792, 128.64],[120.87202301763111, 31.87696299560446, 128.63],[120.87202432001283, 31.877030271988385, 128.63]]arr [].con…

工作215:点击按钮报错

获取值有点问题 点击同一按钮获取值有问题

phalcon无限重定向

问题 换了个新电脑&#xff0c;后来重新配置phalcon环境。由于用得是windows&#xff0c;而且还用得是2.0.5得版本&#xff0c;官网已经没提供这个版本下载了。而旧电脑已经被格式化了&#xff0c;?。 寻找旧版本 通过一番搜索&#xff0c;发现了一个issue&#xff0c;提到pha…

!KMP算法完整教程

KMP算法完整教程 全称: Knuth_Morris_Pratt Algorithm(KMP算法) 类型: 高级检索算法 功能: 字符串匹配查找 提出者: D.E.Knuth(克努兹),J.H.Morris(莫瑞…