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

这是下载apk的方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/**
     * 后台在下面一个Apk 下载完成后返回下载好的文件
     *
     * @param httpUrl
     * @return
     */
    privateFile downFile(finalString httpUrl) {
        newThread(newRunnable() {
            @Override
            publicvoid run() {
                try{
                    URL url = newURL(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 = newFileOutputStream(file);
                            byte[] buffer = newbyte[1024];
                            intlength = 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();
        returnfile;
    }

这是安装APK的方法:

?
1
2
3
4
5
6
7
8
/**
     * 安装APK
     */
    privatevoid installApk() {
        Intent intent = newIntent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
        startActivity(intent);
    }

这是打开APK的方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
     * 打开已经安装好的apk
     */
    privatevoid 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的的信息这个大家都会了,这里就不说了。

下面是我的所有代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/**
 * 下载Apk 安装Apk 打开APK
 *
 * @author Administrator
 *
 */
publicclass MainActivity extendsActivity {
    privateButton button1;
    privatestatic final String URL_STRING = "http://gdown.baidu.com/data/wisegame/b7d7e4efd8199dea/tianyiyuedu_310.apk";
    privatestatic int down = 0;
    File file;
    privateHandler handler = newHandler() {
        @Override
        publicvoid handleMessage(Message msg) {
            super.handleMessage(msg);
            switch(msg.what) {
            case1:
                button1.setText("点击安装");
                down = 1;
                break;
            case2:
                down = 2;
                button1.setText("打开");
                break;
            }
        }
    };
    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button1 = (Button) findViewById(R.id.button1);
        button1.setOnClickListener(newOnClickListener() {
            @Override
            publicvoid onClick(View v) {
                // 下载apk
                if(down == 0) {
                    downFile(URL_STRING);
                    button1.setText("正在下载");
                    // 安装APK
                }elseif (down == 1) {
                    installApk();
                    // 打开apk
                }elseif (down == 2) {
                    openApk(MainActivity.this, URL_STRING);
                }
            }
        });
    }
    // 接收到安装完成apk的广播
    BroadcastReceiver broadcastReceiver = newBroadcastReceiver() {
        @Override
        publicvoid onReceive(Context context, Intent intent) {
            System.out.println("接收到安装完成apk的广播");
            Message message = handler.obtainMessage();
            message.what = 2;
            handler.sendMessage(message);
        }
    };
    /**
     * 后台在下面一个Apk 下载完成后返回下载好的文件
     *
     * @param httpUrl
     * @return
     */
    privateFile downFile(finalString httpUrl) {
        newThread(newRunnable() {
            @Override
            publicvoid run() {
                try{
                    URL url = newURL(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 = newFileOutputStream(file);
                            byte[] buffer = newbyte[1024];
                            intlength = 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();
        returnfile;
    }
    /**
     * 安装APK
     */
    privatevoid installApk() {
        Intent intent = newIntent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
        startActivity(intent);
    }
    @Override
    protectedvoid onStart() {
        super.onStart();
        IntentFilter intentFilter = newIntentFilter();
        intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
        intentFilter.addDataScheme("package");
        // 注册一个广播
        registerReceiver(broadcastReceiver, intentFilter);
    }
    @Override
    protectedvoid onDestroy() {
        super.onDestroy();
        // 解除广播
        unregisterReceiver(broadcastReceiver);
    }
    /**
     * 打开已经安装好的apk
     */
    privatevoid 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创建文件
     *
     */
    privateFile getFile(String url) {
        File files = newFile(Environment.getExternalStorageDirectory().getAbsoluteFile(), getFilePath(url));
        returnfiles;
    }
    /**
     * 截取出url后面的apk的文件名
     *
     * @param url
     * @return
     */
    privateString getFilePath(String url) {
        returnurl.substring(url.lastIndexOf("/"), url.length());
    }
}

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

?
1
2
3
4
5
IntentFilter filter = newIntentFilter(); 
       
    filter.addAction("android.intent.action.PACKAGE_ADDED"); 
    filter.addAction("android.intent.action.PACKAGE_REMOVED"); 
    filter.addDataScheme("package");

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

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

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

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

转载地址:http://www.2cto.com/kf/201405/303571.html

   

Android 下载APK 安装APK 打开APK相关推荐

  1. android 下载多个文件怎么打开,Android 下载一个资料以及打开这个apk文件

    Android 下载一个文件以及打开这个apk文件 下载一个网络文件的函数如下 public static File downLoadFile(String httpUrl) { // TODO Au ...

  2. apk文件怎么打开(apk文件怎么打开下载)

    APK文件是Android设备上安装应用程序的文件格式.在Google Play商店中下载应用程序时,文件将以APK格式下载到您的手机或平板电脑中.有时,您可能需要手动安装APK文件,例如从非官方来源 ...

  3. 如何在Android模拟器上安装和卸载APK程序包

    如何在Android模拟器上安装和卸载APK程序包 Android, 程序包, APK, 卸载, 模拟 一,安装APK          安装APK当然首先是要有模拟器,和要安装的APK包,这个不多废 ...

  4. android模拟点击系统打开apk按钮,Android开发系列: 电脑端Android模拟器安装使用教程...

    如今说到什么智能手机最火,那很多人肯定会说android系统的手机.如果你还没有Android手机,又想买一部试试,可是价格都不便宜,买来不适合自己怎么办?那么可以先在电脑上安装一个Android模拟 ...

  5. Android 下载 自动安装 解析错误,studio下载APK到手机提示解析错误解决方法

    下载完Android studio,第一件事就是想写hello world,照着第一行代码,新建project,建立一个已经搭好框架的activity,make然后run,很快就执行完成,下图是在选择 ...

  6. Android 下载一个文件以及打开这个apk文件

    下载一个网络文件的函数如下 public static File downLoadFile(String httpUrl) { // TODO Auto-generated method stub f ...

  7. 【Android】提取Android中已安装app的apk

    提取Android中已安装的apk,这个需求很多时候都会遇到.比如从google play上安装过apk后,如何提取出来给别人用? 本文1. 先介绍转载的apk提取方法并 2. 验证提取出来的apk和 ...

  8. Android仅允许安装指定签名apk

    需求:仅允许安装特定签名apk,其它签名apk禁止安装. 一.移植下面代码 commit 814c25ddd422f8f44a3de9451ef25e296a298ea0 Author: shenhb ...

  9. java apk安装路径_android apk安装过程源码解析

    前言: 前一篇博客分析了一下PackageManagerService是如何解析apk的以及我们如何解析未安装apk中的androidManifest.xml文件.解析完肯定要安装的,索性写一篇关于a ...

  10. Android下载并安装APK

    通过DownloadManager来下载APK到本地,下载完成后收到广播再安装APK,可用在软件更新等场合. 添加权限 <uses-permission android:name="a ...

最新文章

  1. C语言再学习 -- 再论数组和指针
  2. [JOI2012春季合宿]Constellation (凸包)
  3. C++ 数据结构-图相关操作的算法思路
  4. C++ Tricks
  5. 如何在webservice中取得sesssionid
  6. 微软如何利用机器学习改进Win 10更新体验
  7. 剑指 Offer 16. 数值的整数次方
  8. spring cloud eureka注册原理-注册失败填坑
  9. 洛谷P1776 宝物筛选
  10. 工业大数据实施需解决哪些问题
  11. 游戏组件——Game类
  12. 【分步入门指南】如何在10分钟内设置EOS钱包和帐户
  13. 如何设置Idea字体颜色
  14. js实现手机横竖屏事件
  15. 支付系列-对接支付宝支付
  16. 全国大学生智能汽车竞赛图像采集处理上位机开源!
  17. 企业CMS网站建设第二课:CMS模版开发——CMS基础设置与栏目管理
  18. BUUCTF:[UTCTF2020]sstv
  19. 天津大学计算机课程设计挂,天津大学智能装置课程设计 电子时钟..doc
  20. Jenkins插件下载失败或下载慢或报错There were errors checking the update sites: SSLHandshakeException: sun.secu解决方案

热门文章

  1. Android设置控件保持在软键盘上方
  2. hihoCoder 1430 A Boring Problem(数论)
  3. 关闭mybatis 日志
  4. 【Oracle 故障处理一则】 ORA-600 - 13013处理过程
  5. 德国威步 codemeter java 加密
  6. 25款最佳响应式HTML5前端开发框架
  7. 给水管网模拟学习路线
  8. Python3,7行代码自动完成手淘喵糖任务,再也不用点点点了。
  9. dbeaver连接Oracle中文乱码的解决方案--druid
  10. 谷歌开发的最良心的应用,如今状态令人叹息,你用过吗?