精华内容
下载资源
问答
  • Android APP自动升级安装失败

    千次阅读 2018-09-24 17:32:45
    ##Android APP自动升级安装失败 ###概述 自动升级在APP中是一个非常常见的功能,当你的应用有更新时,可以提醒用户升级甚至在必要时可强制用户升级。但随着系统版本的更新,安装apk的权限也在收紧,导致一些APP在高...

    Android APP自动升级安装失败

    概述

    自动升级在APP中是一个非常常见的功能,当你的应用有更新时,可以提醒用户升级甚至在必要时可强制用户升级。但随着系统版本的更新,安装apk的权限也在收紧,导致一些APP在高版本的机器上升级失败。这时就有必要了解一下如何处理这样的问题了。

    权限机制

    在Android7.0的发布介绍中提到了一些文件系统权限方面的修改。官网:https://developer.android.google.cn/about/versions/nougat/android-7.0-changes

    以下是官网的译文(用google翻译的网页)

    权限更改

    Android 7.0包含可能会影响您的应用的权限更改。

    文件系统权限更改

    为了提高私人文件的安全性,针对Android 7.0或更高版本的应用的私人目录限制了访问权限(0700)。此设置可防止私有文件的元数据泄漏,例如其大小或存在。此权限更改有多种副作用:

    所有者不应再放宽私有文件的文件权限,并且使用MODE_WORLD_READABLE和/或 尝试执行此操作 MODE_WORLD_WRITEABLE将触发a SecurityException。

    注意:截至目前,此限制尚未完全执行。应用程序仍可使用本机API或FileAPI 修改其私人目录的权限。但是,我们强烈建议不要放宽对私人目录的权限。

    file://在包域外 传递URI可能会使接收者无法访问路径。因此,尝试传递 file://URI触发器a FileUriExposedException。共享私有文件内容的推荐方法是使用FileProvider。

    该DownloadManager可以通过文件名不再私下共享存储的文件。传统应用程序在访问时可能会以无法访问的路径结束COLUMN_LOCAL_FILENAME。针对Android 7.0或更高版本的应用会SecurityException在尝试访问时 触发COLUMN_LOCAL_FILENAME。通过使用DownloadManager.Request.setDestinationInExternalFilesDir()或 DownloadManager.Request.setDestinationInExternalPublicDir() 仍然可以访问路径 来将下载位置设置为公共位置的旧应用程序 COLUMN_LOCAL_FILENAME,但强烈建议不要使用此方法。访问由文件公开的文件的首选方法DownloadManager是使用 ContentResolver.openFileDescriptor()。

    在应用之间共享文件

    对于定位到Android 7.0的应用,Android框架会强制执行StrictModeAPI策略,禁止file://在应用外部公开URI。如果包含文件URI的intent离开您的应用程序,则该应用程序将失败并显示FileUriExposedException异常。

    要在应用程序之间共享文件,您应该发送content://URI并授予URI临时访问权限。授予此权限的最简单方法是使用FileProvider该类。有关权限和共享文件的详细信息,请参阅共享文件。

    大意就是说文件的访问权限提高了,不能直接使用file://的方式来共享文件了,应该使用
    content://URI的方式来共享文件,并使用FileProvider类来授权。

    应对方法

    老代码一般都是用下面这样的代码来安装下载下来的apk的:

     public static void installAPk(Context context, File apkFile) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            Uri uri = Uri.fromFile(apkFile);
            intent.setDataAndType(uri, "application/vnd.android.package-archive");
            context.startActivity(intent);
        }
    

    但7.0以上要求使用FileProvider来授权访问文件。

    根据官方的指引:https://developer.android.google.cn/reference/android/support/v4/content/FileProvider,大概需要以下几个步骤:

    1. 定义FileProvider
    2. 指定可用文件
    3. 生成文件的URI
    4. 授予URI临时权限
    5. 向另一个应用程序提供内容URI

    下面来一一介绍一下这几个步骤:

    一、定义FileProvider

    在AndroidManifest.xml文件中注册provider

    <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.xbd.file.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <!-- 元数据 -->
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/update_apk_paths" />
    </provider>
    

    解释一下几个参数的含义:

    android:name
    文件提供者的类名,固定为"android.support.v4.content.FileProvider",如果你很牛逼也可以自己写一个类并继承"android.support.v4.content.FileProvider",然后实现一些扩展的功能。

    android:authorities
    权限的名字,用于标识provider提供的内容,可以有多个名字,各名字之间用“;”隔开。为了不和其它名字冲突一般使用域名的形式来描述

    android:exported
    内容提供者是否可供其他应用程序使用,在这里不需要,所以填false

    android:grantUriPermissions
    是否授权给那些本来无权限访问的人临时访问内容提供者提供的内容,这里填true,不然就没法访问到这个文件了。

    二、指定可用的文件

    为了指定需要访问的文件,需要在一个xml文件中指定被访问文件的存储路径。
    在res目录下新建一个xml文件夹,然后新建一个文件:update_apk_paths.xml(文件名自己随意起),内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <paths>
        <!--
        files-path:          该方式提供在应用的内部存储区的文件/子目录的文件。
                              它对应Context.getFilesDir返回的路径:eg:”/data/data/com.jph.simple/files”。
    
        cache-path:          该方式提供在应用的内部存储区的缓存子目录的文件。
                              它对应getCacheDir返回的路径:eg:“/data/data/com.jph.simple/cache”;
    
        external-path:       该方式提供在外部存储区域根目录下的文件。
                              它对应Environment.getExternalStorageDirectory返回的路径:
    
        external-cache-path: 该方式提供在应用的外部存储区根目录的下的文件。
                              它对应Context#getExternalFilesDir(String) Context.getExternalFilesDir(null)
                              返回的路径。eg:”/storage/emulated/0/Android/data/com.jph.simple/files”
        -->
        <cache-path name="update" path="" />
    </paths>
    </resources>
    

    paths元素下可以有很多子元素,如files-path、cache-path、external-path等,意义在上面的注解中都说明了。这里我使用了 cache-path,也就是说我的apk文件存放在了内部存储区的缓存目录中。

    name=“update”
    相当于下面的path的别名,为了把真实的路径隐藏起来,这样就只能看到别名,如果按照这个别名路径去找文件的话肯定是找不到的。这个别名自己随便取,我把它叫做“update”

    path=""
    代表你要分享的真实的子目录名,空字符串代表根目录,注意该值必须是一个子目录,不能是文件名

    综合来讲,以上配置表明:我要分享一个目录供其它人访问,这个目录就是内部存储区的缓存目录的根目录,即 getCacheDir()的返回值。所有根目录及其子目录下的文件都可以被访问,同时我为这缓存目录取了一个别名叫“update”,以混淆视听。

    然后将上面的update_apk_paths.xml文件链接到AndroidManifest.xml中定义的provider中,也就是定义中的“元数据”的内容

    <!-- 元数据 -->
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/update_apk_paths" />	
    

    android:name
    代表资源的类型,此处为固定值"android.support.FILE_PROVIDER_PATHS"

    android:resource
    代表资源文件,即update_apk_paths.xml,但是不要后缀名

    三、生成文件的URI

    用以下方式生成文件的Uri:

    Uri apkUri = FileProvider.getUriForFile(context, "com.xbd.file.provider", apkFile);
    

    其中,第二个参数"com.xbd.file.provider"是在AndroidManifest.xml文件中声明的provider中 android:authorities元素的值,第三个参数apkFile就是下载下来的保存在缓存目录下的apk文件

    四、授予URI临时权限

    授权有很多种方式:这里只说一种,就是通过Intent addFlags()方法,如:

    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    

    五、向另一个应用程序提供内容URI

    用startActivity(intent)启动一个应用就可以了,被启动的应用就有权限访问你提供的文件了,但要注意必须添加这句:

    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    

    实用代码

    综合以上分析,可将原来安装apk的代码改成以下的样子:

    public static void installAPk(Context context, File apkFile) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            // 7.0 以上
            Uri apkUri = FileProvider.getUriForFile(context, "com.xbd.file.provider", apkFile);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
        } else {
            // 7.0以下
            Uri uri = Uri.fromFile(apkFile);
            intent.setDataAndType(uri, "application/vnd.android.package-archive");
        }
        context.startActivity(intent);
    }
    

    当然,还要有前面介绍的配置一起配合使用。



    由于水平有限,如果文中存在错误之处,请大家批评指正,欢迎大家一起来分享、探讨!

    博客:http://blog.csdn.net/MingHuang2017

    GitHub:https://github.com/MingHuang1024

    Email: MingHuang1024@foxmail.com

    微信:724360018

    展开全文
  • 28.Vmware Esxi升级安装,5.5升级至6.0

    千次阅读 2020-06-23 15:07:02
    如果要升级由 vCenter Server 管理的主机,必须先升级 vCenter Server,然后才能升级 ESXi。如果不按正确的顺序进行升级,可能会丢失数据并无法访问服务器。 现在最新版本的vcenter可以直接安装在主机的虚拟机里面,...

    如果要升级由 vCenter Server 管理的主机,必须先升级 vCenter Server,然后才能升级 ESXi。如果不按正确的顺序进行升级,可能会丢失数据并无法访问服务器。
    现在最新版本的vcenter可以直接安装在主机的虚拟机里面,下载对应版本的VCSA安装,虚拟一个linux,然后通过web或者vclient连接管理。由于之前就有一个有盘站Vcenter 5.5.不想浪费,所以还是选择安装windows版本的vcenter 6.0.
    1.安装前准备,下载vcenter安装镜像:VMware-VIMSetup-all-6.0.0-511506.iso
    下载ESXI6.0安装镜像:VMware-VMvisor-Installer-6.0.0.update03-5050593.x86_64-Dell-Customized-A00.iso
    2.安装vcenter,将VIMSetup镜像拷贝至vcenter服务器磁盘,解压缩到本地,运行autorun.exe,根据提示一步步选择安装vcenter 6.0。
    也可以将VIMSetup镜像刻盘,用光盘在windows下安装。Vcenter6.0需要至少8G内存,实际上最好分配10G以上内存。原机器是8G内存,安装的时候还是报错,内存不足。最后加了一条4G内存至12G内存解决。
    3.升级ESXI主机,刻录镜像VMvisor至光盘。将主机运行的虚拟机全部关机,重要数据做好备份。所有虚拟机关机后,在Vcenter上讲主机调整至维护模式,如果升级Vcenter后无法管理旧版本主机,可以用vsphere client直接用根用户连接至主机管理。主机接显示器键盘,镜像盘放入光驱。按F12,输入主机根用户密码重启主机。
    重启主机根据BIOS提示选择进入BOOT MANAGER,DELL服务器是F11,进入启动项选择BIOS BOOT,(用UEFI BOOT从光驱启动一直识别不出镜像盘),选择光驱启动,选择ESXI 6.0 Installer,加载需要一段时间。
    加载完后按提示选择继续,选择磁盘阵列,选择Upgrade ESXI,preserve VMFS datastore,即升级ESXI,保留VMFS格式数据。切记升级安装不要选错,否则可能所有数据丢失。等待一小会升级就会结束。
    4.如果vcenter也已经安装完成,现在可以在vcenter上刷新到主机状态,解除维护模式,检查虚拟机在新ESXI版本运行状态。

    展开全文
  • 树莓派升级安装python3.7

    千次阅读 2020-12-16 16:52:23
    记录树莓派下的升级python3.7 使用普通用户完成以下操作: 更新源 sudo apt update 下载必要软件 sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-...

    记录树莓派下的升级python3.7

    使用普通用户完成以下操作:

    更新源

    sudo apt update
    

    下载必要软件

    sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev curl libbz2-dev
    

    下载python源码包

    curl -O https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz
    

    解压

    tar -xf Python-3.7.3.tar.xz
    cd Python-3.7.3
    

    编译生成make文件。
    这里一定要带上编译参数–with-ssl,该参数是编译python是加入SSL,如果没有在使用pip3时会报错SSL有问题

    ./configure --with-ssl
    

    make

    make
    

    安装

    altinstall 的意思是不覆盖原来系统中的python版本。如果覆盖会出现终端打不开等一些问题。

    sudo make altinstall
    

    将默认python3替换成更新的

    which python3.7
    rm -rf /usr/bin/python3
    sudo ln -s /usr/local/bin/python3.7 /usr/bin/python3
    

    将pip3更换成最新
    这一步不同的系统会有不同。有些系统没有pip3,直接使用即可。

    which pip3.7
    rm -rf /usr/bin/pip3
    sudo ln -s /usr/local/bin/pip3.7 /usr/bin/pip3
    

    报错 lsb_release 找不到
    全局搜索 lsb_release ,找到之后然后删除

    展开全文
  • Ubuntu 18.04下升级安装CMake-3.16.7

    千次阅读 2020-05-29 21:37:47
    tree -L 2 cmake-3.16.7-Linux-x86_64 创建软链接 sudo mv cmake-3.16.7-Linux-x86_64 /opt/cmake-3.16.7 sudo ln -sf /opt/cmake-3.16.7/bin/* /usr/bin/ 执行以下命令可检查安装版本 cmake --version

     

    • 在cmake官方下载对应系统所需版本的文件(资源还在审核中,稍后更新链接)
    wget https://cmake.org/files/v3.16/cmake-3.16.7-Linux-x86_64.tar.gz
    • 解压文件
    tar zxvf cmake-3.16.7-Linux-x86_64.tar.gz
    • 查看解压文件
    tree -L 2 cmake-3.16.7-Linux-x86_64
    • 创建软链接
    sudo mv cmake-3.16.7-Linux-x86_64     /opt/cmake-3.16.7
    sudo ln -sf  /opt/cmake-3.16.7/bin/*    /usr/bin/
    • 执行以下命令可检查安装版本
    cmake --version

     

    展开全文
  • 电脑安装完vs2010后打开,出现提示说需要升级安装Service Pack 1,点“此处”打开链接发现也找不到资源了,
  • Linux系统下如何升级安装Python3.7.1

    千次阅读 2018-09-10 11:09:31
    前提: 利用xshell以及xftp连接上你的虚拟机 ...2:一般Python都是默认安装在usr/bin路径下的,我们,我们利用xftp查看usr/bin下面的文件,可以找到Python2.6,如下所示: 3:在正式开始安装Python3之前,先把...
  • pip升级安装pyMysql

    千次阅读 2016-10-09 13:44:37
    mysqldb支持到python3.4,python3.5可以借用pymysql链接mysql数据库...安装pymysql  升级pip到最新版本  python -m pip install --upgrade pip 升级pip  安装pymysql  pip install PyMySQL​
  • Ubuntu下升级安装gcc-7.5.0教程

    千次阅读 热门讨论 2020-05-22 14:33:28
    最近的工作中需要用到高版本的gcc,系统自带的是5.4.0版本的,这里需要安装的高版本的是7.5.0的,安装过程也是比较坎坷的,也是因为没有搞过这个东西,不熟悉,所以踩了很多坑,耽误了很多时间,不过实践也是学习的...
  • 今天调试自己开发的一款企业级App,发现通过之前的url无法升级安装企业应用,一直提示“无法安装应用程序 因为http://xxx.xxx.xxx证书无效”,折腾了一番,终于在StackOverFlow上找到了答案。在这里分享给大家。 ...
  • 华为电脑管家最新(11.1.1.95)版完美升级安装教程

    万次阅读 热门讨论 2021-07-11 16:55:09
    华为电脑管家最新(11.1.1.95)版完美升级安装教程操作前必看:安装教程第一步第二步第三步第四步第五步 操作前必看: 1.此教程仅适用已经安装旧版本华为电脑管家的电脑(非华为&华为笔记本) 2.仅针对原有一碰...
  • ArcGIS 10.1 升级安装至 ArcGIS 10.2

    千次阅读 2013-09-18 09:21:38
    arcgis 10.2支持从10.1直接升级 相比于卸载旧版本再安装新版本要花费的时间 同时保留各项自定义设置 显然升级是非常节约时间的选择 升级步骤
  • Zabbix4.2升级安装至4.4版本

    千次阅读 2019-10-28 15:34:25
    升级zabbix server安装源: 上面的是官方的,下面是个人测试: # rpm -Uvh https://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpm 3.升级zabbix相关组件,因为这些...
  • Ubuntu 16.04 升级安装 protobuf 3.6+

    千次阅读 2019-04-25 14:24:21
    但是这些源并不是ubuntu的稳定源,虽然能安装成功,但是相关依赖也会跟着升级,很容易把系统弄崩溃,非常不建议这么做。正如本文遇到的情况,系统的桌面和渲染都依赖 li bprotobuf的低级版本,如果升级覆盖掉这些库...
  • centos7内核升级安装和源代码安装

    千次阅读 2018-08-09 10:57:57
    1、内核版本含义  #查看内核 uname -r  3.10.0-862.el7.x86_64 ...进行模块安装 会安装到/lib/modules内  查看 /lib/modules   完成后之后 ,执行 make install 进行内核安装     
  • git安装升级

    千次阅读 2019-07-28 09:27:41
    最近有同事反应idea里面不能敲git命令so..... 如果你装了git我们先卸载掉 windows控制面板 应用和...下面我们来安装:Git-2.22.0-64-bit.exe 重新打开idea 一切正常,完成 ...
  • 升级安装gcc-5.4.0

    千次阅读 2018-08-27 16:45:41
    转载... 1、准备工作 系统自带的gcc版本为4.4.7,升级至5.4.0版本,需要提前准备以下安装包:  gcc-5.4.0.tar.gz 安装包 http://ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.gz gmp-4.3....
  • 升级Anaconda安装程序包

    千次阅读 2019-11-16 16:33:07
    Anaconda安装后,提供了大量的第三方支持包。这些第三方支持包不一定是最新版本,我们需要手动升级。 列出当前版本 pip list --outdated 升级库 选择自己要升级的第三方库,比如numpy pip install --upgrade ...
  • Python(一)- 安装升级

    万次阅读 2019-09-30 21:52:51
    由于前段时间,博主电脑出了点问题,重装了系统,出于... 安装 # 打开终端,新建下载目录 mkdir /usr/local/python37 # 进入安装目录: cd /usr/local/python37 # 也可以进入任意自己想要存放安装包的目录 # 安装 wget ...
  • Mac命令行方式升级安装JDK

    万次阅读 2017-02-16 13:06:35
    命令行方式安装步骤如下: 1. 下载dmg安装包 下载URL:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html#jdk-7u80-oth-JPR 2. 安装前环境检查 java version ...
  • 软件安装升级——rpm

    千次阅读 2018-11-05 10:22:13
    软件安装升级——rpm Linux的自由软件非常多,为了方便软件的管理,目前有两大主流软件管理工具:dpkg和RPM。本文主要介绍RPM的相关信息。 RPM与SRPM RPM是RedHat Package Manager的简称,是一种软件管理机制,...
  • 软件安装升级——yum

    千次阅读 2018-11-06 14:30:11
    软件安装升级——yum yum是通过分析RPM的标头资料后,根据各软件的相关性制作出属性相依时的解决方案,自动处理软件的关联问题,实现软件安装升级、移除。 为了方便用户软件安装升级,distribution 会先释出...
  • Linux升级安装GCC G++ 6.2

    万次阅读 2016-11-24 17:26:03
    使用yum安装是不可能了,各大仓库也没有,只能自己编译安装了。 系统为CentOS 6.5,gcc为4.4.7 1 下载源代码包 当前最新版为6.2: wget http://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.bz2 也可以自行下载...
  • pip升级安装

    万次阅读 2016-02-14 23:55:01
    Pypi即Python包索引功能,它是Python编程语言的一个...有时候安装软件出错,可能是pip的版本过低导致,这个时候就要升级pip了。 1、查看pip的版本号 pip --version 2、升级方法 On Linux or OS X:
  • CentOS6.9完全离线升级安装gcc-5.4.0

    千次阅读 2017-12-01 16:34:10
    1、准备工作系统自带的gcc版本为4.4.7,升级至5.4.0版本,需要提前准备以下安装包: gcc-5.4.0.tar.gz 安装包 http://ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.gzgmp-4.3.2.tar.bz2 gcc依赖包 ftp://ftp.gnu...
  • WIN10安装升级的方法

    千次阅读 2015-07-31 18:03:12
    WIN10 已经出来有两天了,但是似乎很多人都在升级上遇到了各种问题;在这里将带你快速的上手WIN10. 通过两种方式:自带更新方式+U盘安装方式。 最简单的快速的带你入手~~
  • CentOS 7 安装升级 PHP 7.x

    千次阅读 2019-06-04 08:57:04
    安装所须软件: [root@localhost ~]# yum install -y wget yum-utils 由于较新版的 PHP7 并末收录在 CentOS 7,因此须先更新软体来源: [root@localhost ~]# wget https://dl.fedoraproject.org/pub/epel/...
  • mac 安装Node、npm 升级Node、npm

    万次阅读 2018-05-31 16:31:22
    通过npm可以协助开发者安装、卸载、删除、更新Node.件,并且可以通过npm发布自己的插件。那么就好办了,先安装Node后就自带npm了。 通过官网直接下载Node的.pkg包 中文官网download 官网download...
  • 9、因为是升级安装,所以你以前的实例名字是什么,这里还是什么。继续“下一步”。 10、不废话,“下一步”。 11、是否发送错误报告,随便,下一步。 12、“下一步”。 13、点击“升级”按钮进行升级,...
  • 一、这篇博客主要是讲解RPM包管理的安装升级与卸载部分。 包全面与包名区别: 【1】、包全名:操作的包是没有安装的包软件时,使用包全名,并且需要注意路径。 【2】、包名:操作的包是已经安装的软件包时,使用包名...
  • 新版本的tensorflow和keras已经要求cudnn v6了,并且将来会升级到cuda9 和 cudnn7。 cudnn7最大的特点是支持group convolution, 这里原先的环境是cuda8, 将cudnn v5.1升级到 cudnn v6.0.21 [更新中] (cudnn的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 539,554
精华内容 215,821
关键字:

升级安装