上代码:
package com.forelid.ispa.support.utils; 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; } } }; }
相关推荐
使用Android5.0的环境编译的,不同版本之间,aidl文件可能会有差异,具体还需参照Android...详细参考我的博客文章《Android 无需root实现APK静默安装》:http://blog.csdn.net/yyh352091626/article/details/50533137
不仅可以安装新的apk,也适用于更新旧的apk。更新apk必须保证新旧apk签名一致。本次分享的源码就是一套关于apk静默安装的源码,可以实现apk的静默安装或更新。压缩包里有两种实现apk静默安装的方法说明和详细的操作...
Android的静默安装似乎是一个很有趣很诱人的东西,但是,用普通做法,如果手机没有root权限的话,似乎很难实现静默安装,因为Android并不提供显示的Intent调用,一般是通过以下方式安装apk: Intent intent = new ...
利用系统签名实现APK自动静默安装并自动重新启动
android apk静默安装方法,方法很实用,值得一看。
apk静默安装assets文件夹下的apk,建议修改签名文件后安装
android实在获得root权限应用静默安装
通过AIDL调用Android源码静默安装卸载APK....
在android4.4 平台,给预安装apk进行静默安装升级待命示例
Android10.0 静默安装、卸载接口
通过pm命令方式可以实现Android apk的后台静默安装。 亲测4.2 4.4 可用
android静默安装和智能安装的实现(本人测试的5.0的系统)
TowelRoot (Android 1.5+).apk
源码参考,欢迎下载
android 7.0 非root下 具有system权限下 实现静默安装 静默卸载 的多种实现方式
不仅可以安装新的apk,也适用于更新旧的apk。更新apk必须保证新旧apk签名一致。本次分享的源码就是一套关于apk静默安装的源码,可以实现apk的静默安装或更新。压缩包里有两种实现apk静默安装的方法说明和详细的操作...
Android无需Root静默安装apk,无需获取root,下载文件包括Android工程slientInstall和Java打包工程Zip
实现android定时安装静默apk,自动在后台安装,安装完成后自动启动,需要root权限