android 静默安装,含获取各种应用信息方法,根据apk获取应用信息

来源:互联网 发布:新闻资讯软件下载 编辑:程序博客网 时间:2024/06/08 01:02

抄来好文章,哈哈


通常情况下,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" />

查看源码
打印?
001package com.android.util;
002 
003importjava.io.File; 
004 
005importjava.io.FileNotFoundException; 
006 
007importjava.io.FileOutputStream; 
008 
009importjava.io.IOException; 
010 
011importandroid.content.Context; 
012 
013importandroid.content.Intent; 
014 
015importandroid.content.pm.PackageInfo; 
016 
017importandroid.content.pm.PackageManager; 
018 
019importandroid.content.pm.PackageManager.NameNotFoundException; 
020 
021import android.content.pm.ApplicationInfo;
022 
023import android.content.pm.PackageParser;
024 
025importandroid.net.Uri; 
026 
027importandroid.util.Log; 
028 
029import android.util.DisplayMetrics;
030 
031importandroid.content.pm.IPackageInstallObserver; 
032 
033importandroid.content.pm.IPackageDeleteObserver; 
034 
035importandroid.os.FileUtils; 
036 
037import android.os.Handler;
038 
039import android.os.Message;
040 
041  
042 
043public classPackageInstaller { 
044 
045  
046 
047privateFile mTmpFile; 
048 
049private final int INSTALL_COMPLETE = 1;
050 
051final static int SUCCEEDED = 1;
052 
053final static int FAILED = 0;
054 
055private final staticString TAG = "PackInstaller"
056 
057privateContext mContext; 
058 
059private ApplicationInfo mAppInfo;
060 
061publicPackageInstaller(Context context) { 
062 
063mContext = context; 
064 
065
066 
067public voidinstall(String path,String packageName){ 
068 
069Intent intent = newIntent(Intent.ACTION_VIEW); 
070 
071intent.setDataAndType(Uri.fromFile(newFile(path)), 
072 
073"application/vnd.android.package-archive"); 
074 
075mContext.startActivity(intent); 
076 
077
078 
079  
080 
081public voidinstatllBatch(String path) { 
082 
083Log.i(TAG, "path="+ path); 
084 
085intinstallFlags = 0
086 
087Uri mPackageURI  = Uri.fromFile(new File(path));
088 
089PackageParser.Package mPkgInfo = getPackageInfo(mPackageURI);
090 
091mAppInfo =  mPkgInfo.applicationInfo;
092 
093String packageName = mAppInfo.packageName;
094 
095Log.i(TAG, "====install packageName ="+packageName);
096 
097PackageManager pm = mContext.getPackageManager(); 
098 
099try
100 
101PackageInfo pi = pm.getPackageInfo(packageName, 
102 
103PackageManager.GET_UNINSTALLED_PACKAGES); 
104 
105if(pi != null) { 
106 
107installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; 
108 
109
110 
111catch(NameNotFoundException e) { 
112 
113
114 
115if((installFlags & PackageManager.INSTALL_REPLACE_EXISTING) != 0) { 
116 
117Log.w(TAG, "Replacing package:"+ packageName); 
118 
119
120 
121  
122 
123PackageInstallObserver observer = newPackageInstallObserver(); 
124 
125pm.installPackage(mPackageURI, observer, installFlags, 
126 
127packageName); 
128 
129
130 
131private class PackageInstallObserver extendsIPackageInstallObserver.Stub { 
132 
133public void packageInstalled(String packageName, intreturnCode) { 
134 
135// Message msg = mHandler.obtainMessage(INSTALL_COMPLETE); 
136 
137// msg.arg1 = returnCode; 
138 
139// mHandler.sendMessage(msg); 
140 
141Log.i(TAG, "====INSTALL_COMPLETE"); 
142 
143
144 
145
146 
147private class PackageDeleteObserver extendsIPackageDeleteObserver.Stub { 
148 
149public void packageDeleted(booleansucceeded) { 
150 
151//            Message msg = mHandler.obtainMessage(UNINSTALL_COMPLETE); 
152 
153//            msg.arg1 = succeeded?SUCCEEDED:FAILED; 
154 
155//            mHandler.sendMessage(msg); 
156 
157Log.i(TAG, "====UNINSTALL_COMPLETE"); 
158 
159
160 
161
162 
163    public voiduninstall(String packageName){ 
164 
165Uri packageURI = Uri.parse("package:"+ packageName); 
166 
167Intent uninstallIntent = newIntent(Intent.ACTION_DELETE, 
168 
169packageURI); 
170 
171mContext.startActivity(uninstallIntent); 
172 
173
174 
175  
176 
177public voiduninstallBatch(String packageName) { 
178 
179PackageDeleteObserver observer = newPackageDeleteObserver(); 
180 
181mContext.getPackageManager().deletePackage(packageName, observer, 0); 
182 
183  
184 
185
186 
187/* 
188 
189*  Utility method to get package information for a given packageURI          
190 
191*/
192 
193public  PackageParser.Package getPackageInfo(Uri packageURI) {
194 
195final String archiveFilePath = packageURI.getPath();
196 
197PackageParser packageParser = new PackageParser(archiveFilePath);
198 
199File sourceFile = new File(archiveFilePath);
200 
201DisplayMetrics metrics = new DisplayMetrics();
202 
203metrics.setToDefaults();
204 
205PackageParser.Package pkg =  packageParser.parsePackage(sourceFile,
206 
207archiveFilePath, metrics, 0);
208 
209// Nuke the parser reference.
210 
211packageParser = null;
212 
213return pkg;
214 
215}
216 
217/*
218 
219* Utility method to get application information for a given packageURI
220 
221*/
222 
223public   ApplicationInfo getApplicationInfo(Uri packageURI) {
224 
225final String archiveFilePath = packageURI.getPath();
226 
227PackageParser packageParser = new PackageParser(archiveFilePath);
228 
229File sourceFile = new File(archiveFilePath);
230 
231DisplayMetrics metrics = new DisplayMetrics();
232 
233metrics.setToDefaults();
234 
235PackageParser.Package pkg = packageParser.parsePackage(sourceFile, archiveFilePath, metrics, 0);
236 
237if (pkg == null) {
238 
239return null;
240 
241}
242 
243return pkg.applicationInfo;
244 
245}
246 
247private Handler mHandler = new Handler() {
248 
249public void handleMessage(Message msg) {
250 
251switch (msg.what) {
252 
253case INSTALL_COMPLETE:
254 
255if(msg.arg1 == SUCCEEDED) {
256 
257  
258 
259else {}
260 
261break;
262 
263default:
264 
265break;
266 
267}
268 
269}
270 
271};
272 
273}

0 0
原创粉丝点击