这里有新鲜出炉的精品教程,程序狗速度看过来!
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
本篇文章主要介绍了 Android 实现静默安装实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
静默安装主要分为以下几种方式:
一、在 ROOT 过的机器上,在 App 中使用 pm install 指令安装 APK:
- // 申请su权限
- Process process = Runtime.getRuntime().exec("su");
- dataOutputStream = new DataOutputStream(process.getOutputStream());
- // 执行pm install命令
- String command = "pm install -r " + apkPath + "\n";
- dataOutputStream.write(command.getBytes(Charset.forName("utf-8")));
- dataOutputStream.flush();
- dataOutputStream.writeBytes("exit\n");
- dataOutputStream.flush();
- process.waitFor();
- errorStream = new BufferedReader(new InputStreamReader(process.getErrorStream()));
- String msg = "";
- String line;
- // 读取命令的执行结果
- while ((line = errorStream.readLine()) != null) {
- msg += line;
- }
- Log.d("TAG", "install msg is " + msg);
- // 如果执行结果中包含Failure字样就认为是安装失败,否则就认为安装成功
- if (!msg.contains("Failure")) {
- result = true;
- }
二、修改系统应用 PackageManagerIntaller.apk 的源码,增加无界面的安装接口:
原理
在 Android 的文件夹中点击一个 APK 时,触发安装事件,PackageInstaller 接收系统服务 PackageManagerService 传来的 intent 信息,传来的 Intent 信息中有 APK 的一些参数。实现的关键是区分一般 APK 和特定 APK。通过传给 PackageManagerService 的 intent 中添加特别的参数,PackageInstaller 接收后进行判断,进行特别的隐藏安装流程。这个实现只能通过程序调用的方式安装。
安装过程的信息窗口在 PackageInstallActivity.java 中实现的。其中安装过程的信息窗口有如下 4 个:
需要实现一个 PakkageInstallActivityHide.java 的文件,去掉上面的 dialog 和窗口。
具体实现
1、最终安装及卸载的类如下:
- InstallAppProgress.java
- PackageInstallerActivity.java
- +PackageInstallerActivityHide.java
- PackageUtil.java
- UninstallAppProgress.java
- UninstallerActivity.java
- +UninstallerActivityHide.java
2、在 Androidmainfest.xml 声明一个特定的 intent:android.intent.action.VIEW.HIDE,由 PackageInstallActivityHide.java 来接收
注意这里的两点:
代码如下:
- <application android:label="@string/app_name">
- <activity android:name=".PackageInstallerActivity" android:theme="@android:style/Theme.Holo.DialogWhenLarge" android:configChanges="orientation|keyboardHidden">
- <intent-filter>
- <action android:name="android.intent.action.VIEW"/>
- <category android:name="android.intent.category.DEFAULT"/>
- <data android:scheme="content"/>
- <data android:scheme="file"/>
- <data android:mimeType="application/vnd.android.package-archive"/>
- </intent-filter>
- </activity>
- <activity android:name=".PackageInstallerHideActivity" android:theme="@android:style/Theme.NoDisplay" android:configChanges="orientation|keyboardHidden">
- <intent-filter>
- <action android:name="android.intent.action.VIEW.HIDE"/>
- <category android:name="android.intent.category.DEFAULT"/>
- <data android:scheme="content"/>
- <data android:scheme="file"/>
- <data android:mimeType="application/vnd.android.package-archive"/>
- </intent-filter>
- </activity>
- <activity android:name=".UninstallerActivityHide" android:theme="@android:style/Theme.NoDisplay" android:configChanges="orientation|keyboardHidden" android:excludeFromRecents="true">
- <intent-filter>
- <action android:name="android.intent.action.VIEW"/>
- <action android:name="android.intent.action.DELETE.HIDE"/>
- <category android:name="android.intent.category.DEFAULT"/>
- <data android:scheme="package"/>
- </intent-filter>
- </activity>
3、实现 PakkageInstallActivityHide.java,UninstallerActivityHide.java。 只需把 PakkageInstallActivity.java 修改去掉 dialog 和对话框。
4、安装程序调用者发一个上面定义的 intent 即可。例如,静默安装 / sdcard/hello.apk(卸载的方法类似)。
- Intent install_hide_intent = new Intent("android.intent.action.VIEW.HIDE");
- install_hide_intent .setDataAndType(Uri.parse("[file:///sdcard/hello.apk](file:///sdcard/hello.apk)"),
- "application/vnd.android.package-archive");
- startActivityForResult(install_hide_intent, INSTALL_RUSULT);
5、注意,这个方法需要 PackageInstall.apk 与系统一起编译。这个 apk 在 / system/app / 目录下面;android.intent.action.VIEW.HIDE 这个静默安装的接口需要开放给第三方。
来源: http://www.phperz.com/article/17/0828/337554.html