抄来好文章,哈哈
通常情况下,android是没有提供静默方式的上层接口,我们需要在android源代码下来调用这个隐藏的接口来完成静默安装。
最重要的就是参考android系统目录下的packages/apps/PackageInstaller,
当中有两个文件 PackageInstallerActivity.java,InstallAppProgress.java ,前者就是我们通常看到的带有提示对话框的安装应用程序,后者是点确定安装后调用的intent。
现提供一个静默安装的关键类,该类在android2.2下成功编译, 其中通过循环调用接口instatllBatch则可实现批量安装
当然最后的应用程序别忘记添加权限
1 | < uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" /> |
2 | < uses-permission android:name = "android.permission.INSTALL_PACKAGES" /> |
3 | < uses-permission android:name = "android.permission.DELETE_PACKAGES" /> |
4 | < uses-permission android:name = "android.permission.CLEAR_APP_CACHE" /> |
5 | < uses-permission android:name = "android.permission.READ_PHONE_STATE" /> |
6 | < uses-permission android:name = "android.permission.CLEAR_APP_USER_DATA" /> |
001 | package com.android.util; |
005 | import java.io.FileNotFoundException; |
007 | import java.io.FileOutputStream; |
009 | import java.io.IOException; |
011 | import android.content.Context; |
013 | import android.content.Intent; |
015 | import android.content.pm.PackageInfo; |
017 | import android.content.pm.PackageManager; |
019 | import android.content.pm.PackageManager.NameNotFoundException; |
021 | import android.content.pm.ApplicationInfo; |
023 | import android.content.pm.PackageParser; |
025 | import android.net.Uri; |
027 | import android.util.Log; |
029 | import android.util.DisplayMetrics; |
031 | import android.content.pm.IPackageInstallObserver; |
033 | import android.content.pm.IPackageDeleteObserver; |
035 | import android.os.FileUtils; |
037 | import android.os.Handler; |
039 | import android.os.Message; |
043 | public class PackageInstaller { |
047 | private File mTmpFile; |
049 | private final int INSTALL_COMPLETE = 1 ; |
051 | final static int SUCCEEDED = 1 ; |
053 | final static int FAILED = 0 ; |
055 | private final static String TAG = "PackInstaller" ; |
057 | private Context mContext; |
059 | private ApplicationInfo mAppInfo; |
061 | public PackageInstaller(Context context) { |
067 | public void install(String path,String packageName){ |
069 | Intent intent = new Intent(Intent.ACTION_VIEW); |
071 | intent.setDataAndType(Uri.fromFile( new File(path)), |
073 | "application/vnd.android.package-archive" ); |
075 | mContext.startActivity(intent); |
081 | public void instatllBatch(String path) { |
083 | Log.i(TAG, "path=" + path); |
087 | Uri mPackageURI = Uri.fromFile( new File(path)); |
089 | PackageParser.Package mPkgInfo = getPackageInfo(mPackageURI); |
091 | mAppInfo = mPkgInfo.applicationInfo; |
093 | String packageName = mAppInfo.packageName; |
095 | Log.i(TAG, "====install packageName =" +packageName); |
097 | PackageManager pm = mContext.getPackageManager(); |
101 | PackageInfo pi = pm.getPackageInfo(packageName, |
103 | PackageManager.GET_UNINSTALLED_PACKAGES); |
107 | installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; |
111 | } catch (NameNotFoundException e) { |
115 | if ((installFlags & PackageManager.INSTALL_REPLACE_EXISTING) != 0 ) { |
117 | Log.w(TAG, "Replacing package:" + packageName); |
123 | PackageInstallObserver observer = new PackageInstallObserver(); |
125 | pm.installPackage(mPackageURI, observer, installFlags, |
131 | private class PackageInstallObserver extends IPackageInstallObserver.Stub { |
133 | public void packageInstalled(String packageName, int returnCode) { |
141 | Log.i(TAG, "====INSTALL_COMPLETE" ); |
147 | private class PackageDeleteObserver extends IPackageDeleteObserver.Stub { |
149 | public void packageDeleted( boolean succeeded) { |
157 | Log.i(TAG, "====UNINSTALL_COMPLETE" ); |
163 | public void uninstall(String packageName){ |
165 | Uri packageURI = Uri.parse( "package:" + packageName); |
167 | Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, |
171 | mContext.startActivity(uninstallIntent); |
177 | public void uninstallBatch(String packageName) { |
179 | PackageDeleteObserver observer = new PackageDeleteObserver(); |
181 | mContext.getPackageManager().deletePackage(packageName, observer, 0 ); |
223 | public ApplicationInfo getApplicationInfo(Uri packageURI) { |
225 | final String archiveFilePath = packageURI.getPath(); |
227 | PackageParser packageParser = new PackageParser(archiveFilePath); |
229 | File sourceFile = new File(archiveFilePath); |
231 | DisplayMetrics metrics = new DisplayMetrics(); |
233 | metrics.setToDefaults(); |
235 | PackageParser.Package pkg = packageParser.parsePackage(sourceFile, archiveFilePath, metrics, 0 ); |
243 | return pkg.applicationInfo; |
247 | private Handler mHandler = new Handler() { |
249 | public void handleMessage(Message msg) { |
253 | case INSTALL_COMPLETE: |
255 | if (msg.arg1 == SUCCEEDED) { |