PackageInstaller作为安装应用的应用,在Android中的地位有些特殊。

看看在AndroidManifest.xml中的声明:

                                                                                                                                                                                                                                

可以看到对application/vnd.android.package-archive这个mime的处理,还有android.intent.action.INSTALL_PACKAGE这个action的处理。

在文件管理器中点击apk文件,或者发送以上intent-filter中对应的action,就会调用PackageInstaller。


1.只安装指定前缀包名的应用

我们可以在initiateInstall()这个函数中,通过包名对将要安装的应用进行管控,参考代码如下:

    private void initiateInstall() {        String pkgName = mPkgInfo.packageName;Log.v("AZ","[initiateInstall]pkgName:" + pkgName);if(pkgName.startsWith("com.zms")){// Check if there is already a package on the device with this name// but it has been renamed to something else.String[] oldName = mPm.canonicalToCurrentPackageNames(new String[] { pkgName });if (oldName != null && oldName.length > 0 && oldName[0] != null) {pkgName = oldName[0];mPkgInfo.packageName = pkgName;mPkgInfo.applicationInfo.packageName = pkgName;}// Check if package is already installed. display confirmation dialog if replacing pkgtry {// This is a little convoluted because we want to get all uninstalled// apps, but this may include apps with just data, and if it is just// data we still want to count it as "installed".mAppInfo = mPm.getApplicationInfo(pkgName,PackageManager.GET_UNINSTALLED_PACKAGES);if ((mAppInfo.flags&ApplicationInfo.FLAG_INSTALLED) == 0) {mAppInfo = null;}} catch (NameNotFoundException e) {mAppInfo = null;}mInstallFlowAnalytics.setReplace(mAppInfo != null);mInstallFlowAnalytics.setSystemApp((mAppInfo != null) && ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0));startInstallConfirm();}else{finish();}    }

以上代码的效果就是,只安装包名以“com.zms”开头的应用。其他的不会出现安装界面,直接finish()。



2.PackageInstaller安装完某个应用,自动打开:

packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java

    private Handler mHandler = new Handler() {        public void handleMessage(Message msg) {            switch (msg.what) {                case INSTALL_COMPLETE:                    mInstallFlowAnalytics.setFlowFinishedWithPackageManagerResult(msg.arg1);                    if (getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)) {                        Intent result = new Intent();                        result.putExtra(Intent.EXTRA_INSTALL_RESULT, msg.arg1);                        setResult(msg.arg1 == PackageManager.INSTALL_SUCCEEDED                                ? Activity.RESULT_OK : Activity.RESULT_FIRST_USER,                                        result);                        finish();                        return;                    }                    // Update the status text                    mProgressBar.setVisibility(View.INVISIBLE);                    // Show the ok button                    int centerTextLabel;                    int centerExplanationLabel = -1;                    LevelListDrawable centerTextDrawable = (LevelListDrawable) getResources()                            .getDrawable(R.drawable.ic_result_status);                    if (msg.arg1 == PackageManager.INSTALL_SUCCEEDED) {                        mLaunchButton.setVisibility(View.VISIBLE);                        centerTextDrawable.setLevel(0);                        centerTextLabel = R.string.install_done;                        // Enable or disable launch button                        mLaunchIntent = getPackageManager().getLaunchIntentForPackage(                                mAppInfo.packageName);                        boolean enabled = false;                        if(mLaunchIntent != null) {                            List list = getPackageManager().                                    queryIntentActivities(mLaunchIntent, 0);                            if (list != null && list.size() > 0) {                                enabled = true;                                                   }                        if (enabled) {                            // ZMS:Add for opening app automatically START                            if(mAppInfo.packageName.equals("com.zms.demo")){                               startActivity(mLaunchIntent);                            }                            // ZMS:END                            mLaunchButton.setOnClickListener(InstallAppProgress.this);                        } else {                            mLaunchButton.setEnabled(false);                        }                    } else if (msg.arg1 == PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE){                        /// M: [ALPS00269830][ICS-TDD][Symbio][Free test] Assertion while playing music when downloading apks @{                        if (!isFinishing()) {                            Log.d(TAG, "!isFinishing()");   // Check to see whether this activity is in the process of finishing                        showDialogInner(DLG_OUT_OF_SPACE);                        }                        /// @}                        return;                    } else {                        // Generic error handling for all other error codes.                        centerTextDrawable.setLevel(1);                        centerExplanationLabel = getExplanationFromErrorCode(msg.arg1);                        centerTextLabel = R.string.install_failed;                        mLaunchButton.setVisibility(View.INVISIBLE);                    }                    if (centerTextDrawable != null) {                    centerTextDrawable.setBounds(0, 0,                            centerTextDrawable.getIntrinsicWidth(),                            centerTextDrawable.getIntrinsicHeight());                        mStatusTextView.setCompoundDrawablesRelative(centerTextDrawable, null,                                null, null);                    }                    mStatusTextView.setText(centerTextLabel);                    if (centerExplanationLabel != -1) {                        mExplanationTextView.setText(centerExplanationLabel);                        mExplanationTextView.setVisibility(View.VISIBLE);                    } else {                        mExplanationTextView.setVisibility(View.GONE);                    }                    mDoneButton.setOnClickListener(InstallAppProgress.this);                    mOkPanel.setVisibility(View.VISIBLE);                    break;                default:                    break;            }        }    };



更多相关文章

  1. UI开发第一篇——android的九宫格式实现
  2. Android动态显示和隐藏状态栏探究。
  3. Error running app: Instant Run requires 'Tools | Android(安
  4. android donut 飞行模式分析
  5. 【Android单元测试系列】真正的异步单元测试
  6. JDK ANT ANDROID Configure
  7. Android应用最上层悬浮窗实现不依赖于Activity的弹框
  8. Android:Android(安卓)Support Design之TabLayout使用详解
  9. android viewpage的使用

随机推荐

  1. android悬浮窗的两种实现方案
  2. Android开发之Android体系架构介绍
  3. Android的应用前景
  4. 小编程(三):用户登录注册界面开发及用户信息
  5. 锦囊篇|一文摸懂RxJava
  6. Android 5.0 技术新趋势
  7. Android(安卓)解读main log和event log日
  8. Android(安卓)设置TextView滑动滚动条和
  9. ubuntu添加android真机调试
  10. android简陋的开发工具