安卓8.0下的应用安装

目录

那么如何处理这个权限呢?

1.应用的安装流程

2.首先申请权限

3.点击按钮进行应用安装

4.检查是否有未知应用来源的权限

5.执行安装流程

到这里就基本就完了,但有几个注意点:


前言:安卓系统升级到8.0之后,Google将未知应用安装权限的开关除掉了(原先打开这个开关所有的应用都会授予此权限),取而代之的是未知来源应用的管理列表,需要在里面打开每个应用的未知来源的安装权限。如果不处理这个未知来源的权限,那么将会阻塞内部应用启动安装过程,会导致应用根本无法更新,只能去应用市场重新下载。


那么如何处理这个权限呢?

1.应用的安装流程

1.先说说8.0之前的安装流程:

从服务器下载应用到本地 >>开启安装应用代码>>安装完成

2.  8.0之后应用安装流程:

从服务器下载应用到本地 >>代码打开安装位置来源应用界面>>授予权限>>开启安装应用代码>>安装完成

其中 “代码打开安装位置来源应用界面”会阻塞安装应用过程只有授予了安装未知应用的权限,才能继续执行安装过程。

3.为了模拟从网络上下载应用更新,我直接在内部存储放置了一个应用,点击安装,直接执行8.0的安装流程。

2.首先申请权限

    <!--读写内部存储权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!--8.0安卓 软件安装需要申请的权限-->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

处理sdcard读取权限,代码如下:

 @TargetApi(Build.VERSION_CODES.M)
    private void checkSdCardPermission() {
        if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            installApk();
        } else {
            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 100);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100 & grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            installApk();
        }
    }
重点是该权限:<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

3.点击按钮进行应用安装

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btn_install).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_install:
                checkInstallPermissionAndInstall();
                break;
        }
    }

代码很简单,一个执行安装的按钮

4.检查是否有未知应用来源的权限

 public void checkInstallPermissionAndInstall() {
        // 如果是8.0系统
        if (Build.VERSION.SDK_INT >= 26) {
            boolean b = getPackageManager().canRequestPackageInstalls();
            // 如果已经打开了安装未知来源的开关
            if (b) {
                checkSdCardPermission();
            } else {
                // 请求打开安装未知应用来源的界面,非运行时权限
                Uri packageURI = Uri.parse("package:" + getPackageName());
                Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,packageURI);
                startActivityForResult(intent, GET_UNKNOWN_APP_SOURCES);
            }
        } else {
            checkSdCardPermission();
        }
    }

注释很清楚,这里只说重点:boolean b = getPackageManager().canRequestPackageInstalls();该行代码检查是否有未知应用来源的权限,如果有直接安装,没有就打开未知应用来源的界面。注意,这和运行时权限的申请是不同的!(很多人把运行时权限搞混了!)或者直接在清单文件中添加权限:

<!--安卓8.0打开apk安装更新-->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

那么就不需要检查未知来源权限了,直接执行installApk方法

在onActivityResult()中处理回调结果,代码如下:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case GET_UNKNOWN_APP_SOURCES:
                // 用户授予了未知来源应用的权限
                if (resultCode == RESULT_OK) {
                    checkSdCardPermission();
                }
                break;
            default:
                break;
        }
    }

5.执行安装流程

执行安装代码:

private void installApk() {
        Uri uri = null;
        File file = new File(downLoadUrl);
        if (!file.exists()) {
            ToastUtil.showToast("文件不存在!");
            return;
        }
        // 安卓7.0及以上
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            uri = FileProvider.getUriForFile(this, getApplicationInfo().packageName + ".FileProvider", file);
        } else {
            uri = Uri.fromFile(file);
        }
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setDataAndType(uri, "application/vnd.android.package-archive");
        startActivity(intent);
    }

这里需要说的是,intent.setDataAndType(uri, "application/vnd.android.package-archive");中uri这个参数,同样需要对7.0及以上的系统进行适配,需要设置provider。

我是将应用直接放在了根目录下:

 private static final String downLoadUrl = Environment.getExternalStorageDirectory() + "/app-debug.apk";

