下载一个应用到SD卡然后启动系统的安装程序
来源:互联网 发布:vb自定义数据类型 编辑:程序博客网 时间:2024/04/30 04:09
1 首先建一个布局 里面放一个button(布局简单 就不写了)
2 下载 APK到 外部存储 这里 用AsyncTask来下载 (AsyncTask 不会的 看我前面 的文章)
package com.ldh.downapktosd;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
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 android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
public class MyDownAPKTask extends AsyncTask<String, Integer, String> {
private CallBack callback;
private int allen;
//这里 定义一个接口 待会 回调 将数据回传到MainAactivity
public interface CallBack {
public void start();
public void updata(int progress);
public void finish(String path);
}
public MyDownAPKTask(CallBack callback) {
this.callback = callback;
}
//用于更行进度条
@Override
protected void onProgressUpdate(Integer... values) {
if (callback != null) {
//用接口回调来使ProgressDialog得进度条更新
callback.updata(values[0]);
}
}
//用于在doInBackground启动前将ProgressDialog创建并展示出来
@Override
protected void onPreExecute() {
if (callback != null) {
//用接口回调来使ProgressDialog显示出来
callback.start();
}
}
@Override
protected String doInBackground(String... params) {
try {
HttpURLConnection conn = (HttpURLConnection) new URL(params[0])
.openConnection();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStream in = conn.getInputStream();
allen = conn.getContentLength();
BufferedInputStream bis = new BufferedInputStream(in);
//用来判断 外部存储是否挂载
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
Log.d("print", "没有挂载好");
return null;
}
File dir = Environment.getExternalStorageDirectory();
File file = new File(dir, "joke.apk");
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(file));
int len;
int sum = 0;
byte[] b = new byte[1024 * 4];
while ((len = bis.read(b)) != -1) {
bos.write(b, 0, len);
sum += len;
//用来调用onProgressUpdate使ProgressDialog的进度条更新
publishProgress(sum * 100 / allen);
}
bis.close();
bos.close();
Log.d("print",file.getAbsolutePath());
return file.getAbsolutePath();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
if (callback != null) {
//接口回调来回传文件下载到外部存储的路径
callback.finish(result);
}
}
}
3 在MainActivity里面实现界面显示的具体操作
package com.ldh.downapktosd;
import java.io.File;
import com.ldh.downapktosd.MyDownAPKTask.CallBack;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener, CallBack {
String str1 = "http://www.ytmfdw.com/download/joke.apk";
private Button btn_down;
private ProgressDialog pd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_down = (Button) findViewById(R.id.dowm);
btn_down.setOnClickListener(this);
}
@Override
public void onClick(View v) {
MyDownAPKTask task = new MyDownAPKTask(this);
task.execute(str1);
}
//在AsyncTask里面定义的接口对象 的调用的start方法的具体实现 来创建ProgressDialog 并显示出来
@Override
public void start() {
pd = new ProgressDialog(this);
pd.setTitle("下载APK");
pd.setMessage("正在下载。。。");
pd.setIndeterminate(false);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setCancelable(false);
pd.show();
pd.setProgress(0);
pd.setMax(100);
}
//在AsyncTask里面定义的接口对象 的调用的updata方法的具体实现 来更新ProgressDialog
@Override
public void updata(int progress) {
pd.setProgress(progress);
}
//在AsyncTask里面定义的接口对象 的调用的finish方法的具体实现 将下载完的APK的在外部存储的路径传到系统安装应用程序的界面
@Override
public void finish(String path) {
pd.dismiss();
if (path == null) {
Toast.makeText(this, "", Toast.LENGTH_SHORT).show();
return;
}
File file = new File(path);
if (!file.exists()) {
Toast.makeText(this, "", Toast.LENGTH_SHORT).show();
return;
}
//进行 安装Apk 利用隐式意图来安装
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse("file://" + path.toString()),
"application/vnd.android.package-archive");
startActivity(i);
}
}
- 下载一个应用到SD卡然后启动系统的安装程序
- 安卓:启动service,下载网络图片,并将图片存放到内存卡,保存成功后发出广播提醒,然后从SD卡读出显示
- 应用安装到sd卡 收藏备用
- Android 程序默认安装到sd卡
- Android ,下载安装apk 启动一个应用
- Andoid应用更新,解决andrid5.0获取系统权限把下载APK存到SD卡中,版本号的比较,有手动更新和自动更新
- 《Windows小应用》如何将一个自己download的zip文件安装的程序添加到系统服务中
- zedboard--拷贝到SD卡启动的fsbl引导裸跑程序实验(九)
- 新建线程下载apk到sd卡并且安装
- 如何在win系统下安装树莓派的系统到SD卡(菜鸟教程一)
- 让你的android 应用支持转移安装到sd
- 下载到SD卡文件
- 判断应用是否安装到Sd卡上
- 如何将android 应用安装到SD卡上
- adb命令将应用安装到sd卡
- android程序一个注册,然后到设置兴趣爱好,出生日期,然后把所有信息显示在另一个页面的程序
- 启动系统安装程序开发指定文件,安装应用
- Android - 在一个应用程序中启动另外一个已经安装的应用程序或系统程序
- struts2标签ifelse判断条件的使用
- BPM嵌入式流程解决方案分享
- java高并发解决方案
- mysql时间比较
- jquery关于移动端的点击事件解析
- 下载一个应用到SD卡然后启动系统的安装程序
- NYOJ15:括号匹配(二)(区间dp)
- NYOJ 题目108 士兵杀敌(一)
- Compensating-Transaction模式
- 冒泡,选择,插入,时间复杂度O(n2)算法感悟(此博文属于对于排序过程有大概了解的同学)
- Android中常见的内存泄露分析
- JavaScript: Introduction to JavaScript
- rdd转换为DataFrame
- 欢迎使用CSDN-markdown编辑器