android中从代码上看安装程序之普通安装和静默安装
来源:互联网 发布:ubuntu 卸载node 编辑:程序博客网 时间:2024/06/04 18:41
在Android开发中,我们经常需要对自己的APP进行自动升级安装,今天我们就来讲一讲安装程序的代码怎么写,android中,安装程序的方式分为普通安装和静默安装,普通安装是通过调用Intent来发送一个"application/vnd.android.package-archive"给系统,然后系统调用自身的安装程序来帮助你来完成程序的安装工作。静默安装时通过调用系统命令pm来完成的。
首先来看一下普通安装的代码,这个代码是一般情况下是这样子的:
public static boolean installNormal(Context context, String filePath) { Intent i = new Intent(Intent.ACTION_VIEW); File file = new File(filePath); if (file == null || !file.exists() || !file.isFile() || file.length() <= 0) { return false; } i.setDataAndType(Uri.parse("file://" + filePath), "application/vnd.android.package-archive"); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); return true; }
下面在来看看静默安装的程序是怎么实现的。
public static int installSilent(Context context, String filePath, String pmParams) { if (filePath == null || filePath.length() == 0) { return INSTALL_FAILED_INVALID_URI; } File file = new File(filePath); if (file == null || file.length() <= 0 || !file.exists() || !file.isFile()) { return INSTALL_FAILED_INVALID_URI; } /** * if context is system app, don't need root permission, but should add * <uses-permission android:name="android.permission.INSTALL_PACKAGES" * /> in mainfest **/ StringBuilder command = new StringBuilder() .append("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install ") .append(pmParams == null ? "" : pmParams).append(" ") .append(filePath.replace(" ", "\\ ")); CommandResult commandResult = ShellUtils.execCommand( command.toString(), !isSystemApplication(context), true); if (commandResult.successMsg != null && (commandResult.successMsg.contains("Success") || commandResult.successMsg .contains("success"))) { Log.d("PackageUtils", "install system app ok!"); return INSTALL_SUCCEEDED; } }
静默安装时,一般情况下需要获取系统权限,查看是否是系统APP或具有系统权限的代码如下:
public static boolean isSystemApplication(PackageManager packageManager, String packageName) { if (packageManager == null || packageName == null || packageName.length() == 0) { return false; } try { ApplicationInfo app = packageManager.getApplicationInfo( packageName, 0); return (app != null && (app.flags & ApplicationInfo.FLAG_SYSTEM) > 0); } catch (NameNotFoundException e) { e.printStackTrace(); } return false; }
查看是否具有系统权限
public static boolean checkRootPermission() { return execCommand("echo root", true, false).result == 0; }
public static CommandResult execCommand(String[] commands, boolean isRoot, boolean isNeedResultMsg) { int result = -1; if (commands == null || commands.length == 0) { return new CommandResult(result, null, null); } Process process = null; BufferedReader successResult = null; BufferedReader errorResult = null; StringBuilder successMsg = null; StringBuilder errorMsg = null; DataOutputStream os = null; try { process = Runtime.getRuntime().exec( isRoot ? COMMAND_SU : COMMAND_SH); os = new DataOutputStream(process.getOutputStream()); for (String command : commands) { if (command == null) { continue; } // donnot use os.writeBytes(commmand), avoid chinese charset // error os.write(command.getBytes()); os.writeBytes(COMMAND_LINE_END); os.flush(); } os.writeBytes(COMMAND_EXIT); os.flush(); result = process.waitFor(); // get command result if (isNeedResultMsg) { successMsg = new StringBuilder(); errorMsg = new StringBuilder(); successResult = new BufferedReader(new InputStreamReader( process.getInputStream())); errorResult = new BufferedReader(new InputStreamReader( process.getErrorStream())); String s; while ((s = successResult.readLine()) != null) { successMsg.append(s); } while ((s = errorResult.readLine()) != null) { errorMsg.append(s); } } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (os != null) { os.close(); } if (successResult != null) { successResult.close(); } if (errorResult != null) { errorResult.close(); } } catch (IOException e) { e.printStackTrace(); } if (process != null) { process.destroy(); } } return new CommandResult(result, successMsg == null ? null : successMsg.toString(), errorMsg == null ? null : errorMsg.toString()); }
安装时调用如下:
public static final int install(Context context, String filePath) { if (isSystemApplication(context,filePath) || checkRootPermission()) { return installSilent(context, filePath); } return installNormal(context, filePath) ? INSTALL_SUCCEEDED : INSTALL_FAILED_INVALID_URI; }
1 0
- android中从代码上看安装程序之普通安装和静默安装
- android中从代码上看安装程序之普通安装和静默安装
- android中从代码上看安装程序之普通安装和静默安装
- Android:Java代码实现APP普通安装卸载和静默安装卸载
- Android常用代码之普通及系统权限静默安装APK
- Android常用代码之普通及系统权限静默安装APK
- Android常用代码之普通及系统权限静默安装APK
- Android常用代码之普通及系统权限静默安装APK
- Android常用代码之普通及系统权限静默安装APK
- Android常用代码之普通及系统权限静默安装APK
- Android常用代码之普通及系统权限静默安装APK
- android 中静默安装APK实现代码
- Android静默安装卸载程序
- Android静默安装和静默卸载
- Android--静默安装和静默卸载
- Android静默安装和静默卸载
- Android静默安装和静默卸载
- android实现静默卸载和静默安装
- Lua
- Autumn中文文档0:为什么使用Autumn
- 《java编程思想》--对象
- sprintf函数使用详解
- Windows 程序启动性能优化
- android中从代码上看安装程序之普通安装和静默安装
- 修改bootstrap 中 CSS 样式表,以实现自己需要的部分样式。
- mysql远程连接
- robotframework-ride 运行报monitorcolors not recognized
- jquery技巧之div绑定resize10:30
- 线程的join和detach
- pyCharm使用
- 稀疏矩阵的访问、普通逆置和快速逆置、还原输出以及加法
- 数量金融学(4):投资风险的测量和业绩评价