首页 > 代码库 > Android 下载APK 安装APK 打开APK

Android 下载APK 安装APK 打开APK

今天有了一个这样的需求 :下载一个apk文件,然后当你下载完成后,按钮的文字发生改变,变成点击安装,然后安装完成之后,变成打开。

这是下载apk的方法:

/**
	 * 后台在下面一个Apk 下载完成后返回下载好的文件
	 * 
	 * @param httpUrl
	 * @return
	 */
	private File downFile(final String httpUrl) {

		new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					URL url = new URL(httpUrl);
					HttpURLConnection connection = (HttpURLConnection) url.openConnection();
					connection.setRequestMethod("GET");
					connection.setConnectTimeout(5000);
					FileOutputStream fileOutputStream = null;
					InputStream inputStream;
					if (connection.getResponseCode() == 200) {
						inputStream = connection.getInputStream();

						if (inputStream != null) {
							file = getFile(httpUrl);
							fileOutputStream = new FileOutputStream(file);
							byte[] buffer = new byte[1024];
							int length = 0;

							while ((length = inputStream.read(buffer)) != -1) {
								fileOutputStream.write(buffer, 0, length);
							}
							fileOutputStream.close();
							fileOutputStream.flush();
						}
						inputStream.close();
					}

					System.out.println("已经下载完成");
					// 往handler发送一条消息 更改button的text属性
					Message message = handler.obtainMessage();
					message.what = 1;
					handler.sendMessage(message);

				} catch (MalformedURLException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}).start();
		return file;
	}


这是安装APK的方法:

/**
	 * 安装APK
	 */
	private void installApk() {
		Intent intent = new Intent(Intent.ACTION_VIEW);
		intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
		startActivity(intent);
	}


这是打开APK的方法:

/**
	 * 打开已经安装好的apk
	 */
	private void openApk(Context context, String url) {
		PackageManager manager = context.getPackageManager();
		// 这里的是你下载好的文件路径
		PackageInfo info = manager.getPackageArchiveInfo(Environment.getExternalStorageDirectory().getAbsolutePath()
				+ getFilePath(url), PackageManager.GET_ACTIVITIES);
		if (info != null) {
			Intent intent = manager.getLaunchIntentForPackage(info.applicationInfo.packageName);
			startActivity(intent);
		}
	}
打开APK  这里弄了好久,之前不知道有个getLaunchIntentForPackage方法  这个方法只要你能得到这个apk的报名,然后将包名加到后面,startActivity  它就会自动自动你的APK的主界面了。相信得到一个APK的的信息这个大家都会了,这里就不说了。


下面是我的所有代码:

/**
 * 下载Apk 安装Apk 打开APK
 * 
 * @author Administrator
 * 
 */
public class MainActivity extends Activity {
	private Button button1;
	private static final String URL_STRING = "http://gdown.baidu.com/data/wisegame/b7d7e4efd8199dea/tianyiyuedu_310.apk";
	private static int down = 0;
	File file;

	private Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);

			switch (msg.what) {
			case 1:
				button1.setText("点击安装");
				down = 1;
				break;
			case 2:
				down = 2;
				button1.setText("打开");
				break;
			}
		}

	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		button1 = (Button) findViewById(R.id.button1);
		button1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// 下载apk
				if (down == 0) {
					downFile(URL_STRING);
					button1.setText("正在下载");
					// 安装APK
				} else if (down == 1) {
					installApk();
					// 打开apk
				} else if (down == 2) {
					openApk(MainActivity.this, URL_STRING);
				}

			}
		});

	}

	// 接收到安装完成apk的广播
	BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

		@Override
		public void onReceive(Context context, Intent intent) {

			System.out.println("接收到安装完成apk的广播");

			Message message = handler.obtainMessage();
			message.what = 2;
			handler.sendMessage(message);
		}
	};

	/**
	 * 后台在下面一个Apk 下载完成后返回下载好的文件
	 * 
	 * @param httpUrl
	 * @return
	 */
	private File downFile(final String httpUrl) {

		new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					URL url = new URL(httpUrl);
					HttpURLConnection connection = (HttpURLConnection) url.openConnection();
					connection.setRequestMethod("GET");
					connection.setConnectTimeout(5000);
					FileOutputStream fileOutputStream = null;
					InputStream inputStream;
					if (connection.getResponseCode() == 200) {
						inputStream = connection.getInputStream();

						if (inputStream != null) {
							file = getFile(httpUrl);
							fileOutputStream = new FileOutputStream(file);
							byte[] buffer = new byte[1024];
							int length = 0;

							while ((length = inputStream.read(buffer)) != -1) {
								fileOutputStream.write(buffer, 0, length);
							}
							fileOutputStream.close();
							fileOutputStream.flush();
						}
						inputStream.close();
					}

					System.out.println("已经下载完成");
					// 往handler发送一条消息 更改button的text属性
					Message message = handler.obtainMessage();
					message.what = 1;
					handler.sendMessage(message);

				} catch (MalformedURLException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}).start();
		return file;
	}

	/**
	 * 安装APK
	 */
	private void installApk() {
		Intent intent = new Intent(Intent.ACTION_VIEW);
		intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
		startActivity(intent);
	}

	@Override
	protected void onStart() {
		super.onStart();

		IntentFilter intentFilter = new IntentFilter();
		intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
		intentFilter.addDataScheme("package");

		// 注册一个广播
		registerReceiver(broadcastReceiver, intentFilter);
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		// 解除广播
		unregisterReceiver(broadcastReceiver);
	}

	/**
	 * 打开已经安装好的apk
	 */
	private void openApk(Context context, String url) {
		PackageManager manager = context.getPackageManager();
		// 这里的是你下载好的文件路径
		PackageInfo info = manager.getPackageArchiveInfo(Environment.getExternalStorageDirectory().getAbsolutePath()
				+ getFilePath(url), PackageManager.GET_ACTIVITIES);
		if (info != null) {
			Intent intent = manager.getLaunchIntentForPackage(info.applicationInfo.packageName);
			startActivity(intent);
		}
	}

	/**
	 * 根据传过来url创建文件
	 * 
	 */
	private File getFile(String url) {
		File files = new File(Environment.getExternalStorageDirectory().getAbsoluteFile(), getFilePath(url));
		return files;
	}

	/**
	 * 截取出url后面的apk的文件名
	 * 
	 * @param url
	 * @return
	 */
	private String getFilePath(String url) {
		return url.substring(url.lastIndexOf("/"), url.length());
	}
}


布局文件就只要一个按钮,就不贴出来了。还有一个东西,就是监听一个应用安装完成的广播,我这里是直接在代码中注册:

IntentFilter filter = new IntentFilter();  
      
    filter.addAction("android.intent.action.PACKAGE_ADDED");  
    filter.addAction("android.intent.action.PACKAGE_REMOVED");  
    filter.addDataScheme("package");

监听安装apk和卸载apk的广播,其它的相信大家看代码也能看懂了,代码有点粗糙(菜鸟一枚),有哪里写的不好的地方,欢迎大家指正

这个程序我没有考虑其他的情况,比如apk安装出错了,要怎么处理,等等。。


忘记说了,还需要在配置文件中添加访问网络和往sd卡写文件的权限:

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


源代码的下载地址