Android Studio的笔记--HttpURLConnection使用GET下载zip文件

HttpURLConnection使用GET下载zip文件

http get下载zip文件

MainActivity.java

用HttpURLConnection GET方法进行需注意:

1、Android 9及以上版本需要设置这个,否则会有警告

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy);

}

2、清单中要申请网络权限写入权限

< uses-permission android:name="android.permission.INTERNET" />

< uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3、要在application中添加android:usesCleartextTraffic="true"。否则会有警告,好像加这个有风险,没有细研究

4、关于下载的位置Environment.getExternalStorageDirectory()的路径在/storage/emulated/0

5、关于下载的测试地址http://nginx.org/download/nginx-1.23.4.zip

6、关于下载的两种方式

java 复制代码
package com.lxh.romupgrade;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
    Button bt_post;
    Button bt_post2;
    Context mcontext;
    private static final String TAG = "MainActivity3 lxh";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt_post = findViewById(R.id.bt_post);
        bt_post2 = findViewById(R.id.bt_post2);
        mcontext = MainActivity.this;
        bt_post.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.i(TAG, "onClick");
                download_2();
            }
        });
        bt_post2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.i(TAG, "onClick");
                // Android 9及以上版本需要设置这个,否则会有警告
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                    StrictMode.setThreadPolicy(policy);
                }
                download_3();
            }
        });
    }
    private void download_2() {
        new DownloadZipFileTask().execute();
    }
    public static void download_3() {
        Log.i(TAG, "download_3");
        String url = "http://nginx.org/download/nginx-1.23.4.zip";
        FileOutputStream fos = null;
        InputStream in = null;
        try {
            URL u = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) u.openConnection();
            conn.setRequestMethod("GET");
            int responseCode = conn.getResponseCode();
            Log.i(TAG, "responseCode=" + responseCode);
            if (responseCode == HttpURLConnection.HTTP_OK) {
                fos = new FileOutputStream(Environment.getExternalStorageDirectory() + "/file3.zip");
                byte[] buffer = new byte[1024];
                int len;
                while ((len = conn.getInputStream().read(buffer)) != -1) {
                    fos.write(buffer, 0, len);
                }
                fos.close();
                conn.getInputStream().close();
                Log.i(TAG, "download ok");
            } else {
                Log.i(TAG, "Handle error case here");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (in != null) {
                try {
                    in.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
java 复制代码
package com.lxh.romupgrade;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * create by lxh on 2023/10/10 Time:20:21
 * tip:HTTP 下载
 */
public class DownloadZipFileTask extends AsyncTask<Void, Integer, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        Log.i("lxh", "doInBackground");
        try {
            URL url = new URL("http://nginx.org/download/nginx-1.23.4.zip");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            int fileSize = connection.getContentLength();
            InputStream inputStream = connection.getInputStream();
            FileOutputStream outputStream = new FileOutputStream(Environment.getExternalStorageDirectory() + "/file2.zip");
            byte[] buffer = new byte[4096];
            int bytesRead;
            int totalBytesRead = 0;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
                totalBytesRead += bytesRead;
                int progress = (int) (totalBytesRead * 100 / fileSize);
                publishProgress(progress);
            }

            Log.i("lxh", "download ok");
            outputStream.close();
            inputStream.close();
            connection.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

AndroidMainfest.xml

需要在清单添加

java 复制代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lxh.romupgrade">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/Theme.Romupgrade">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

activity_main.xml

布局如下

java 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <Button
        android:id="@+id/bt_post"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="POST" />
    <Button
        android:id="@+id/bt_post2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="POST2" />
</LinearLayout>

log

点击按钮回显如下

java 复制代码
I/MainActivity3 lxh: onClick
I/lxh: doInBackground
D/NetworkSecurityConfig: No Network Security Config specified, using platform default
I/lxh: download ok

I/MainActivity3 lxh: onClick
I/MainActivity3 lxh: download_3
I/MainActivity3 lxh: responseCode=200
I/MainActivity3 lxh: download ok
相关推荐
yatingliu201936 分钟前
HiveQL | 个人学习笔记
hive·笔记·sql·学习
郭庆汝37 分钟前
CMake概述用法详细笔记
笔记
张人玉40 分钟前
XML 序列化与操作详解笔记
xml·前端·笔记
风和日丽 随波逐流41 分钟前
java17学习笔记-Deprecate the Applet API for Removal
笔记·学习
淮北也生橘121 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习
whysqwhw2 小时前
安卓图片性能优化技巧
android
风往哪边走2 小时前
自定义底部筛选弹框
android
Yyyy4823 小时前
MyCAT基础概念
android
Android轮子哥4 小时前
尝试解决 Android 适配最后一公里
android
yiqiqukanhaiba4 小时前
STM32学习笔记13-通信协议I2C&MPU6050&I2C软件控制
笔记·stm32·学习