android中跳转安装apk

本文详细介绍了在Android中如何跳转安装APK,包括针对Android 6.0及以下、7.0及以上版本的不同处理方式,以及Android 8.0以上的权限管理。涉及到的关键步骤包括添加权限请求,使用FileProvider处理Android 7.0后的权限问题,以及在Android 8.0及以上版本中处理未知来源安装的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在android中跳转安装apk

需要先添加权限:   

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

在跳转的过程中分为三种情况

  1. android版本低于等于6.0

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setDataAndType(uri,"application/vnd.android.package-archive");

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivityForResult(intent, requestcode);

  1. 版本大于等于7.0

Android7.0后添加一个权限机制,androidN对访问文件权限收回,需要使用FileProvider来授权

1.在manifest中添加provider

        <provider

            android:name="android.support.v4.content.FileProvider"

            android:authorities="独一无二的名字.fileProvider"

            android:grantUriPermissions="true"

            android:exported="false">

            <meta-data

                android:name="android.support.FILE_PROVIDER_PATHS"

                android:resource="@xml/file_paths" />

        </provider>

2.添加xml指定路径

在manifest中有用resource指引到一个xml目录下的file_paths文件

<paths>

<external-path path="." name="external_storage_root" />

</paths>

这里直接指向根目录,这里顺便贴一下所有路径相关的标签。

(1)files-path:
对应物理路径:getFilesDir()
对应具体路径:/data/user/0/包名/files
(2)cache-path:
对应物理路径:getCacheDir()
对应具体路径:/data/user/0/包名/cache
(3)external-path:
对应物理路径:Environment.getExternalStorageDirectory()
对应具体路径:/storage/emulated/0
(4)external-files-path:
对应物理路径:getExternalFilesDir("名字")
对应具体路径:/storage/emulated/0/Android/data/包名/files/名字
(5)external-cache-path:
对应物理路径:getExternalCacheDir()
对应具体路径:/storage/emulated/0/Android/data/包名/cache

  1. 版本大于8.0

Android 8.0强化了权限管理,新增了一个未知来源管理列表页面。简单来说就是说你如果要在这个应用里面去安装另一个应用。要去这个未知来源管理列表页面去设置成允许

Android8.0申请权限

 if (VERSION.SDK_INT >= 26) {

            boolean hasInstallPermission = isHasInstallPermissionWithO(activity);

            if (!hasInstallPermission) {

                startInstallPermissionSettingActivity(activity, req);

                return;

            }

        }

整体代码:

 private void install(Context context, String path, int req) {

        File file = new File(path);

        if (file == null && !file.exists()) {

            return;

        }

        Uri uri;

        if (Build.VERSION.SDK_INT >= 24) {

            uri = FileProvider.getUriForFile(context, context.getPackageName() + ".AppFileProvider", file);

        } else {

            uri = Uri.fromFile(file);

        }

        if (Build.VERSION.SDK_INT >= 26) {

            boolean hasInstallPermission = isHasInstallPermissionWithO(context);

            if (!hasInstallPermission) {

                startInstallPermissionSettingActivity(context, req);

                return;

            }

        }

        Intent intent = new Intent("android.intent.action.VIEW");

        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

        if (Build.VERSION.SDK_INT >= 24) {

            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        }

 

        intent.setDataAndType(uri, "application/vnd.android.package-archive");

        context.startActivity(intent);

    }

 

    @RequiresApi(api = Build.VERSION_CODES.O)

    private static boolean isHasInstallPermissionWithO(Context context) {

        return context == null ? false : context.getPackageManager().canRequestPackageInstalls();

    }

 

    private static void startInstallPermissionSettingActivity(Context context, int req) {

        if (context != null) {

            Uri uri = Uri.parse("package:" + context.getPackageName());

            Intent intent = new Intent("android.settings.MANAGE_UNKNOWN_APP_SOURCES", uri);

            ((Activity) context).startActivityForResult(intent, req);

        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值