模仿安卓市场自动下载安装打开apk应用程序

主程序

package com.example.downloadnotify;

import java.io.File;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RemoteViews;
import android.widget.Toast;

public class Main extends Activity implements OnClickListener{

String downloadUrl = "http://xxx";
String fileDir = "/sdcard/xxx/";
String fileName = fileDir+"xxx.apk";
private static Button btn;
private Handler handler = new Handler() {};

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

btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(this);
File f = new File(fileDir);
if(!f.exists()){
f.mkdirs();
}
initBtnState();
}

@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
File f = new File(fileDir);
if(!f.exists()){
f.mkdirs();
}
initBtnState();
}

@Override
public void onClick(View v) {
// TODO Auto-generated method
btnClickAction();
}

private void initBtnState(){
if(checkBrowser("com.explusalpha.NesEmu")){
//start();
btn.setText("打开");
}else{
File file = new File(fileName);
if(file.exists()){
btn.setText("安装");
}else{
btn.setText("下载");
}
}
}

private void btnClickAction(){
if(btn.getText().toString().equals("下载")){
AppFileDownUtils afd = new AppFileDownUtils(this, handler, downloadUrl, fileName);
String state = afd.getState().toString();
if(state.equals(Thread.State.NEW.name())){
afd.start();
}
}else if(btn.getText().toString().equals("安装")){
install();
}else if(btn.getText().toString().equals("打开")){
start();
}
}

private void start(){
ComponentName componentName=new ComponentName
("com.explusalpha.NesEmu","com.imagine.BaseActivity");
Intent intent=new Intent();
intent.setComponent(componentName);
intent.setAction(Intent.ACTION_VIEW);
startActivity(intent);
}

private void install(){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://"
+fileName),
"application/vnd.android.package-archive");
startActivity(intent);
}

public boolean checkBrowser(String packageName) {
if (packageName == null || "".equals(packageName))
return false;
try {
ApplicationInfo info = getPackageManager().getApplicationInfo(
packageName, PackageManager.GET_UNINSTALLED_PACKAGES);
return true;
} catch (NameNotFoundException e) {
return false;
}
}
public static Runnable updateInstallBtn = new Runnable() {
public void run() {
if (btn != null) {
btn.setText("安装");
}
}
};

}



activity_main.xml


android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >



下载线程(注意android3.0以后规定网络操作必须开启另一个线程执行,否则报错android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099))

package com.example.downloadnotify;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.Toast;

public class AppFileDownUtils extends Thread {

private Context mContext;
private Handler mHandler;
private String mDownloadUrl; // 文件下载url,已做非空检查
private String mFileName;
private Message msg;

public static final int MSG_UNDOWN = 0; //未开始下载
public static final int MSG_DOWNING = 1; // 下载中
public static final int MSG_FINISH = 1; // 下载完成
public static final int MSG_FAILURE = 2;// 下载失败

private NotificationManager mNotifManager;
private Notification mDownNotification;
private RemoteViews mContentView; // 下载进度View
private PendingIntent mDownPendingIntent;

public AppFileDownUtils(Context context, Handler handler,
String downloadUrl, String fileName) {
mContext = context;
mHandler = handler;
mDownloadUrl = downloadUrl;
mFileName = fileName;
mNotifManager = (NotificationManager) mContext
.getSystemService(Context.NOTIFICATION_SERVICE);
msg = new Message();
}

@Override
public void run() {
try {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
Message downingMsg = new Message();
downingMsg.what = MSG_DOWNING;
mHandler.sendMessage(downingMsg);
File saveFilePath = new File(mFileName);
System.out.println(saveFilePath);
mDownNotification = new Notification(
android.R.drawable.stat_sys_download, "下载中", System
.currentTimeMillis());
mDownNotification.flags = Notification.FLAG_ONGOING_EVENT;
mDownNotification.flags = Notification.FLAG_AUTO_CANCEL;
mContentView = new RemoteViews(mContext.getPackageName(),
R.layout.custom_notification);
mContentView.setImageViewResource(R.id.downLoadIcon,
android.R.drawable.stat_sys_download);
mDownPendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(), 0);
boolean downSuc = downloadFile(mDownloadUrl, saveFilePath);
if (downSuc) {
msg.what = MSG_FINISH;
Notification notification = new Notification(
android.R.drawable.stat_sys_download_done, "下载成功",
System.currentTimeMillis());
notification.flags = Notification.FLAG_ONGOING_EVENT;
notification.flags = Notification.FLAG_AUTO_CANCEL;
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(saveFilePath),
"application/vnd.android.package-archive");
PendingIntent contentIntent = PendingIntent.getActivity(
mContext, 0, intent, 0);
notification.setLatestEventInfo(mContext, "下载成功", null,
contentIntent);
mNotifManager.notify(R.drawable.ic_launcher, notification);
mHandler.post(Main.updateInstallBtn);
} else {
msg.what = MSG_FAILURE;
Notification notification = new Notification(
android.R.drawable.stat_sys_download_done, "下载失败",
System.currentTimeMillis());
notification.flags = Notification.FLAG_AUTO_CANCEL;
PendingIntent contentIntent = PendingIntent.getActivity(
mContext, 0, new Intent(), 0);
notification.setLatestEventInfo(mContext, "下载失败", null,
contentIntent);
mNotifManager.notify(R.drawable.ic_launcher, notification);
}

} else {
Toast.makeText(mContext, Environment.getExternalStorageState(),
Toast.LENGTH_SHORT).show();
msg.what = MSG_FAILURE;
}
} catch (Exception e) {
Log.e("AppfileDownUtils", "AppFileDownUtils catch Exception:", e);
msg.what = MSG_FAILURE;
} finally {
mHandler.sendMessage(msg);
}
}

