Android PackageInstaller 静默安装的实现(附源码)

转载来源:http://www.linuxidc.com/Linux/2012-01/52658.htm

要求在安装APK应用时不显示权限信息和安装过程。

  1. Google的安全策略要求任何应用应该提示APK安装包的权限,对于一些内置特定厂商应用,可以跳过安装过程的信息加快安装,或者运营商强制安装。

  2. 这个功能的实现在src/package/app/PackageInstaller中,需要修改。添加静默安装的功能。又兼容正常安装。

实现的分析 

在窗口中点击一个APK时,触发单击事件,PackageInstaller接收系统服务PackageManagerService传来的intent信息,传来的Intent信息中有APK的一些参数。实现的关键是区分一般APK和特定APK

  1. 通过传给PackageManagerServiceintent中添加特别的参数,PackageInstaller接收后进行判断,进行特别的隐藏安装流程。这个实现只能通过程序调用的方式安装。 

  1. 安装过程的信息窗口在PackageInstallActivity.java中实现的。安装过程的信息窗口有4个:需要实现一个PakkageInstallActivityHide.JAVA的文件,去掉下面的dialog和窗口

    1. 安装权限确认窗口:installPermissionConfirm

    2. 安装进度条:installProgress

    3. 安装结果窗口:installResult

    4. 安装错误提示对话框

文件列表大概如下: 

InstallAppProgress.java 

PackageInstallerActivity.java

+PackageInstallerActivityHide.java

PackageUtil.java  

UninstallAppProgress.java

UninstallerActivity.java

+UninstallerActivityHide.java 

具体实现

1 在Androidmainfest.xml声明一个特定的intent:android.intent.action.VIEW.HIDE,由PackageInstallActivityHide.java来接受

注意这里的两点:

 
 
  1.  
  2. 把原先的 <application android:label="@string/app_name" android:theme="@android:style/Theme.Holo.DialogWhenLarge"> 
  3. 改成  <application android:label="@string/app_name">
  4. android:theme="@android:style/Theme.Holo.DialogWhenLarge"主题的显示放在每一个<activity 中,兼容正常按装的UI主题不变
  5.  
  6. 隐藏安装的PakkageInstallActivityHide <activity的主题只能是: 
  7. android:theme="@android:style/Theme.NoDisplay" 只能是这个,没有窗口 

内容如下:

 
 
  1. <application android:label="@string/app_name"> 
  2.  
  3. <activity android:name=".PackageInstallerActivity" android:theme="@android:style/Theme.Holo.DialogWhenLarge" android:configChanges="orientation|keyboardHidden">  
  4. <intent-filter>  
  5. <action android:name="android.intent.action.VIEW"/>  
  6. <category android:name="android.intent.category.DEFAULT"/>  
  7. <data android:scheme="content"/>  
  8. <data android:scheme="file"/>  
  9. <data android:mimeType="application/vnd.android.package-archive"/>  
  10. </intent-filter>  
  11. </activity>  
  12.  
  13. <activity android:name=".PackageInstallerHideActivity" android:theme="@android:style/Theme.NoDisplay" android:configChanges="orientation|keyboardHidden">  
  14. <intent-filter>  
  15. <action android:name="android.intent.action.VIEW.HIDE"/>  
  16. <category android:name="android.intent.category.DEFAULT"/>  
  17. <data android:scheme="content"/>  
  18. <data android:scheme="file"/>  
  19. <data android:mimeType="application/vnd.android.package-archive"/>  
  20. </intent-filter>  
  21. </activity>  
  22.  
  23. <activity android:name=".UninstallerActivityHide" android:theme="@android:style/Theme.NoDisplay" android:configChanges="orientation|keyboardHidden" android:excludeFromRecents="true">  
  24. <intent-filter>  
  25. <action android:name="android.intent.action.VIEW"/>  
  26. <action android:name="android.intent.action.DELETE.HIDE"/>  
  27. <category android:name="android.intent.category.DEFAULT"/>  
  28. <data android:scheme="package"/>  
  29. </intent-filter>  
  30. </activity>  
 

2 实现PakkageInstallActivityHide.java,UninstallerActivityHide.java。 只需把PakkageInstallActivity.java修改去掉dialog和对话框。

3 安装程序调用者发一个上面定义的intent即可。如下例子,静默安装/sdcard/hello.apk

卸载的方法类似。

 
 
  1. Intent install_hide_intent = new Intent("android.intent.action.VIEW.HIDE"); 
  2. install_hide_intent .setDataAndType(Uri.parse("file:///sdcard/hello.apk"), 
  3. "application/vnd.android.package-archive");  
  4. startActivityForResult(install_hide_intent, INSTALL_RUSULT); 

4 注意,这个方法需要PackageInstall这个apk必须与系统一起编译。这个apk在/system/app/目录下面;android.intent.action.VIEW.HIDE 这个静默安装的接口需要开放给第三方。


附:源码路径http://download.csdn.net/detail/qq200841404136/6518467

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值