P版本:
默认允许未知应用安装权限
方法一框架层修改
frameworks/base/core/java/android/app/AppOpsManager.java
在sOpDefaultMode函数中
AppOpsManager.MODE_DEFAULT, // OP_REQUEST_INSTALL_PACKAGES
改成AppOpsManager.MODE_ALLOWED
S版本是//REQUEST_INSTALL_PACKAGES,但是S上改了这个没有用,点安装包后依然会有 未知提示的安全弹窗,所以要去/PackageInstallerActivity.java改
protected void onResume() {里
checkIfAllowedAndInitiateInstall();这句直接换成
initiateInstall();
就所有应用都不检查是否允许权限了,都能安装
方法二:
S版本的是已经把安装应用封装到framework下面了frameworks/base/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
P版本:
以下走的PackageInstaller,如果带了GMS包的话,可能是安装了谷歌的 GooglePackageInstaller,这个应用实测override无法消除,那就删掉mk文件
vendor/google/apps/GooglePackageInstaller/Android.mk
vendor/mediatek/proprietary/packages/apps/PackageInstaller/ src/com/android/packageinstaller/InstallStart.java
在onCreate中加入
if (callingPackage == null){
isTrustedSource = true;
}
isTrustedSource这个变量就是决定是否赋予安装权限然后执行接下来的安装,
方法一是底层修改,方法二是上层应用调用修改,实际上获得的第三方应用安装权限还是no的,只是手动改为了true
默认点开apk文件后自动安装,这个的前提是把上面未知应用安装权限打开
vendor/mediatek/proprietary/packages/apps/PackageInstaller/ src/com/android/packageinstaller/PackageInstallerActivity.java
在初始安装的方法initiateInstall里 加入
if(true/*pkgName.equals("com.veclink.vecsipsimple")*/)
startInstall();
这个判断就可以指定特定包名,因为在函数开始就已经获取了当前包名
String pkgName = mPkgInfo.packageName;
如果还没有开启第三方应用安装权限的话(AppOpsManager.java中未改),也可以在这个文件的onCreate方法中加入
if (mCallingPackage == null) {
initiateInstall();
} else
//*/
checkIfAllowedAndInitiateInstall();
,就是如果没开启权限的话,此时的mCallingPackage读不到的,为null,所以源码也直接执行checkIfAllowedAndInitiateInstall()是否允许才会安装,需要用户手动点一下授予权限
S版本
自动安装完成后,会有个完成或打开的确认界面,这个界面可以自动跳过为直接打开安装好的应用,也可以不要。实际上也不需要直接打开,如果是静默安装的话,那就会突然跳出来应用了。所以直接就默认完成,其实点完成就是直接finish当前界面
如果要修改直接打开,则
src/com/android/packageinstaller/InstallSuccess.java 这个文件就是安装成功后的逻辑
onCreate方法中
因为
boolean enabled = false;
if (launchIntent != null) {
List<ResolveInfo> list = getPackageManager().queryIntentActivities(launchIntent,
0);
if (list != null && list.size() > 0) {
enabled = true;
}
}
此时源码已赋值了enabled,那么就会进入if (enabled) {这个判断
在这里面打开按钮的点击事件完成之后launchButton.setOnClickListener之后加入
也就是
if (enabled) {
launchButton.setOnClickListener(view -> {
try {
startActivity(mLaunchIntent);
} catch (ActivityNotFoundException | SecurityException e) {
Log.e(LOG_TAG, "Could not start activity", e);
}
finish();
});
之后加上
launchButton.performClick();
就可以模拟点击打开按钮了
如果想直接点完成,那就把这句话改成
finish();
一个是R.id.done_button,一个是R.id.launch_button