您的位置:首页 > 移动开发 > Android开发

Android静默方式实现批量安装卸载应用程序

2012-05-09 19:28 796 查看
前段时间做了一个批量安装卸载应用程序的小应用,由于安装卸载应用程序的部分API是隐藏的,所以必须在ubuntu下下载Android系统源码,并编译之后使用MM命令编译生成APK文件,其实也难。思路是这样的,在XX/packages/apps目录下有一个PackageInstaller的应用程序,Android机器中安装卸载都是由这个应用程序完成的。但是它没有批量安装和卸载的功能,如果要在自己的应用程序中添加批量安装和卸载的功能,其实很简单,只需要参考PakcageInstaller里面的安装卸载代码加个循环就可以了。但值得注意的是在编译的过程中必须复制PackageInstaller里面的Android.mk文件,修改文件为工程目录名。好了,废话不再多说,下面是关键代码

1、 Android.mk文件

[plain]
view plaincopyprint?

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := PackageInstaller
LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)

[java] 
view plaincopyprint?

package cn.ceadic.apkmgr; 

  
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.net.Uri; 

import android.util.Log;  
  
import android.content.pm.IPackageInstallObserver; 

import android.content.pm.IPackageDeleteObserver; 

import android.os.FileUtils;  

  
  
public class PackageInstaller { 

      
    private File mTmpFile; 

    private final String TMP_FILE_NAME =
"tmpCopy.apk";  
  
    private final
static String TAG = "PackInstaller"; 

    private Context mContext; 

  
    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, String packageName) { 

  
        Log.i(TAG, "path=" + path); 

        int installFlags = 0; 

        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); 

        }  
  
        // Create temp file before invoking install api 

        mTmpFile = createTempPackageFile(path);  
        if (mTmpFile == null) { 

            // Message msg = mHandler.obtainMessage(INSTALL_COMPLETE); 

            // msg.arg1 = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE; 

            // mHandler.sendMessage(msg); 

            return;  
        }  
        Uri mPackageURI = Uri.parse("file://" + mTmpFile.getPath()); 

        String installerPackageName = mContext.getIntent().getStringExtra( 

                Intent.EXTRA_INSTALLER_PACKAGE_NAME);  
  
        PackageInstallObserver observer = new PackageInstallObserver(); 

        pm.installPackage(mPackageURI, observer, installFlags, 

                installerPackageName);  
    }  
  
    private File createTempPackageFile(String filePath) { 

        File tmpPackageFile = mContext.getFileStreamPath(TMP_FILE_NAME); 

        if (tmpPackageFile ==
null) {  
            Log.w(TAG, "Failed to create temp file"); 

            return 
null;  
        }  
        if (tmpPackageFile.exists()) { 

            tmpPackageFile.delete();  
        }  
        // Open file to make it world readable 

        FileOutputStream fos;  
        try {  
            fos = openFileOutput(TMP_FILE_NAME, MODE_WORLD_READABLE); 

        } catch (FileNotFoundException e1) { 

            Log.e(TAG, "Error opening file " + TMP_FILE_NAME); 

            return null; 

        }  
        try {  
            fos.close();  
        } catch (IOException e) {  

            Log.e(TAG, "Error opening file " + TMP_FILE_NAME); 

            return null; 

        }  
  
        File srcPackageFile = new File(filePath); 

        if (!FileUtils.copyFile(srcPackageFile, tmpPackageFile)) { 

            Log.w(TAG, "Failed to make copy of file: " + srcPackageFile); 

            return null; 

        }  
        return tmpPackageFile;  

    }  
  
    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);  
          
    }  
}  

package cn.ceadic.apkmgr;

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.net.Uri;
import android.util.Log;

import android.content.pm.IPackageInstallObserver;
import android.content.pm.IPackageDeleteObserver;
import android.os.FileUtils;

public class PackageInstaller {
	
	private File mTmpFile;
	private final String TMP_FILE_NAME = "tmpCopy.apk";

	private final static String TAG = "PackInstaller";
	private Context mContext;

	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, String packageName) {

		Log.i(TAG, "path=" + path);
		int installFlags = 0;
		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);
		}

		// Create temp file before invoking install api
		mTmpFile = createTempPackageFile(path);
		if (mTmpFile == null) {
			// Message msg = mHandler.obtainMessage(INSTALL_COMPLETE);
			// msg.arg1 = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
			// mHandler.sendMessage(msg);
			return;
		}
		Uri mPackageURI = Uri.parse("file://" + mTmpFile.getPath());
		String installerPackageName = mContext.getIntent().getStringExtra(
				Intent.EXTRA_INSTALLER_PACKAGE_NAME);

		PackageInstallObserver observer = new PackageInstallObserver();
		pm.installPackage(mPackageURI, observer, installFlags,
				installerPackageName);
	}

	private File createTempPackageFile(String filePath) {
		File tmpPackageFile = mContext.getFileStreamPath(TMP_FILE_NAME);
		if (tmpPackageFile == null) {
			Log.w(TAG, "Failed to create temp file");
			return null;
		}
		if (tmpPackageFile.exists()) {
			tmpPackageFile.delete();
		}
		// Open file to make it world readable
		FileOutputStream fos;
		try {
			fos = openFileOutput(TMP_FILE_NAME, MODE_WORLD_READABLE);
		} catch (FileNotFoundException e1) {
			Log.e(TAG, "Error opening file " + TMP_FILE_NAME);
			return null;
		}
		try {
			fos.close();
		} catch (IOException e) {
			Log.e(TAG, "Error opening file " + TMP_FILE_NAME);
			return null;
		}

		File srcPackageFile = new File(filePath);
		if (!FileUtils.copyFile(srcPackageFile, tmpPackageFile)) {
			Log.w(TAG, "Failed to make copy of file: " + srcPackageFile);
			return null;
		}
		return tmpPackageFile;
	}

	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);
		
	}
}


3、别忘记添加权限

[html]
view plaincopyprint?

<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"
/>

<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" />

以上代码在Android2.1的SDK中编译通过,并正确批量安装卸载应用程序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: