Android 下载APK 安装APK 打开APK

转自:http://www.2cto.com/kf/201405/303571.html


今天有了一个这样的需求 :下载一个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
      */
     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的方法:

?
1
2
3
4
5
6
7
8
/**
      * 安装APK
      */
     private void installApk() {
         Intent intent = new Intent(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
      */
     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的的信息这个大家都会了,这里就不说了。


下面是我的所有代码:

?
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
  *
  */
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());
     }
}


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

?
1
2
3
4
5
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卡写文件的权限:

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值