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,一经查实,立即删除!

相关文章

docker中centos遇到sudo: command not found

docker中的centos是精简环境&#xff0c;直接安装即可。 yum -y install sudo

Android BroadcastReceiver,广播与进程通讯,APK安装广播,获取已安装列表

1、创建广播接收器&#xff1a; /*** 作者&#xff1a;created by meixi* 邮箱&#xff1a;13164716840163.com* 日期&#xff1a;2018/11/1 09*/ public class MyBroadcastReceiver extends BroadcastReceiver {//需要实现的方法Overridepublic void onReceive(Context conte…

工作205:修改记录取消文本提示ele提示

<!--<el-popoverplacement"left"title"修改记录"width"200"trigger"click"content"修改记录&#xff0c;修改记录。" </el-popover>

vue时间过滤器filter

属于个人代码整理 filters: {formatDate: function (e) {// 获取js 时间戳let time new Date().getTime();// 去掉 js 时间戳后三位time parseInt((time - e) / 1000);// 存储转换值let s;if (time < 60 * 10) {// 十分钟内return 刚刚;} else if (time < 60 * 60 &am…

查看SELinux状态

sestatus -v转载于:https://www.cnblogs.com/aiyr/p/8144724.html

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

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

超级好用 将html字符串,转化为纯文本

原始html字符串&#xff1a; <p style"text-indent: 2em; line-height: 1.5em;">春天像健壮的青年,有铁一般的胳膊和腰脚,他领着我们上前去</p><p><br/></p>目标纯文本&#xff1a; 春天像健壮的青年,有铁一般的胳膊和腰脚,他领着我…

知识准备(1)

网上的sql优化的知识随便一搜都有很多&#xff0c;但是很少有说为什么要这么做的。这里先引入一篇博客&#xff0c;然后我们再根据具体的每一条优化建议做分析 博客转自http://blog.csdn.net/lifuxiangcaohui/article/details/8063657 下面先列出这些法则&#xff0c;大家可以先…

Android 数据解析——Gson与json

查看json数据详情链接&#xff1a;JSON在线解析及格式化验证 - JSON.cn 相比json解析&#xff0c;Gson解析更高效简洁 先看看json解析 JSONObject object new JSONObject(s);String succ object.getString("success"); JSONArray barray object.getJSONArray(&qu…

工作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…

TextView设置缩略显示

1、代码设置 textview.setSingleLine(); textview.setEllipsiz(TextUtils.TruncateAt.valueOf("END"));2、或在xml中设置&#xff1a;android:singleLine"true"android:ellipsize"end" 转载于:https://www.cnblogs.com/ouyangping/p/8158101.htm…

zsh: command not found: service

使用 services 指令&#xff0c;请先安装 brew tap gapple/services 安装完成后使用 brew services start mysql

Android 获取设备ID,手机厂商,运营商,联网方式,获取系统语言,获取时区

权限 <uses-permission android:name"android.permission.READ_PHONE_STATE" /> 安卓6.0需动态获取权限&#xff1a;Android 6.0及以上版本动态申请权限_meixi_android的博客-CSDN博客 获取设备ID 方法1 private String getAndroidId(){String m_szAndroidI…

str和unicode类

在py2中&#xff0c;分为两类&#xff0c;str和unicode 而在py3中&#xff0c;分为两类&#xff0c;byte和str py2中的str等同于py3中的byte 首先明确一点&#xff0c;我们编辑好一段文本&#xff0c;python并不知道我们的文本是以什么格式编码的。如果是纯英文字符还好说&…

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…

【网络流24题】餐巾计划问题(最小费用最大流)

【网络流24题】餐巾计划问题&#xff08;最小费用最大流&#xff09; 题面 COGS 洛谷上的数据范围更大&#xff0c;而且要开longlong 题解 餐巾的来源分为两种&#xff1a; ①新买的 ②旧的拿去洗 所以&#xff0c;两种情况分别建图 先考虑第一种 因为新买餐巾没有任何限制&…