Android 安装应用的两种方式--外部应用安装器安装和静默安装(系统应用)

news/2025/1/12 10:02:13/

1.调用外部安装器安装

   

/*** 外部应用安装器安装apk(原生接口)* @param context* @param path apk的路径* @return*/public static boolean installApkByPath(Context context, String path) {try {Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(Uri.fromFile(new File(path)), "application/vnd.android.package-archive");intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);return true;} catch (Exception e) {e.printStackTrace();}return false;}

2.静默安装(系统应用才有权限)


这里使用反射的方式调用  


public class PackageManager_R {private static final String TAG = "PackageManager_R";private static final String ERROR_TAG = "ReflectError " + TAG;private static Method sMethod_installPackage;/*** 静默安装(原生接口)** @param path* @return*/public static boolean installPackage(String path, final SystemAppInstall.InstalledCallBack callBack) {if (sMethod_installPackage == null) {try {sMethod_installPackage = PackageManager.class.getMethod("installPackage", Uri.class, IPackageInstallObserver.class, int.class, String.class);} catch (Exception e) {LogUtils.w(ERROR_TAG, "", e);e.printStackTrace();}}IPackageInstallObserver observer = new IPackageInstallObserver.Stub() {public void packageInstalled(String packageName, int returnCode) {if (returnCode != 1) {callBack.onResult(packageName, false);} else {callBack.onResult(packageName, true);}}};PackageManager pm = AppContextUtils.getAppContext().getPackageManager();try {sMethod_installPackage.invoke(pm, Uri.parse("file://" + path), observer, 0, null);return true;} catch (Exception e) {LogUtils.w(ERROR_TAG, "", e);e.printStackTrace();}return false;}
}
对应的源码的接口

/*** @hide Install a package. Since this may take a little while, the result*       will be posted back to the given observer. An installation will*       fail if the calling context lacks the*       {@link android.Manifest.permission#INSTALL_PACKAGES} permission, if*       the package named in the package file's manifest is already*       installed, or if there's no space available on the device.* @param packageURI The location of the package file to install. This can*            be a 'file:' or a 'content:' URI.* @param observer An observer callback to get notified when the package*            installation is complete.*            {@link IPackageInstallObserver#packageInstalled(String, int)}*            will be called when that happens. This parameter must not be*            null.* @param flags - possible values: {@link #INSTALL_FORWARD_LOCK},*            {@link #INSTALL_REPLACE_EXISTING},*            {@link #INSTALL_ALLOW_TEST}.* @param installerPackageName Optional package name of the application that*            is performing the installation. This identifies which market*            the package came from.* @deprecated Use {@link #installPackage(Uri, PackageInstallObserver, int,*             String)} instead. This method will continue to be supported*             but the older observer interface will not get additional*             failure details.*/// @SystemApipublic abstract void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags,String installerPackageName);

3.监听应用的安装与卸载


//注册监听

IntentFilter installFilter = new IntentFilter();installFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);installFilter.addAction(Intent.ACTION_PACKAGE_ADDED);installFilter.addDataScheme("package");mContext.registerReceiver(mAppReceiver, installFilter);


//移除监听

mContext.unregisterReceiver(mAppReceiver);

//广播接收回调

private BroadcastReceiver mAppReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();LogUtils.d(TAG, "onReceive = " + action);String pkgName = intent.getData().getSchemeSpecificPart();if(action.equals(Intent.ACTION_PACKAGE_REMOVED)) {//卸载}else if(action.equals(Intent.ACTION_PACKAGE_ADDED)) {//安装}}};



http://www.ppmy.cn/news/677747.html

相关文章

Android 开发 之 8.0应用安装权限(未知应用权限安装)

未知来源应用权限 Android8.0的诸多新特性中有一个非常重要的特性:未知来源应用权限 以前安装未知来源应用的时候一般会弹出一个弹窗让用户去设置允许还是拒绝,并且设置为允许之后,所有的未知来源的应用都可以被安装。 Android8.0的变化是&…

adb应用安装失败分析

1. adb安装应用的时候有时可能失败,报出如下失败信息: [100%]/data/local/tmp/map-20160831.apkpkg:/data/local/tmp/map-20160831.apk Failure[INSTALL_FAILED_ALREADY_EXISTS]2. 常见安装失败输出代码、含义及可能的解决办法如下: INSTALL_FAILED_ALRE…

【UWP开发】uwp应用安装失败

编译出了uwp应用.appx之后双击打开,报错你需要为此应用包而安装的新证书,或者是带有受信任证书的新应用包。系统管理员或应用开发人员可以提供帮助。证书链在不受信任的根证书中进行处理,但也在其中终止 (0x800B0109) 解决办法: …

Android 判断应用是否安装

方法一 使用抛出异常的方式判断,通过包名获取app的信息,当app不存在时,会抛出NameNotFoundException 异常,我们通过对异常的捕获,从而判断是否安装了该应用,代码如下: private boolean checkA…

广东IPTV 第三方APP应用安装(超简单)

1、需要安装的APP软件先行下载到U盘或microSD卡; 2、插入盒子打开,安装并打开文件管理软件,把APP复制或移动到盒子的系统卡上; 3、直接双击安装APP即可。 注意APP不能安装太多,盒子内存空间一般不大,很容易爆满&…

我们发现您的应用在用户同意隐私政策前申请获取用户个人信息(IMEI, 设备ID, 用户应用安装列表, MAC地址用户数据)

一、需求 解决应用上架问题 过度获取用户信息我们发现您的应用在用户同意隐私政策前申请获取用户个人信息(IMEI, 设备ID, 用户应用安装列表, MAC地址用户数据) 自"滴滴"事件后,为避免该类事件,App的上架变的严格起来。上…

使用adb工具打开TCL电视的第三方应用安装权限

使用adb工具打开TCL电视的第三方应用安装权限 前言安装adb工具打开电视的adb调试开关abd工具打开电视权限 前言 新买的TCL电视往往默认是无法安装第三方应用的,即使用U盘安装了第三方应用,应用也没有升级权限。另外,也无法通过沙发管家等应用…

Thinkphp6.0 多应用安装说明

附 如果不能下载 请到这里来 传送门 我先把框架丢上来吧 一个是刚下来没有扩展的,也就是单应用的 单应用.zip 下边这个是多应用的,安装好了扩展的 多应用.zip 接下来说说我是怎么搞的 按着文档的说明执行命令(记得安装 composer) composer create-project to…