Android之通过URL获取图片的方法

通过图片url,获取到实际图片,同时支持http和https图片。

package com.mili.smarthome.tkj.utils;

import android.annotation.SuppressLint;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.NoSuchAlgorithmException;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;

public class UrlUtils {

    /**
     * 获取图片存储路径及名称
     *
     * @param url url
     * @return 文件名
     */
    private static String getFilenameFromUrl(String url) {
        if (url == null || url.length() == 0) {
            return null;
        }
        String[] strList = url.split("\\?");
        if (strList[0] != null) {
            String[] itemList = strList[0].split("/");
            if (itemList.length > 0) {
                return itemList[itemList.length - 1];
            }
        }
        return null;
    }

    /**
     * 获取http url的数据流
     *
     * @param httpUrl url地址
     * @return 数据流
     */
    private static InputStream getStreamByHttpUrl(String httpUrl) {
        InputStream inputStream = null;
        try {
            URL url = new URL(httpUrl);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setConnectTimeout(3000);
            urlConnection.setDoInput(true);
            urlConnection.connect();
            int responseCode = urlConnection.getResponseCode();
            if (responseCode == 200) {
                inputStream = urlConnection.getInputStream();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return inputStream;
    }

    /**
     * 获取https url的数据流
     *
     * @param httpsUrl url地址
     * @return 数据流
     */
    private static InputStream getStreamByHttpsUrl(String httpsUrl) {
        InputStream inputStream = null;
        try {
            URL url = new URL(httpsUrl);
            HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setConnectTimeout(3000);
            urlConnection.setSSLSocketFactory(SSLContext.getDefault().getSocketFactory());
            //解决由于服务器证书问题导致HTTPS无法访问的情况
            urlConnection.setHostnameVerifier(new HostnameVerifier() {
                @SuppressLint("BadHostnameVerifier")
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
            urlConnection.setDoInput(true);
            urlConnection.connect();
            int responseCode = urlConnection.getResponseCode();
            if (responseCode == 200) {
                inputStream = urlConnection.getInputStream();
            }
        } catch (IOException | NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return inputStream;
    }

    /**
     * 存储url图片文件
     *
     * @param imgUrl 图片url
     * @return 文件名称
     */
    public static String getImageByUrl(String imgUrl, String path) {
        try {
            InputStream inputStream;
            URL url = new URL(imgUrl);
            if (url.getProtocol().toLowerCase().equals("https")) {
                inputStream = getStreamByHttpsUrl(imgUrl);
            } else {
                inputStream = getStreamByHttpUrl(imgUrl);
            }
            if (inputStream == null) {
                Log.e("UrlUtils", "[getImageByUrl] inputStream is null.");
                return null;
            }

            String filename = getFilenameFromUrl(imgUrl);
            String filePath = path + "/" + filename;
            File file = new File(filePath);
            FileOutputStream fos = new FileOutputStream(file);

            byte[] buffer = new byte[1500];
            int readlen;
            while ((readlen = inputStream.read(buffer, 0, buffer.length)) >= 0) {
                fos.write(buffer, 0, readlen);
            }
            fos.flush();
            fos.close();
            inputStream.close();

            Log.e("UrlUtils", "[getImageByUrl] filePath: " + filePath);
            return filePath;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio中使用WebSocket获取图片数据的步骤如下: 1. 首先,确保你已经在项目的build.gradle文件中添加了WebSocket库的依赖。例如,可以在dependencies块中添加以下代码: ``` implementation 'org.java-websocket:Java-WebSocket:1.5.1' ``` 2. 在你的代码中创建一个WebSocket连接。你可以使用Java-WebSocket库提供的WebSocketClient类来实现。首先,创建一个继承自WebSocketClient的类,并重写onOpen、onMessage、onClose和onError等方法。在onOpen方法中,你可以发送一个请求来获取图片数据。例如: ``` WebSocketClient client = new WebSocketClient(new URI("ws://your_websocket_url")) { @Override public void onOpen(ServerHandshake handshakedata) { // 发送请求获取图片数据 client.send("get_image_data"); } @Override public void onMessage(String message) { // 处理接收到的消息,这里可以获取图片数据 // 例如,你可以将接收到的数据保存为图片文件 // 然后可以在UI线程中更新UI显示图片 } @Override public void onClose(int code, String reason, boolean remote) { // 连接关闭时的处理逻辑 } @Override public void onError(Exception ex) { // 发生错误时的处理逻辑 } }; ``` 3. 在你的代码中,使用client.connect()方法来连接WebSocket服务器。例如: ``` client.connect(); ``` 4. 当连接成功后,WebSocketClient会自动调用onOpen方法,并发送请求获取图片数据。当接收到图片数据时,WebSocketClient会自动调用onMessage方法。你可以在onMessage方法中处理接收到的图片数据,例如将其保存为图片文件,并在UI线程中更新UI显示图片。 请注意,以上代码只是一个示例,你需要根据你的实际情况进行适当的修改和调整。同时,确保你已经正确配置了WebSocket服务器的URL和端口号,并且服务器能够正确响应你的请求并返回图片数据。 希望以上信息对你有帮助!\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [Android中socket(tcp|udp),websocket基本使用](https://blog.csdn.net/c_he_n/article/details/105556156)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值