虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > Android编程 > Android 下载APK 安装APK 打开APK

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卡写文件的权限:



源代码的下载地址


相关热词搜索: Android 下载APK 安装APK 打开APK