provider配置如下:

        <!--安卓7.0及以上需配置provider -->
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths_public" />
        </provider>

 file_paths_public.xml 文件内容如下:

<paths>
    <!--指定共享的文件夹范围-->
    <external-path
        name="external_storage_root"
        path="." />
</paths>

path="." 表示内部存储的根目录

关于provider的配置,可以参见:https://blog.csdn.net/alex01550/article/details/82115074

中provider部分介绍,这里不再赘述。

到这里就基本就完了,但有几个注意点:

1.从内部存储安装应用需要sdcard运行时权限,如果没有该权限会提示解析错误!

2.启动安装界面时 intent.setDataAndType(uri, "application/vnd.android.package-archive"),中uri要记得做7.0适配!

3.在测试apk时,放在内部存储目录的apk,要通过build>>Build Apk(s) 进行构建,否则安装时会提示应用未安装!见下图

所以当你决定要适配到8.0的时候,一定要做其他方面的适配!
 

如何在Android系统手机上安装软件的三种方法 很多朋友初用安卓手机,可能都会比较陌生。下面就介绍一下如何在安卓系统上安装软件。在Android平台上安装文件的后缀名一般为“.apk”(如果你下载的软件是rar或者zip的话请解压之后再安装),和WM平台上的安装文件的后缀名“.exe”或者S60平台上的安装文件的后缀名“.sis或.sisx”相似。所以只要看到“.apk”结尾的文件就肯定是安装文件了。 在安装软件之前我们首先要对手机进行一系列的设置。在手机程序菜单中点“设置”进入,然后点击“应用程序”选项,在打开菜单中将“未知源”选项勾选中。然后进入“开发”子选项,勾选“USB 调试”选项。这样就完成了手机的设置。 完成如上准备工作后就可以进行软件安装工作了。常用的安装方法一共有三种,下面我依次来为大家讲解。 方法一 使用Android系统的手机最简单的软件安装方法是进入件Market或者也叫电子市场(如果提示需要设置Gmail的话请参看链接)中下载安装。使用非常简单,只需用手指拖出程序菜单,点击Market(或者叫电子市场)图标进入该程序。 然后在搜索框(search)中填写你需要的软件名称搜索即可,或者在软件分类和推荐软件列表中找到你要安装软件点击下载安装即可,如果是免费软件会显示为“Free”,如果是收费软件的话会提示软件的费用为“$xx”。 利用Market下载和安装都非常方便,但是此方法的缺点是非常浪费流量(就算软件是免费的,但是网络流量还是要收费的哦!),所以此法只推荐在连接Wifi(如果你Wifi不会设置的话,可以参看该链接)的情况下使用。另外如果你想安装收费软件,但是又不想花钱那么你可以按照下边的方法安装你在论坛或网站下载的以“.apk”为后缀名的破解版软件。 方法二 如果你的手机所刷的固件是安卓自制的固件话,那么你的的手机中可能已经集成了“APK安装器”,你只需要把要安装的文件用读卡器拷贝到内存卡中。然后在在手机程序菜单中点“设置”进入,然后点击“应用程序”选项,拖动菜单到下端可以看到“APK安装器”,点击进入。 安装器会自动搜索你内存卡中的安装程序,你只需选择要安装的程序名称点击安装即可。 如果你的手机使用的是原生的或者没有集成程序安装器的ROM那么你需要去Market中下载一款名为App Installer(其实就是软件安装器)的软件。在Market中下载安装完成后,在程序菜单中就可以找到刚安装的App Installer了,使用方法同上。 方法三 直接使用电脑安装软件。使用“APK安装器”可以直接连接PC中将电脑中的软件安装到你的手机中。不过前提是必须先要安装Android手机的USB驱动,否则电脑无法识别所连接的手机,点击下载USB驱动程序,下载完成解压安装即可。 USB驱动安装完成后电脑就可以将你的手机自动识别为移动磁盘了。这是再点击下载“APK安装器”,下载安装完成后将该压缩包解压,然后点击运行该程序。该程序会自动关联电脑中的apk程序,安装软件时只需双击apk安装文件即可。该程序会帮助你自动将软件安装到你的手机里。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值