Android PackageInstaller:安装应用的应用,从三流Android外包到秒杀阿里P7
可以看到对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 pkg
try {
// 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
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
][Free test] Assertion while playing music when downloading apks @{
Android PackageInstaller:安装应用的应用,从三流Android外包到秒杀阿里P7相关推荐
- 分享十次Android面试经验总结,已收字节,阿里,从三流Android外包到秒杀阿里P7,
3.是不是任何线程都可以实例化Handler?有没有什么约束条件? 4.Looper.loop是一个死循环,拿不到需要处理的Message就会阻塞,那在UI线程中为什么不会导致ANR? 5.Handl ...
- Android PowerManager,从三流Android外包到秒杀阿里P7
wakeLock.acquire(90 * 1000); } private void acquireWakeLock2() { if(wakeLock == null){ wakeLock = po ...
- 【Android Studio安装部署系列】八、Android Studio主题皮肤更换
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio具有自己的主题皮肤,但是如果想要更换自己喜欢的主题皮肤,可以参考下面的步骤. 注意,更换主题皮肤,之前的 ...
- 【Android Studio安装部署系列】十一、Android studio获取数字签名信息
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 下面介绍下调试版本和发布版本获取数字签名的方法,通过以下方法可以获取到SHA1和MD5. 一般在使用分享功能,在第三方平台中创建应用 ...
- 【Android Studio安装部署系列】十三、Android studio添加和删除Module 2
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 新建.导入.删除Module是常见的操作,这里简单介绍下. 新建Module File--New--New Module... 选中 ...
- 使用PackageInstaller安装app流程学习小结
前言 首先本文不是做PackageManagerService学习总结,PackageManagerService这货有1万2千多行代码,学习起来颇费劲,并且这货功能强大,本文只会总结其中一个小小的功 ...
- 【Android Studio安装部署系列】目录
概述 从刚开始使用Android Studio到现在,下面所有目录下的操作,当时习惯性的把每一个整理成一个文档(其实就是简单文字描述+截图):有些地方当时是一知半解,现在会稍微明白一些.正好赶上现在有 ...
- Android Studio安装并运行初始程序显示‘Hello World‘。
文章目录 前言 一.Android Studio是什么? 二.安装步骤 1.打开Android Studio安装程序 2.配置并使用Android Studio 总结 前言 在安装使用android ...
- phoneGap3.0安装步骤(以windows下的android环境为例):
环境: WIN系统,JDK,Android,Eclipse,Ant,Git,PhoneGap3.x (Cordova) 1. 安装JRE,设置JAVA_HOME,比如JAVA_HOME=C:\prog ...
- android 安装多个apk,Android apk 安装相关的几个目录
一.几个关键目录 1./data/local/tmp /data/local/tmp 目录是转为android studio 安装应用程序保留的目录 android studio 安装apk时 首先将 ...
最新文章
- Mongodb 请求处理流程
- .Net 编码以及与这些编码关联的代码页
- Linux查看c语言组件进程,Linux下查看进程IO工具iopp
- 网上无意中看到的一句话。。。
- redhat 6.4 虚拟化平台搭建千万PV架构
- 大数据——Python数据爬取
- mysqlserver 下载安装
- 如何保障科技产品供应链的安全?
- 显示器接口_显示器接口都有哪些?
- 关于Android直接连MySQL获取数据的真机测试的一些坑
- 爬虫手册03 Selenium的使用
- 五分钟轻松搞定产品需求文档!这可能史上最全PRD文档模板
- ASP.NET Web Pages - 教程
- Windows 2016 服务器安全配置
- [GIS原理] 8 GIS基本空间分析-叠置分析|缓冲区分析|窗口分析
- 支付宝支付验证签名失败
- 曼哈顿算法公式_Manhattan Distance Calculation(曼哈顿距离算法)
- python中Try的运用及意义
- 从 .NET 开发人员的角度理解 Excel 对象模型--------结合上一篇 vb code excel 单元格锁定...
- CE-扫描扫雷中雷区地址
热门文章
- 实用工具软件远古大神Nir Sofer,数百款短小精悍便携工具,从Win2000到Win10通吃
- 跟大家分享一下牛人常用的资源(牛客网 )!
- win7科学计算机不支持,新CPU不支持Win7怎么回事?新一代主板装不了Win7的解决办法...
- Ubuntu20.04配置NTP服务器
- 手机计算机快速切换功能,群控系统快速切换多部手机
- 通过hx1838遥控数码管显示对应数字的程序及问题
- 图像处理的边缘和纹理的区别
- 根据经纬度求距离(算法)
- #define c# 报错_天轰穿C#教程之#define和#undef【原创】
- linux 内核 触摸屏,7. Linux - 触摸屏(电阻屏)驱动程序实现