/**
*
* Desc:文件下载
*
* @param downloadUrl
* 下载URL
* @param saveFilePath
* 保存文件路径
* @return ture:下载成功 false:下载失败
*/
private boolean downloadFile(String downloadUrl, File saveFilePath) {
int fileSize = -1;
int downFileSize = 0;
boolean result = false;
int progress = 0;
try {
URL url = new URL(downloadUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
if (null == conn) {
return false;
}
// 读取超时时间 毫秒级
conn.setReadTimeout(10000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
fileSize = conn.getContentLength();
InputStream is = conn.getInputStream();
FileOutputStream fos = new FileOutputStream(saveFilePath);
byte[] buffer = new byte[1024];
int i = 0;
int tempProgress = -1;
while ((i = is.read(buffer)) != -1) {
downFileSize = downFileSize + i;
// 下载进度
progress = (int) (downFileSize * 100.0 / fileSize);
fos.write(buffer, 0, i);

synchronized (this) {
if (downFileSize == fileSize) {
// 下载完成
mNotifManager.cancel(R.id.downLoadIcon);
} else if (tempProgress != progress) {
// 下载进度发生改变,则发送Message
mContentView.setTextViewText(R.id.progressPercent,
progress + "%");
mContentView.setProgressBar(R.id.downLoadProgress,
100, progress, false);
mDownNotification.contentView = mContentView;
mDownNotification.contentIntent = mDownPendingIntent;
mNotifManager.notify(R.id.downLoadIcon,
mDownNotification);
tempProgress = progress;
}
}
}
fos.flush();
fos.close();
is.close();
result = true;
} else {
result = false;
}
} catch (Exception e) {
result = false;
Log.e("", "downloadFile catch Exception:", e);
}
return result;
}
}



custom_notification.xml


android:id="@+id/custom_notification"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:id="@+id/downLoadIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_gravity="center_vertical"
/>
android:layout_height="fill_parent"
android:layout_width="wrap_content"
android:layout_marginLeft="5dip"
android:text="下载进度条"
android:gravity="center_vertical"
/>
android:id="@+id/downLoadProgress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_marginLeft="10dip"
android:layout_width="150dip"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
/>
android:id="@+id/progressPercent"
android:layout_height="fill_parent"
android:layout_width="wrap_content"
android:layout_marginLeft="5dip"
android:gravity="center_vertical"
/>



AndroidManifest.xml

package="com.example.downloadnotify"
android:versionCode="1"
android:versionName="1.0" >

android:minSdkVersion="8"
android:targetSdkVersion="15"/>

android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
android:label="@string/app_name"
android:name=".Main" >




















效果图

[img]http://dl.iteye.com/upload/attachment/0074/4964/23bf46b4-8b3e-3f9f-92a5-6f9848e3853d.png[/img]

[img]http://dl.iteye.com/upload/attachment/0074/4956/2ef8d167-7eb4-3b1b-8566-944a6e2087a2.png[/img]

[img]http://dl.iteye.com/upload/attachment/0074/4962/9bed7cd6-195a-37be-bd0e-d876f7317cbd.png[/img]

[img]http://dl.iteye.com/upload/attachment/0074/4960/3c3e12c1-a3a5-3036-92b5-fd7b4db63719.png[/img]

你可能感兴趣的:(android代码)