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

 

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;

}

}

};

}

 
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()