`
andy_叶
  • 浏览: 67975 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

PackageManager

阅读更多

 

PackageManager分析(5)

 

 

 

pakcage install 示例。

 

如果有哪些代码不明白,可以留言给我,我再解释。


public class InstallThread extends Thread {  //因为安装时间比较耗时,一般放在单独的线程中
    
    public static final int INSTALL_SUCCESS = 1;
    public static final int INSTALL_FAIL = 0;
    public static final int INSTALL_MSG_WHAT = 0;

    private int mInstallFlags = 0;
    private int mInstallResult = 1;
    private Uri mInstallFileUri = null;

    private PackageManager mPackageManager;
    private String mFileName;
    private Context mContext;
    private Handler mHandler;
    private String mType;
    private String mId;
    
    public InstallThread(Context context, Handler handler, String type, String id) {
        mContext = context;
        mHandler = handler;
        mType = type;
        mId = id;
    }

    @Override
    public void run() {
        try {
            mPackageManager = mContext.getPackageManager();
            mInstallFlags = getInstallFlags();
            mInstallFileUri = findApk();
            PackageInstallObserver observer = new PackageInstallObserver();
            mPackageManager.installPackage(mInstallFileUri, observer, mInstallFlags, null);
        } catch (Exception e) {
            e.printStackTrace();
            
            if (mHandler != null) {
                Message msg = mHandler.obtainMessage(INSTALL_MSG_WHAT);
                msg.arg1 = INSTALL_FAIL;
                msg.obj = mFileName;
                mHandler.sendMessage(msg);
            }
        }
    }

    private class PackageInstallObserver extends IPackageInstallObserver.Stub {
        public void packageInstalled(String packageName, int returnCode) {
            try {
                if(checkInstallResult(returnCode)) {
                    mInstallResult = INSTALL_SUCCESS;
                } else {
                    mInstallResult = INSTALL_FAIL;
                }
                
                if (mHandler != null) {
                    Message msg = mHandler.obtainMessage(INSTALL_MSG_WHAT);
                    msg.arg1 = mInstallResult;
                    msg.obj = mFileName;
                    mHandler.sendMessage(msg);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    private Uri findApk() {
        LocalItem item = LocalDataManager.getInstance().query(mContext, mContext.getContentResolver(), mType, mId);
        String path = Config.getFilePath(item.getType(), item.getFileName());
        mFileName = item.getFileName();
        Uri uri = Uri.parse(path);
        Log.d(TAG, "apk file uri ================== " + uri.toString());
        return uri;
    }
    
    private int getInstallFlags() {
        int flags = 0;
        if (Config.getIsInstallReplace()) {
            flags |= PackageManager.INSTALL_REPLACE_EXISTING;
        }
        if (Config.getIsInstallExternal()) {
            flags |= PackageManager.INSTALL_EXTERNAL;
        } else {
            flags |= PackageManager.INSTALL_INTERNAL;
        }
        
        return flags;
    }
    
    private boolean checkInstallResult(int returnCode) {
        Log.d(TAG, " return code ==================== " + returnCode);
        switch(returnCode) {
        case PackageManager.INSTALL_SUCCEEDED: //1
            Log.d(TAG, "install success!");
            return true;
        //data partition error
        case PackageManager.INSTALL_FAILED_ALREADY_EXISTS: //-1
            Log.d(TAG, "install failed: package already exists");
            break;
        case PackageManager.INSTALL_FAILED_INVALID_APK: //-2
            Log.d(TAG, "install failed: invalid apk file");
            break;
        case PackageManager.INSTALL_FAILED_INVALID_URI: //-3
            Log.d(TAG, "install failed: passed invalid uri ");
            break;
        case PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE: //-4
            Log.d(TAG, "install failed: didn't have enough space ");
            break;
        case PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE: //-5
            Log.d(TAG, "install failed: already installed with the same name");
            break;
        case PackageManager.INSTALL_FAILED_NO_SHARED_USER: //-6
            Log.d(TAG, "install failed: requested shared user does not exist ");
            break;
        case PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE: //-7
            Log.d(TAG, "install failed: previously installed package of the same name has a different signature ");
            break;
        case PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE: //-8
            Log.d(TAG, "install failed: requested a shared user which is already installed on the device and does not have matching signature ");
            break;
        case PackageManager.INSTALL_FAILED_MISSING_SHARED_LIBRARY: //-9
            Log.d(TAG, "install failed: package uses a shared library that is not available ");
            break;
        case PackageManager.INSTALL_FAILED_REPLACE_COULDNT_DELETE: //-10
            Log.d(TAG, "install failed: replace couldn't delete ");
            break;
        case PackageManager.INSTALL_FAILED_DEXOPT: //-11
            Log.d(TAG, "install failed: optimizing and validating its dex files failed ");
            break;
        case PackageManager.INSTALL_FAILED_OLDER_SDK: //-12
            Log.d(TAG, "install failed: current SDK version is older than that required by the package ");
            break;
        case PackageManager.INSTALL_FAILED_CONFLICTING_PROVIDER: //-13
            Log.d(TAG, "install failed: a provider already installed ");
            break;
        case PackageManager.INSTALL_FAILED_NEWER_SDK: //-14
            Log.d(TAG, "install failed: current SDK version is newer than that required by the package ");
            break;
        case PackageManager.INSTALL_FAILED_TEST_ONLY: //-15
            Log.d(TAG, "install failed: it is a test-only package");
            break;
        case PackageManager.INSTALL_FAILED_CPU_ABI_INCOMPATIBLE: //-16
            Log.d(TAG, "install failed: contains native code, but none that is compatible with the the device's CPU_ABI ");
            break;
        case PackageManager.INSTALL_FAILED_MISSING_FEATURE: //-17
            Log.d(TAG, "install failed: package uses a feature that is not available ");
            break;
        //sdcard error
        case PackageManager.INSTALL_FAILED_CONTAINER_ERROR: //-18
            Log.d(TAG, "install failed: a secure container mount point couldn't be accessed on external media ");
            break;
        case PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION: //-19
            Log.d(TAG, "install failed: the new package couldn't be installed in the specified install location ");
            break;
        case PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE: //-20
            Log.d(TAG, "install failed: the media is not available ");
            break;
        //parser error
        case PackageManager.INSTALL_PARSE_FAILED_NOT_APK: //-100
            Log.d(TAG, "install failed: a path that is not a file, or does not end with the expected '.apk' extension");
            break;
        case PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST: //-101
            Log.d(TAG, "install failed: the parser was unable to retrieve the AndroidManifest.xml file");
            break;
        case PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION: //-102
            Log.d(TAG, "install failed: the parser encountered an unexpected exception");
            break;
        case PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES: //-103
            Log.d(TAG, "install failed: parser did not find any certificates in the .apk ");
            break;
        case PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES: //-104
            Log.d(TAG, "install failed: parser found inconsistent certificates on the files in the .apk");
            break;
        case PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING: //-105
            Log.d(TAG, "install failed: parser encountered a CertificateEncodingException");
            break;
        case PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME: //-106
            Log.d(TAG, "install failed: parser encountered a bad or missing package name in the manifest ");
            break;
        case PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID: //-107
            Log.d(TAG, "install failed: parser encountered a bad shared user id name in the manifest ");
            break;
        case PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: //-108
            Log.d(TAG, "install failed: parser encountered some structural problem in the manifest ");
            break;
        case PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY: //-109
            Log.d(TAG, "install failed: parser did not find any actionable tags (instrumentation or application) in the manifest");
            break;
        case PackageManager.INSTALL_FAILED_INTERNAL_ERROR: //-110
            Log.d(TAG, "install failed: the system failed to install the package because of system issues ");
            break;
        default:
            Log.d(TAG, "install failed: unknow reason ");
            break;
        }
        return false;
    }
}

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics