当前位置: 首页 > news >正文

Android Studio实现解析HTML获取图片URL将图片保存到本地

目录

        • 效果
        • activity_main.xml
        • MainActivity
        • ImageItem
        • ImageAdapter

效果

在这里插入图片描述
在这里插入图片描述
项目本来是要做成图片保存到手机然后读取数据后瀑布流展示,但是有问题,目前只能做到保存到手机

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="horizontal"><Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="生成瀑布流"tools:ignore="MissingConstraints" /><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>

MainActivity

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import android.Manifest;
import android.annotation.SuppressLint;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.FileUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private ImageView imageView;private static final String TAG = "MainActivity";private static final int PERMISSION_REQUEST_CODE = 1;private Button mButton;private List<ImageItem> mImageList;private RecyclerView mRecyclerView;private ImageAdapter mAdapter;@SuppressLint("MissingInflatedId")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mButton = findViewById(R.id.button);mImageList = new ArrayList<>();mRecyclerView = findViewById(R.id.recycler_view);mRecyclerView.setLayoutManager(new LinearLayoutManager(this));mAdapter = new ImageAdapter(mImageList, this);mRecyclerView.setAdapter(mAdapter);mButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},PERMISSION_REQUEST_CODE);} else {// 开始解析HTML并下载图片startParsingAndDownloading();imageView = findViewById(R.id.image_view);Log.e(TAG,"开始解析HTML并下载图片");}}});}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == PERMISSION_REQUEST_CODE) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 写入外部存储权限已授予,解析HTML并下载图片new ParseHtmlTask().execute("https://example.com"); // 替换为你要解析的HTML网页URL} else {// 用户拒绝了权限请求,可以根据需要进行处理}}}//开始解析HTMLprivate void startParsingAndDownloading() {new ParseHtmlTask().execute("https://home.meishichina.com/show-top-type-recipe.html");}private class ParseHtmlTask extends AsyncTask<String, Void, List<ImageItem>> {@Overrideprotected List<ImageItem> doInBackground(String... urls) {String url = urls[0];Document document = null;try {document = Jsoup.connect(url).get();Elements imgElements = document.select("div.pic");for (Element element : imgElements) {String imgUrl = element.select("a").select("img").attr("data-src");mImageList.add(new ImageItem(imgUrl));downloadImage(imgUrl);}} catch (IOException e) {Log.e(TAG,"111");//throw new RuntimeException(e);}return mImageList;}@Overrideprotected void onPostExecute(List<ImageItem> imageList) {mAdapter.notifyDataSetChanged();}private void downloadImage(String imgUrl) {Glide.with(MainActivity.this).downloadOnly().load(imgUrl).into(new CustomTarget<File>() {@Overridepublic void onResourceReady(@NonNull File resource, @Nullable Transition<? super File> transition) {// 下载完成后的处理逻辑,可根据需求进行保存或其他操作// 这里将图片文件保存到手机的公共图片目录下String fileName = "image_" + System.currentTimeMillis() + ".jpg";File destFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), fileName);try {copyFile(resource, destFile);} catch (IOException e) {e.printStackTrace();}}@Overridepublic void onLoadCleared(@Nullable Drawable placeholder) {// 可选的清除逻辑}});}private void copyFile(File sourceFile, File destFile) throws IOException {InputStream inputStream = null;OutputStream outputStream = null;try {inputStream = new FileInputStream(sourceFile);outputStream = new FileOutputStream(destFile);byte[] buffer = new byte[1024];int length;while ((length = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, length);}} finally {if (inputStream != null) {inputStream.close();}if (outputStream != null) {outputStream.close();}}}

ImageItem

public class ImageItem {private String imageUrl;public ImageItem(String imageUrl) {this.imageUrl = imageUrl;}public String getImageUrl() {return imageUrl;}
}

ImageAdapter

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import com.bumptech.glide.Glide;import java.util.List;public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ViewHolder> {private List<ImageItem> imageList;private Context context;public ImageAdapter(List<ImageItem> imageList, Context context) {this.imageList = imageList;this.context = context;}@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(R.layout.item_image, parent, false);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {ImageItem item = imageList.get(position);String imageUrl = item.getImageUrl();// 使用Glide加载图片Glide.with(context).load(imageUrl).into(holder.imageView);}@Overridepublic int getItemCount() {return imageList.size();}public class ViewHolder extends RecyclerView.ViewHolder {ImageView imageView;public ViewHolder(@NonNull View itemView) {super(itemView);imageView = itemView.findViewById(R.id.image_view);}}
}
http://www.lryc.cn/news/128004.html

相关文章:

  • 单例模式的理论与实践
  • 深入了解MongoDB:灵活的文档型数据库与应用案例
  • 【HarmonyOS北向开发】-01 HarmonyOS概述
  • Node.js入门
  • 指针、数组、sizeof、strlen相关知识与练习题目
  • 分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测
  • MyBatis动态SQL:打造灵活可变的数据库操作
  • nginx代理请求到内网不同服务器
  • 【C# 基础精讲】文件读取和写入
  • 设计模式——经典单例
  • 【HarmonyOS】鸿蒙应用获取华为帐号手机号码步骤(API7及以下)
  • webpack相关面试
  • 如何使用ChatGPT创建个性化的健身锻炼计划
  • 人工智能与云计算实训室建设方案
  • 使用 Apache Kafka 和 Go 将数据引入 OpenSearch
  • 2.SpringMvc中Model、ModelMap和ModelAndView使用详解
  • Spark repartition和coalesce的区别
  • 微服务最佳实践,零改造实现 Spring Cloud Apache Dubbo 互通
  • leetcode 力扣刷题 两数/三数/四数之和 哈希表和双指针解题
  • (搜索) 剑指 Offer 12. 矩阵中的路径 ——【Leetcode每日一题】
  • 构建高可用的去中心化微服务集群架构指南
  • Sui主网升级至V1.7.1版本
  • 自然语言处理从入门到应用——LangChain:索引(Indexes)-[基础知识]
  • k8s集群监控方案--node-exporter+prometheus+grafana
  • nginx反向代理流程
  • Java“牵手”根据店铺ID获取淘宝店铺所有商品数据方法,淘宝API实现批量店铺商品数据抓取示例
  • 从0开始yolov8模型目标检测训练
  • 设计模式-抽象工厂模式
  • 如何用Apipost实现sign签名?
  • Hive底层数据存储格式