通常情况下,android是没有提供静默方式的上层接口,我们需要在android源代码下来调用这个隐藏的接口来完成静默安装。
最重要的就是参考android系统目录下的packages/apps/PackageInstaller,
当中有两个文件 PackageInstallerActivity.java,InstallAppProgress.java ,前者就是我们通常看到的带有提示对话框的安装应用程序,后者是点确定安装后调用的intent。
现提供一个静默安装的关键类,该类在android2.2下成功编译, 其中通过循环调用接口instatllBatch则可实现批量安装
当然最后的应用程序别忘记添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
package com.android.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageParser;
import android.net.Uri;
import android.util.Log;
import android.util.DisplayMetrics;
import android.content.pm.IPackageInstallObserver;
import android.content.pm.IPackageDeleteObserver;
import android.os.FileUtils;
import android.os.Handler;
import android.os.Message;
public class PackageInstaller {
private File mTmpFile;
private final int INSTALL_COMPLETE = 1;
final static int SUCCEEDED = 1;
final static int FAILED = 0;
private final static String TAG = "PackInstaller";
private Context mContext;
private ApplicationInfo mAppInfo;
public PackageInstaller(Context context) {
mContext = context;
}
public void install(String path,String packageName){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(path)),
"application/vnd.android.package-archive");
mContext.startActivity(intent);
}
public void instatllBatch(String path) {
Log.i(TAG, "path=" + path);
int installFlags = 0;
Uri mPackageURI = Uri.fromFile(new File(path));
PackageParser.Package mPkgInfo = getPackageInfo(mPackageURI);
mAppInfo = mPkgInfo.applicationInfo;
String packageName = mAppInfo.packageName;
Log.i(TAG, "====install packageName ="+packageName);
PackageManager pm = mContext.getPackageManager();
try {
PackageInfo pi = pm.getPackageInfo(packageName,
PackageManager.GET_UNINSTALLED_PACKAGES);
if (pi != null) {
installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
}
} catch (NameNotFoundException e) {
}
if ((installFlags & PackageManager.INSTALL_REPLACE_EXISTING) != 0) {
Log.w(TAG, "Replacing package:" + packageName);
}
PackageInstallObserver observer = new PackageInstallObserver();
pm.installPackage(mPackageURI, observer, installFlags,
packageName);
}
private class PackageInstallObserver extends IPackageInstallObserver.Stub {
public void packageInstalled(String packageName, int returnCode) {
// Message msg = mHandler.obtainMessage(INSTALL_COMPLETE);
// msg.arg1 = returnCode;
// mHandler.sendMessage(msg);
Log.i(TAG, "====INSTALL_COMPLETE");
}
}
private class PackageDeleteObserver extends IPackageDeleteObserver.Stub {
public void packageDeleted(boolean succeeded) {
// Message msg = mHandler.obtainMessage(UNINSTALL_COMPLETE);
// msg.arg1 = succeeded?SUCCEEDED:FAILED;
// mHandler.sendMessage(msg);
Log.i(TAG, "====UNINSTALL_COMPLETE");
}
}
public void uninstall(String packageName){
Uri packageURI = Uri.parse("package:" + packageName);
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE,
packageURI);
mContext.startActivity(uninstallIntent);
}
public void uninstallBatch(String packageName) {
PackageDeleteObserver observer = new PackageDeleteObserver();
mContext.getPackageManager().deletePackage(packageName, observer, 0);
}
/*
* Utility method to get package information for a given packageURI
*/
public PackageParser.Package getPackageInfo(Uri packageURI) {
final String archiveFilePath = packageURI.getPath();
PackageParser packageParser = new PackageParser(archiveFilePath);
File sourceFile = new File(archiveFilePath);
DisplayMetrics metrics = new DisplayMetrics();
metrics.setToDefaults();
PackageParser.Package pkg = packageParser.parsePackage(sourceFile,
archiveFilePath, metrics, 0);
// Nuke the parser reference.
packageParser = null;
return pkg;
}
/*
* Utility method to get application information for a given packageURI
*/
public ApplicationInfo getApplicationInfo(Uri packageURI) {
final String archiveFilePath = packageURI.getPath();
PackageParser packageParser = new PackageParser(archiveFilePath);
File sourceFile = new File(archiveFilePath);
DisplayMetrics metrics = new DisplayMetrics();
metrics.setToDefaults();
PackageParser.Package pkg = packageParser.parsePackage(sourceFile, archiveFilePath, metrics, 0);
if (pkg == null) {
return null;
}
return pkg.applicationInfo;
}
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case INSTALL_COMPLETE:
if(msg.arg1 == SUCCEEDED) {
} else {}
break;
default:
break;
}
}
};
}
分享到:
相关推荐
在Android系统中,静默安装APK(Silent Install)是指在用户无感知的情况下自动安装应用程序。这通常需要系统的特殊权限,因为出于安全考虑,Android系统默认不允许非系统应用进行后台安装。在Android 10中,由于...
总结来说,静默安装APK在Android中可以通过Adb命令行或自定义服务实现,其中Adb方法适用于快速测试,而自定义服务更适合集成到自动化流程中。不过,无论哪种方法,都需要注意安全性和权限问题,因为静默安装可能会被...
在Android系统中,静默安装和卸载APK是指在用户无感知的情况下,通过编程方式自动执行安装或卸载应用程序的过程。这种方式常用于系统维护、自动化测试或者在企业级设备管理中,以便批量处理应用程序的部署。在本教程...
使用Android5.0的环境编译的,不同版本之间,aidl文件可能会有差异,具体还需参照Android...详细参考我的博客文章《Android 无需root实现APK静默安装》:http://blog.csdn.net/yyh352091626/article/details/50533137
在Android系统中,静默安装(Silent Installation)是指在用户无感知的情况下,通过编程方式自动安装应用程序。这种操作通常需要设备具有root权限,因为正常的Android安全机制限制了非系统应用的静默安装。Root权限...
Android的静默安装似乎是一个很有趣很诱人的东西,但是,用普通做法,如果手机没有root权限的话,似乎很难实现静默安装,因为Android并不提供显示的Intent调用,一般是通过以下方式安装apk: Intent intent = new ...
2. **广播接收器**:可以创建一个监听`ACTION_PACKAGE_INSTALLED`广播的接收器,当APK安装完成后,系统会发出这个广播,接收器接收到广播后执行相应的启动操作。 3. **使用Intent**:在APK的清单文件...
在Android系统中,静默安装(Silent Install)是指在用户无感知的情况下自动安装APK应用的过程。在Android 4.4(KitKat)版本中,这个功能主要应用于企业级设备管理和批量部署应用的场景。下面我们将详细探讨如何在...
本篇文章将详细解析如何通过激活应用辅助功能来实现模拟点击,进而进行静默安装APK,以及在不获取设备root权限的情况下完成这一过程。 首先,我们需要了解什么是Android的辅助功能。在Android系统中,辅助功能服务...
在Android系统中,静默安装(Silent Installation)和卸载(Silent Uninstallation)是开发者或者系统管理员在后台执行应用程序的安装与卸载过程,无需用户交互的一种方式。这通常用于批量部署应用或者在设备管理器...
在Android系统中,静默安装APK是指在用户无感知的情况下自动进行的安装过程,通常需要设备...这涉及到对Android系统底层的理解和权限控制,但通过以上步骤,你可以创建一个高效且自动化的方式来管理应用的安装和更新。
支持android5.1静默安装、卸载代码,封装在PackageInstaller模块内,在执行时可能需要修改部分framework代码使功能正常使用。
在Android系统中,静默安装是指在用户无感知的情况下,后台自动执行APK应用程序的安装过程。这通常需要设备具有root权限,因为常规情况下,Android系统出于安全考虑并不允许非系统应用进行静默安装。本篇文章将深入...
在Android系统中,静默安装(Silent Install)和静默卸载(Silent Uninstall)是指在不显示用户界面或获取用户明确许可的情况下自动安装或卸载应用程序。这对于批量设备管理和企业级应用部署尤其重要。在Android 7.0...
用户需要在设备的“开发者选项”中开启“允许安装未知来源的应用”来允许非Play Store的APK安装。 6. **安全考虑**:静默安装虽然方便,但也存在安全风险,因为它可以用来安装恶意软件。因此,只有在了解其潜在风险...
在Android系统中,批量静默安装程序是一种自动化部署应用的方式,尤其在企业级环境中非常有用。这种方式能够避免在安装过程中出现用户交互界面,比如权限请求提示框,从而提高效率。以下是对这个主题的详细说明: 1...
4. **调用静默安装API**:使用`PackageInstaller`类提供的`install()`方法来安装APK。`PackageInstaller`是Android API Level 21(Android Lollipop)引入的新接口,用于管理应用的安装和升级。创建一个`...
在Android平台上,静默安装(Silent Installation)指的是在用户无感知的情况下,通过编程方式自动安装应用程序。这种功能常用于企业级设备管理或者自动化测试场景。本资料"Android应用源码APK实现静默安装整套资料....
标题与描述均提到了“Android实现静默安装APK的两种方法”,这表明文章将探讨在Android设备上不经过用户交互就能自动安装APK(应用包)文件的技术。这一功能对于自动化部署、企业级应用更新或系统级软件管理场景尤为...
9. **更新机制**:对于已安装的应用,Android 7.0允许更灵活的更新方式,包括在后台静默更新,提高用户对最新版本的使用率。 10. **开发者角度**:对于开发者,Android 7.0提供了更多API和工具来优化APK的构建和...