您的位置:首页 > 移动开发 > Android开发

Android 下载APK 安装APK 打开APK

2014-05-23 11:10 369 查看
今天有了一个这样的需求 :下载一个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"/>


源代码的下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: