众所周知,Android越更新,限制也会越来越多,自从Android7.0开始,安装apk就没那么轻松了,Android8.0更是如此,今天我们就总结出一个通杀各大Android版本的安装方法。

要安装apk,我们需要一个 FileProvider来传递Apk地址,所以首先在AndroidManifest.xml定义一个 provider:

<provider
        android:name="androidx.core.content.FileProvider"
	android:authorities="包名.fileProvider"
	android:exported="false"
	android:grantUriPermissions="true"
     tools:replace="name,authorities,exported,grantUriPermissions"> 
        <meta-data
	android:name="android.support.FILE_PROVIDER_PATHS"
	android:resource="@xml/provider_paths"
	tools:replace="name,resource"/>
</provider>

之后需要在xml/provider_paths配置provider,路径为apk存放的文件夹,name为路径别名,自定义即可:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-cache-path name="别名" path="apk"/>
</paths>
其中:
<root-path/> 代表设备的根目录new File("/");
<files-path/> 代表context.getFilesDir()
<cache-path/> 代表context.getCacheDir()
<external-path/> 代表Environment.getExternalStorageDirectory()
<external-files-path>代表context.getExternalFilesDirs()
<external-cache-path>代表getExternalCacheDirs()
按需要配置即可

我们可能需要在调用之前检查一下安装权限,这样搞即可:

public boolean check_REQUEST_INSTALL_PACKAGES() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            if (!activity.getPackageManager().canRequestPackageInstalls()) {
                Uri packageURI = Uri.parse("package:" + activity.getPackageName());
                Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
                activity.startActivityForResult(intent, 0);
                return false;
            }
        }
        return true;
    }

之后就是调用安装了,我们可以这样以根据不同的Android版本来安装apk:

public void installApk(File file) {
     if (file == null) {
         return;
     }
     Intent intent = new Intent(Intent.ACTION_VIEW);
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        Uri contentUri = FileProvider.getUriForFile(getContext(), "包名.fileProvider", 别名);
    intent.setDataAndType(contentUri,"application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(file), 
            "application/vnd.android.package-archive");
        }
        context.startActivity(intent);
    }

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注