文档章节

安卓中基本的下载、安装、静默安装、卸载,打开安装好的应用

 奋斗的安卓菜鸟
发布于 2014/12/21 14:41
字数 735
阅读 44
收藏 0
         /* 下载中 */
	private static final int DOWNLOAD = 1;
	/* 下载结束 */
	private static final int DOWNLOAD_FINISH = 2;
	// 安装
	private String cmd_install = "pm install -r ";
	// 卸载
	private String cmd_uninstall = "pm uninstall ";
	// 静默安装在根目录
	String apkLocation = Environment.getExternalStorageDirectory().toString()
			+ "/";
	String fileName;
	int length = 0;
	private int progress;
	private ProgressBar progressBar;
	private TextView downTV;
	private LinearLayout downlayout, barlayout;

        private Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			// 正在下载
			case DOWNLOAD:
				// 设置进度条位置
				progressBar.setProgress(progress);
				break;
			case DOWNLOAD_FINISH:
				progressBar.setProgress(length);
				barlayout.removeView(progressBar);
				ProgressBar large = new ProgressBar(DownloadUpdate.this);
				barlayout.addView(large);
				downTV.setText("下载完成,正在安装最新版本,请稍后!");
				break;
			default:
				break;
			}
		};
	};

       安卓中基本的下载方法:

// 文件下载
	protected File downLoadFile(String httpUrl) {
		//自定义的文件名称
                fileName = "updata1.apk";
		//文件保存在SDCARD下的根目录。如果有需要可以新建一个文件夹
                final File file = new File("/sdcard/" + fileName);

		try {
                        //下载的地址
			URL url = new URL(httpUrl);
			try {
				HttpURLConnection conn = (HttpURLConnection) url
						.openConnection();
				InputStream is = conn.getInputStream();
				FileOutputStream fos = new FileOutputStream(file);
				byte[] buf = new byte[1024];
				conn.connect();
				length = conn.getContentLength();
				int count = 0;
				if (conn.getResponseCode() >= 400) {
					Toast.makeText(DownloadUpdate.this, "连接超时",
							Toast.LENGTH_SHORT).show();
				} else {
					while (1 == 1) {
						int numread = is.read(buf);
						count += numread;
						// 计算进度条位置
						progress = (int) (((float) count / length) * 100);
						// 更新进度
						mHandler.sendEmptyMessage(DOWNLOAD);
						if (numread <= 0) {
							// 下载完成
							mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
							break;
						}
						// 写入文件
						fos.write(buf, 0, numread);
					}
				}
				conn.disconnect();
				fos.close();
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}

		return file;
	}


以上是下载的方法,后面是安装的方法

// 一般打开APK程序
	private void openFile(File file) {
		Log.e("OpenFile", file.getName());
		Intent intent = new Intent();
		intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		intent.setAction(android.content.Intent.ACTION_VIEW);
		intent.setDataAndType(Uri.fromFile(file),
				"application/vnd.android.package-archive");
		startActivity(intent);
	}


有时候根据客户的要求,要用到静默安装,这里找到一个静默安装的方法,前提条件是要有ROOT环境

//静默安装和卸载
protected int excuteSuCMD(String cmd) {
		try {
			Process process = Runtime.getRuntime().exec("su");
			DataOutputStream dos = new DataOutputStream(
					(OutputStream) process.getOutputStream());
			dos.writeBytes((String) "export LD_LIBRARY_PATH=/vendor/lib:/system/lib\n");
			cmd = String.valueOf(cmd);
			dos.writeBytes((String) (cmd + "\n"));
			dos.flush();
			dos.writeBytes("exit\n");
			dos.flush();
			process.waitFor();
			int result = process.exitValue();
			return (Integer) result;
		} catch (Exception localException) {
			localException.printStackTrace();
			return -1;
		}
	}


最后是主线程里面调用这些方法

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.downloadupdate);
		downTV = (TextView) findViewById(R.id.downloadTV);
		progressBar = (ProgressBar) findViewById(R.id.progressBar1);
		downlayout = (LinearLayout) findViewById(R.id.downLayout);
		barlayout = (LinearLayout) findViewById(R.id.downBarLayout);
		final Thread thread = new Thread(new Runnable() {

			@Override
			public void run() {
				Log.d("TAG", "进更新线程");
				
				
				// 下载文件的地址
				//------------------------------------------------------------------------//
				File file = downLoadFile("http://dd-20141030eoux:8080/Tese/GetMacAndIP.apk");
				//------------------------------------------------------------------------//
				
				
				if (file.exists()) {
					Log.d("TAG", "下载成功");
				} else {
					Log.d("TAG", "下载失败");
				}
				
				
				//------------------------------------------------------------------------//
				// 静默卸载原来程序(根据包名)
				String ucmd = cmd_uninstall + "com.example.getmacandip";
				//------------------------------------------------------------------------//	
				excuteSuCMD(ucmd);
				        
                                // 一般的安装
				// openFile(file);

				// 需要静默安装的文件,文件名自己定义为下载的文件名
				String cmd = cmd_install + apkLocation + "updata1.apk";
				excuteSuCMD(cmd);

				// 根据包名打开应用
				PackageManager packageManager = DownloadUpdate.this
						.getPackageManager();
				Intent intent = new Intent();			
				//------------------------------------------------------------------------//
				// 包名打开
				intent = packageManager
						.getLaunchIntentForPackage("com.example.getmacandip");
				//------------------------------------------------------------------------//

				startActivity(intent);
			}
		});
		thread.start();

	}


xml文件里面需要用到的权限:

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


以上可以实现下载目标地址的APK,根据包名静默卸载原有APK,静默安装新下载的APK,最后直接打开APK。中间完全不询问

© 著作权归作者所有

粉丝 1
博文 1
码字总数 735
作品 0
浦东
私信 提问
加载中

评论(1)

小菜很低调
小菜很低调
staractivity(intent)回报一个空指针
android 权限管理和签名 实现静默卸载

为了实现静默卸载, 学了下android的安全体系,记录如下 最近在做个东西,巧合碰到了sharedUserId的问题,所以收集了一些资料,存存档备份。 安装在设备中的每一个apk文件,Android给每个APK...

eric_zhang
2012/09/28
2.4K
1
Android apk的安装、卸载、更新升级(通过Eclipse实现静默安装)

一、通过Intent消息机制发送消息,调用系统应用进行,实现apk的安装/卸载 。 (1) 调用系统的安装应用,让系统自动进行apk的安装 String fileName = "/data/data/com.zlc.ipanel.operate/F...

zhoulc
2013/04/06
23K
40
[RK3288][Android7.1] 调试笔记 --- APK代码中无法通过pm install自我升级

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kris_fei/article/details/90171912 Platform: RK3288 OS: Android 7.1 Kernel: v4.4.83 现象: APK中使用命令...

KrisFei
05/13
0
0
2011全年腾讯移动安全实验室手机病毒行业报告

http://news.zdnet.com.cn/zdnetnews/2012/0118/2075538.shtml 本文摘要 2011年全年,腾讯移动安全实验室一共截获被植入手机病毒软件包数25404个,其中Symbian平台截获被植入病毒软件包数165...

abel_cao
01/28
0
0
Android中实现静态的默认安装和卸载应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangwei0910410003/article/details/36427963 最近好长时间都没有写blog了,主要是因为最近工作上的事以及下...

尼古拉斯_赵四
2014/07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
4
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
7
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
10
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
14
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部