Android图片爬虫,看妹纸神器项目源码,ListView单张图片查看

                           Android图片爬虫,看妹纸神器项目源码 

 

刚自学完安卓,国庆7七天花了6天纯手写入门级app,从集成图片爬虫到整个项目结束真是一步一个坑.

整个项目没有用框架,都是手写纯属练手,项目中主要用到的技术不多,主要是 :

1.网络爬虫 

2.线性布局

3.ListView

4.imageView

5.Button

6.AlertDialog

7.sd卡运行时权限

8.图片压缩 BitmapFactory.Options

9.动态布局加载 LayoutInflater

10.定时打开新布局 startActivity()

App使用说明:

app内置图片爬虫,用户首次打开app需要在有WiFi的环境中手动加载图片(用户只能加载一次),

APP尽可能每个用户加载的图片是不同的,且用户每次打开时的图片排列顺序是不同的;

 

资源链接:https://pan.baidu.com/s/12Ib93IGdNwtB1bLfM7GdiQ 
提取码:a6i8 

完整项目代码:

MainActivity.java  项目中用的这个启动:

package com.glsite.lookimgeperis.ui;


import android.Manifest;
import android.content.SharedPreferences;
import android.graphics.Bitmap;

import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;


import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import com.glsite.adapter.vewAdpater;
import com.glsite.entity.FileItem;
import com.glsite.lookimgeperis.R;
import com.glsite.utils.pachong1.BaiduImageCrawler;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;


public class MainActivity extends BaseActivity implements AbsListView.OnScrollListener {

    /*private ScrollView mScrollView;//滚动view*/
    private ListView mListView;//listview
    /*private Button mButton;*/
    private List<File> fileList = new ArrayList<>();
    private List<FileItem> fileItems = new ArrayList<FileItem>();
    private List<FileItem> fileItem2;
    private int psize = 20;//显示条数
    private int roSize = 0;//从roSize初始值到size的条数
    private int size = 20;//显示条数
    private int roUpSize = 0;//从roSize初始值到size的条数
    private int upSize = 0;//显示条数
    private Boolean endFlg = false;//true 为已经到最后一行了
    private Boolean upFlg = true;//true 为已经到第一页了
    private static final int LOAD_IMAGE = 1;
    private static final int LOAD_ERROR = 2;
    private int visibleLastIndex = 0; //最后的可视项索引
    private int visibleItemCount;  // 当前窗口可见项总数
    private int firstVisibleItem;
    private SharedPreferences mConfig;
    private Handler mHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            switch (msg.what) {
                case LOAD_IMAGE:
                    getimages();
                    break;
                case LOAD_ERROR:
                    Toast.makeText(MainActivity.this, "加载图片失败", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }
            return false;
        }
    });
 /*   private ImageView mImageView;
    private Button mButtonLooktu;*/
    private vewAdpater mVewAdpater;
    private Button mLoadMoreButton;
    private View mLoadMoreView;
    private View mUpMoreView;
    private Button mUpMoreButton;
    private SharedPreferences.Editor mEdit;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mLoadMoreView = getLayoutInflater().inflate(R.layout.load_more, null);
        mUpMoreView = getLayoutInflater().inflate(R.layout.up_more, null);
        //统一获取权限
        performCodeWithPermission("读写SD卡", new PermissionCallback() {
            @Override
            public void hasPermission() {
                intiView();//初始化视图
                Toast.makeText(MainActivity.this, "获取SD卡权限成功", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void noPermission() {

            }
        }, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE);

    }

    /**
     * 初始化视图
     */
    private void intiView() {
        //获取滚动view
        /*mScrollView = findViewById(R.id.scrollView);*/
        //获取listview
        mListView = findViewById(R.id.list_item);
        //获取按钮
       /* mButton = findViewById(R.id.button);
        mButton.setOnClickListener(this);
        mImageView = findViewById(R.id.image_view);
        mButtonLooktu = findViewById(R.id.button_looktu);
        mButtonLooktu.setOnClickListener(this);*/
        mLoadMoreButton = mLoadMoreView.findViewById(R.id.loadMoreButton);
        mUpMoreButton = mUpMoreView.findViewById(R.id.upMoreButton);
        mListView.addFooterView(mLoadMoreView); //设置列表底部视图
        mListView.addHeaderView(mUpMoreView);
        mListView.setOnScrollListener(this);
        mConfig = getSharedPreferences("config", MODE_PRIVATE);
        mEdit = mConfig.edit();//记录已经爬过数据不再进行爬取
       // mEdit.putInt("a0", -3);
        //mEdit.commit();
        System.out.println("a0-------------------- "+mConfig.getInt("a0",-3));
        //通过爬虫加载图片
        //getImageAddsWithURL();
        getimages();

    }

    /**
     * 读取内存中的
     */
    private void getimages() {
        String drectory = getDrectoryPath();//文件下载路径
        File file = new File(drectory);
        // File file = new File("/storage/sdcard0");
        if (file.exists() && file.length() > 0) {
            File[] files = file.listFiles();
            if (files != null && files.length > 0) {
                // 存在文件 遍历 判断
                for (File f : files) {
                    if (f.isFile()) {
                        String name = f.getName();
                        int i = name.lastIndexOf(".");
                        String substring = name.substring(i + 1, name.length());
                        if (substring != null && substring.length() > 0) {
                            if ("jpeg".equals(substring)
                                    || "png".equals(substring)
                                    || "jpg".equals(substring)) {


                                fileList.add(f);
                              //  System.out.print("文件: ");
                              //  System.out.println(f.getAbsolutePath());
                                // Message msg = Message.obtain();
                                // msg.what = LOAD_IMAGE;
                                // msg.obj = BitmapFactory.decodeFile(f.getAbsolutePath());
                                // msg.obj = fileList;
                                // mHandler.sendMessage(msg);
                            }

                        }

                    }

                }
                if(fileList != null && fileList.size()>0){
                    Collections.shuffle(fileList); // 随机排序
                    setFileItem();
                    getListViewWithSize(roSize, psize);
                }

            }
        }
       // System.out.println("fileItems.size()----------------------: " + fileItems.size());
    }

    /**
     * 分页展示图片数据
     */
    private void getListViewWithSize(int roSize1, int size1) {

        if (fileItems != null && fileItems.size() > size1) {
            roSize = roSize1+20;
            size = size1+20;//当滚动时条数用size
            setFileItem2(roSize1, size1);//封装图片
            roUpSize = roSize1;//从roSize初始值到size的条数
            upSize = size1;//显示条数
          //  System.out.println("===============1==============");
        } else if (fileItems != null && fileItems.size() < size1 && fileItems.size() > 0 && roSize1 == 0) {
            setFileItem2(roSize1, fileItems.size());//封装图片
            roUpSize = roSize1;//从roSize初始值到size的条数
            upSize = fileItems.size();//显示条数
          //  System.out.println("===============2==============");
        } else if (fileItems != null && fileItems.size() <= size1) {
            setFileItem2((roSize1 - 20), fileItems.size());//封装图片
            roUpSize = (roSize1 - 20);//从roSize初始值到size的条数
            upSize = fileItems.size();//显示条数
          //  System.out.println("===============3=====roSize1=========roSize1" + roSize1 + " size1 " + size1 + "fileItems.size():" + fileItems.size());
            endFlg = true;
        } else {
            setFileItem2(fileItems.size() - 20, fileItems.size());//封装图片
            roUpSize = (fileItems.size() - 20);//从roSize初始值到size的条数
            upSize = fileItems.size();//显示条数
            endFlg = true;
          //  System.out.println("===============4==============");
        }
        if (roSize1 >= 20) {

            upFlg = false;
        }
    }

    /**
     * p
     * 分页展示图片数据
     */
    private void getUpListViewWithSize() {

        if (fileItems != null && roUpSize == 0) {
            upFlg = true;
           // System.out.println("===============已经是第一页了==============");
        } else if (fileItems != null && roUpSize >= 20) {
            if (size == fileItems.size()) {
                setFileItem2((fileItems.size() - roUpSize), roUpSize);//封装图片
                upSize = roUpSize;
                roUpSize = (fileItems.size() - roUpSize);
            } else {
                setFileItem2((roUpSize - 20), roUpSize);//封装图片
                upSize = roUpSize;
                roUpSize = (roUpSize - 20);
            }
            roSize = roUpSize;
            size = upSize;

          //  System.out.println("===============2==============");
        } else if (fileItems != null && roUpSize < 20 && roUpSize > 0) {
            upFlg = true;
          //  System.out.println("===============已经是第一页了=====roSize1=========roSize1");
        }
        if (fileItems.size() >= 20) {
            endFlg = false;
        }
    }

    /**
     * 展示所有图片数据
     */
    private void listView() {
        mVewAdpater = new vewAdpater(fileItem2, this);
        mListView.setAdapter(mVewAdpater);//this getApplicationContext()
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                int i = mListView.indexOfChild(view);
                Toast.makeText(MainActivity.this, i + "aaaaaa", Toast.LENGTH_SHORT).show();
                if (fileItems != null && fileItems.size() > 0) {
                    float x = mListView.getX();
                    float y = mListView.getY();
                    float pivotX = mListView.getPivotX();
                    float scaleX = mListView.getScaleX();
                    float translationX = mListView.getTranslationX();
                    int scrollX = mListView.getScrollX();
              //      System.out.println("x:" + x + " y: " + y + " pivotX: " + pivotX + " scaleX: " + scaleX + " translationX:" + translationX + " scrollX:" + scrollX
              //      );
                    int id1 = mListView.getChildAt(position).getId();
               //     System.out.println("id1 " + id1);
                    //Toast.makeText(MainActivity.this, i , Toast.LENGTH_SHORT).show();
                }


            }
        });
    }

    /**
     * 获取图片数据连接
     */
    private void getImageAddsWithURL() {

        int a00 = mConfig.getInt("a0", -1);
        if (0 != a00){


        new Thread() {

            @Override
            public void run() {
                //娱乐女明星排行榜2018 性感美女 性感睡衣
                String drectory = getDrectoryPath();//文件下载路径
                Random random = new Random();
                int i = random.nextInt(18);
                //   System.out.println("----随机数i: " + i);
                int a0 = mConfig.getInt("a0", -1);
            //    System.out.println("----初始----a2 :" + a2 + " i: " + i);
                if (0 != a0 && i == 0) {
                    new BaiduImageCrawler().fetch("性感睡衣", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
              //      System.out.println("--------a0 :" + a0 + " i: " + i);
                }
                if (0 != a0 && i == 1) {
                    new BaiduImageCrawler().fetch("性感美女", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
               //     System.out.println("--------a1 :" + a1 + " i: " + i);
                }
                if (0 != a0 && i == 2) {
                    new BaiduImageCrawler().fetch("美女", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
               //     System.out.println("--------a2 :" + a2 + " i: " + i);
                }
                if (0 != a0 && i == 3) {
                    new BaiduImageCrawler().fetch("娱乐女明星排行榜2018", drectory);//爬取图片
                   // mEdit.putInt("a0", 0);
                    //mEdit.commit();
                //    System.out.println("--------a3 :" + a3 + " i: " + i);
                }
                if (0 != a0&& i == 5) {
                    new BaiduImageCrawler().fetch("贾静雯古装", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 6) {
                    new BaiduImageCrawler().fetch("美女游泳", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 7) {
                    new BaiduImageCrawler().fetch("古装美女", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 8) {
                    new BaiduImageCrawler().fetch("睡衣美女", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 9) {
                    new BaiduImageCrawler().fetch("睡衣美女 真丝", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 10) {
                    new BaiduImageCrawler().fetch("睡衣美女 真丝 睡袍 ", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 11) {
                    new BaiduImageCrawler().fetch("睡衣美女 真丝 少女", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 12) {
                    new BaiduImageCrawler().fetch("睡衣美女好看", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 13) {
                    new BaiduImageCrawler().fetch("睡衣美女 冰丝", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 14) {
                    new BaiduImageCrawler().fetch("睡衣美女 睡袍", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                   // mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 15) {
                    new BaiduImageCrawler().fetch("睡衣美女 真丝 吊带 少女", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 16) {
                    new BaiduImageCrawler().fetch("睡衣美女 真丝 丝绸", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 17) {
                    new BaiduImageCrawler().fetch("睡衣美女 真丝 高档", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0){
                    mEdit.putInt("a0", 0);
                    mEdit.commit();
                    Message msg = Message.obtain();
                    msg.what = LOAD_IMAGE;
                    mHandler.sendMessage(msg);
                }

            }

        }.start();
        }else{
            Toast.makeText(this, "不要贪心哦!首次打开APP时可有效加载一次!", Toast.LENGTH_SHORT).show();
        }
    }

    //获取文件下载或读取路径
    private String getDrectoryPath() {
        String drectory = "";//文件下载路径
        File dataDirectory = Environment.getDataDirectory();//内存
        File sdfile = Environment.getExternalStorageDirectory();//sd卡
        //判断sd卡是否挂载
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            //Toast.makeText(this, "sd卡已经挂载", Toast.LENGTH_SHORT).show();

            drectory = sdfile.getAbsolutePath();//sd卡路径
            long freeSpace = sdfile.getFreeSpace();//获取sd储存空间
            if (freeSpace < 5 * 1024 * 1024) {
                drectory = dataDirectory.getAbsolutePath();//SD卡空间不足时获取内存路径
                long freeSpace1 = dataDirectory.getFreeSpace();//获取内存储存空间
                if (freeSpace1 < 5 * 1024 * 1024) {
                    Toast.makeText(this, "内存空间不足!", Toast.LENGTH_SHORT).show();
                    return "";
                }
            }

            // File file = new File(sdfile, System.currentTimeMillis() + "hlw.3gp");
                            /*FileOutputStream fileOutputStream = new FileOutputStream(file);
                            byte[] bytes = new byte[1024];
                            for (int i = 0; i < 5 * 1024; i++) {
                                fileOutputStream.write(bytes);
                            }
                            fileOutputStream.close();*/

        } else {
            drectory = dataDirectory.getAbsolutePath();//获取内存路径
            long freeSpace = dataDirectory.getFreeSpace();//获取内存储存空间
            if (freeSpace < 5 * 1024 * 1024) {
                Toast.makeText(this, "内存空间不足!", Toast.LENGTH_SHORT).show();
                return "";
            }
        }

        return drectory;
    }

 /*   @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                //通过爬虫加载图片
                //getImageAddsWithURL();

                break;
            case R.id.button_looktu://游览单张图片

                *//*String drectory = getDrectoryPath();//文件下载路径
                File file = new File(drectory);
                // File file = new File("/storage/sdcard0");
                if (file.exists() && file.length() > 0) {
                    File[] files = file.listFiles();
                    if (files != null && files.length > 0) {
                        // 存在文件 遍历 判断
                        for (File f : files) {
                            if (f.isFile()) {
                                String name = f.getName();
                                int i = name.lastIndexOf(".");
                                String substring = name.substring(i + 1, name.length());
                                if (substring != null && substring.length() > 0) {
                                    if ("jpeg".equals(substring)
                                            || "png".equals(substring)
                                            || "gif".equals(substring)
                                            || "jpg".equals(substring)) {


                                        fileList.add(f);
                                        System.out.print("文件: ");
                                        System.out.println(f.getAbsolutePath());
                                       // Message msg = Message.obtain();
                                       // msg.what = LOAD_IMAGE;
                                        // msg.obj = BitmapFactory.decodeFile(f.getAbsolutePath());
                                       // msg.obj = fileList;
                                       // mHandler.sendMessage(msg);
                                    }

                                }

                            }

                        }
                        setFileItem();//封装图片
                    }
                }
                System.out.println("fileItems.size()----------------------: "+fileItems.size());
                listView();*//*
                break;

            default:
                break;
        }
    }*/

    //每滚动一次显示条数
    private void setFileItem2(int roSize1, int size) {
        fileItem2 = new ArrayList<FileItem>();
        if (fileItems != null && fileItems.size() > 0) {
            for (int i = (roSize1 == 0 ? roSize1 : (roSize1 - 1)); i < size; i++) {
                fileItem2.add(fileItems.get(i));
            }
        }
        listView();
    }

    private void setFileItem() {
        int width = getWindowManager().getDefaultDisplay().getWidth();//获取屏幕的宽度
        int i2 = (width - 3) / 3;
        if (fileList != null && fileList.size() > 0) {
            FileItem fileItem = null;
            for (int i = 0; i < fileList.size(); i++) {
                int i1 = i % 3;
                if (i1 == 0) {
                    fileItem = new FileItem();
                    if (fileItem != null) {
                        //压缩图片
                        BitmapFactory.Options options = new BitmapFactory.Options();//解析位图的附加条件
                        options.inJustDecodeBounds = true;//inJustDecodeBounds设为true,不去解析真实的位图,读取头文件获取基本信息
                        options.inSampleSize = 8;
                        options.inJustDecodeBounds = false;
                        Bitmap bitmap = BitmapFactory.decodeFile(fileList.get(i).getAbsolutePath(), options);
                        fileItem.setBitmap1(bitmap);
                        fileItem.setFile1(fileList.get(i));

                    }
                } else if (i1 == 1) {
                    if (fileItem != null) {
                        BitmapFactory.Options options = new BitmapFactory.Options();//解析位图的附加条件
                        options.inJustDecodeBounds = true;//inJustDecodeBounds设为true,不去解析真实的位图,读取头文件获取基本信息
                        options.inSampleSize = 8;
                        options.inJustDecodeBounds = false;
                        Bitmap bitmap = BitmapFactory.decodeFile(fileList.get(i).getAbsolutePath(), options);
                        fileItem.setBitmap2(bitmap); //压缩图片
                        fileItem.setFile2(fileList.get(i));
                    }
                } else if (i1 == 2) {
                    if (fileItem != null) {
                        BitmapFactory.Options options = new BitmapFactory.Options();//解析位图的附加条件
                        options.inJustDecodeBounds = true;//inJustDecodeBounds设为true,不去解析真实的位图,读取头文件获取基本信息
                        options.inSampleSize = 8;
                        options.inJustDecodeBounds = false;
                        Bitmap bitmap = BitmapFactory.decodeFile(fileList.get(i).getAbsolutePath(), options);
                        fileItem.setBitmap3(bitmap);
                        fileItem.setFile3(fileList.get(i));
                    }
                    fileItems.add(fileItem);
                }
                if ((i == (fileList.size() - 1)) && (i1 != 2)) {
                    fileItems.add(fileItem);
                }

            }
        }
    }

    /**
     * 滑动时被调用
     */
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        this.visibleItemCount = visibleItemCount;//当前窗口的可见数量
        this.firstVisibleItem = firstVisibleItem;
        visibleLastIndex = firstVisibleItem + visibleItemCount - 1;
    }

    /**
     * 滑动状态改变时被调用
     */
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        int itemsLastIndex = mVewAdpater.getCount() - 1; //数据集最后一项的索引
        int lastIndex = itemsLastIndex;    //加上底部的loadMoreView项
        if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && visibleLastIndex == lastIndex) {
            //如果是自动加载,可以在这里放置异步加载数据的代码
           /* if(endFlg){
                Toast.makeText(this,"已经到最后一页了!", Toast.LENGTH_SHORT).show();
            }else{
                getListViewWithSize(roSize , size); 
            }
            
            Log.i("LOADMORE", "loading...");*/
        } else if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && firstVisibleItem == 0) {
            // Toast.makeText(this,"上翻!", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 点击按钮事件
     *
     * @param view
     */
    public void loadMore(View view) {
        mLoadMoreButton.setText("loading..."); //设置按钮文字loading
        /*handler.postDelayed(new Runnable() {
            @Override
            public void run() {
*/

        // mVewAdpater.notifyDataSetChanged(); //数据集变化后,通知adapter
        mListView.setSelection(visibleLastIndex - visibleItemCount + 1); //设置选中项
        loadData();
        mLoadMoreButton.setText("load more"); //恢复按钮文字
       /*     }
        }, 2000);*/
    }

    /**
     * 加载下一页数据
     */
    private void loadData() {
        if (endFlg) {
            Toast.makeText(this, "已经到最后一页了!", Toast.LENGTH_SHORT).show();
        } else {
            getListViewWithSize(roSize, size);
        }

    }

    /**
     * 返回上一页数据
     *
     * @param view
     */
    public void upMore(View view) {
        if (upFlg) {
            Toast.makeText(this, "已经到第一页了!", Toast.LENGTH_SHORT).show();
        } else {
            getUpListViewWithSize();
        }

    }

    public void tupian(View view) {
        //通过爬虫加载图片
        getImageAddsWithURL();
    }
}

D:\lookImgePeriS\app\src\main\java\com\glsite\lookimgeperis\ui\BaseActivity.java

package com.glsite.lookimgeperis.ui;

import android.app.Activity;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialog;
import android.widget.Toast;

/**
 * @author Admin
 * @version $Rev$
 * @des ${TODO}
 * @updateAuthor $Author$
 * @updateDes ${TODO}
 */
public class BaseActivity extends Activity {
    //**************** Android M Permission (Android 6.0权限控制代码封装)
    private int permissionRequestCode = 88;
    private PermissionCallback permissionRunnable;

    public interface PermissionCallback {
        void hasPermission();

        void noPermission();
    }

    /**
     * Android M运行时权限请求封装
     *
     * @param permissionDes 权限描述
     * @param runnable      请求权限回调
     * @param permissions   请求的权限(数组类型),直接从Manifest中读取相应的值,比如Manifest.permission.WRITE_CONTACTS
     */
    public void performCodeWithPermission(@NonNull String permissionDes, PermissionCallback runnable, @NonNull String... permissions) {
        if (permissions == null || permissions.length == 0)
            return;
        //        this.permissionrequestCode = requestCode;
        this.permissionRunnable = runnable;
        if ((Build.VERSION.SDK_INT < Build.VERSION_CODES.M) || checkPermissionGranted(permissions)) {
            if (permissionRunnable != null) {
                permissionRunnable.hasPermission();
                permissionRunnable = null;
            }
        } else {
            //permission has not been granted.
            requestPermission(permissionDes, permissionRequestCode, permissions);
        }

    }

    private boolean checkPermissionGranted(String[] permissions) {
        boolean flag = true;
        for (String p : permissions) {
            if (ActivityCompat.checkSelfPermission(this, p) != PackageManager.PERMISSION_GRANTED) {
                flag = false;
                break;
            }
        }
        return flag;
    }

    private void requestPermission(String permissionDes, final int requestCode, final String[] permissions) {
        if (shouldShowRequestPermissionRationale(permissions)) {
            /*1. 第一次请求权限时,用户拒绝了,下一次:shouldShowRequestPermissionRationale()  返回 true,应该显示一些为什么需要这个权限的说明
            2.第二次请求权限时,用户拒绝了,并选择了“不在提醒”的选项时:shouldShowRequestPermissionRationale()  返回 false
            3. 设备的策略禁止当前应用获取这个权限的授权:shouldShowRequestPermissionRationale()  返回 false*/
            // Provide an additional rationale to the user if the permission was not granted
            // and the user would benefit from additional context for the use of the permission.
            // For example, if the request has been denied previously.

            //            Snackbar.make(getWindow().getDecorView(), requestName,
            //                    Snackbar.LENGTH_INDEFINITE)
            //                    .setAction(R.string.common_ok, new View.OnClickListener() {
            //                        @Override
            //                        public void onClick(View view) {
            //                            ActivityCompat.requestPermissions(BaseAppCompatActivity.this,
            //                                    permissions,
            //                                    requestCode);
            //                        }
            //                    })
            //                    .show();
            //如果用户之前拒绝过此权限,再提示一次准备授权相关权限
            new AlertDialog.Builder(this)
                    .setTitle("提示")
                    .setMessage(permissionDes)
                    .setPositiveButton("授权", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode);
                        }
                    }).show();

        } else {
            // Contact permissions have not been granted yet. Request them directly.
            ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode);
        }
    }

    private boolean shouldShowRequestPermissionRationale(String[] permissions) {
        boolean flag = false;
        for (String p : permissions) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, p)) {
                flag = true;
                break;
            }
        }
        return flag;
    }

    /**
     * Callback received when a permissions request has been completed.
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        if (requestCode == permissionRequestCode) {
            if (verifyPermissions(grantResults)) {
                if (permissionRunnable != null) {
                    permissionRunnable.hasPermission();
                    permissionRunnable = null;
                }
            } else {
                Toast.makeText(this, "暂无权限执行相关操作!", Toast.LENGTH_SHORT).show();
                if (permissionRunnable != null) {
                    permissionRunnable.noPermission();
                    permissionRunnable = null;
                }
            }
        } else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }

    }

    public boolean verifyPermissions(int[] grantResults) {
        // At least one result must be checked.
        if (grantResults.length < 1) {
            return false;
        }

        // Verify that each required permission has been granted, otherwise return false.
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }
    //********************** END Android M Permission ****************************************
}

D:\lookImgePeriS\app\src\main\java\com\glsite\lookimgeperis\ui\SplashActivity.java

package com.glsite.lookimgeperis.ui;


import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.Window;
import android.view.WindowManager;


import com.glsite.lookimgeperis.R;
public class SplashActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//去除时间与状态栏
        requestWindowFeature(Window.FEATURE_NO_TITLE);//去除标题;注意把BaseActivity继承的AppCompatActivity类改成继承Activity类;因为AppCompatActivity与Activity类使用的风格不同
        setContentView(R.layout.splash_sceen);
        //按时间跳转页面
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                startActivity(new Intent(SplashActivity.this,MainActivity.class));
            }
        },3000);//第二个参数是时间
    }
}

D:\lookImgePeriS\app\src\main\res\layout\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"
    android:orientation="vertical"
    tools:context=".ui.MainActivity">

        <ListView
            android:id="@+id/list_item"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:cacheColorHint="#00000000"
            android:divider="#d4d4d4"
            android:dividerHeight="1dp"
            android:drawSelectorOnTop="false"
            android:fadingEdge="vertical"
            android:isScrollContainer="true"
            />
  

</LinearLayout>

D:\lookImgePeriS\app\src\main\res\layout\image.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginBottom="8dp"
        android:scaleType="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@mipmap/ic_launcher" />



</android.support.constraint.ConstraintLayout>

D:\lookImgePeriS\app\src\main\res\layout\load_more.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/loadMoreButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="load more"
        android:onClick="loadMore"/>
</LinearLayout>

D:\lookImgePeriS\app\src\main\res\layout\pop_item.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"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:layout_weight="1"
    >
    <ImageView
        android:id="@+id/image1"
        android:layout_width="0dp"
        android:layout_height="240dp"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"

        android:layout_weight="1"

        />
    <ImageView
        android:id="@+id/image2"
        android:layout_width="0dp"
        android:layout_height="240dp"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"

        android:layout_weight="1"

        />
    <ImageView
        android:id="@+id/image3"
        android:layout_width="0dp"
        android:layout_height="240dp"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"

        android:layout_weight="1"
        />

</LinearLayout>

</LinearLayout>

D:\lookImgePeriS\app\src\main\res\layout\splash_sceen.xml

<?xml version="1.0" encoding="utf-8"?>
<ImageView 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=".ui.SplashActivity"
    android:src="@drawable/login"
    android:scaleType="fitXY"
    >

</ImageView>

D:\lookImgePeriS\app\src\main\res\layout\up_more.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/upMoreButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="up more"
        android:onClick="upMore"/>
</LinearLayout>

D:\lookImgePeriS\app\src\main\AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.glsite.lookimgeperis">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:networkSecurityConfig="@xml/network_security_config"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".ui.ImageActivity"></activity>
        <activity android:name=".ui.SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ui.MainActivity" />
    </application>

</manifest>

D:\lookImgePeriS\app\src\main\res\xml\network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

 

项目中使用的爬虫:

main\java\com\glsite\utils\pachong1\BaiduImageCrawler.java

package com.glsite.utils.pachong1;

import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class BaiduImageCrawler extends ImageCrawler {
	
	//tn:resultjsonavatarnew
	//ie:utf-8 字符编码(ie输入 oe输出)
	//word:美女 搜索关键字
	//pn:60 开始条数
	//rn:30 显示数量
	//z:0 尺寸(0全部尺寸 9特大 3大 2中 1小)
	//width:1024 自定义尺寸-宽
	//height:768 自定义尺寸-高
	//ic:0 颜色(0全部颜色 1红色 2黄色 4绿色 8青色 16蓝色 32紫色 64粉色 128棕色 256橙色 512黑色 1024白色 2048黑白)
	//s:0 3头像图片
	//face:0 1面部特写
	//st:-1 -1全部类型 1卡通画 2简笔画
	//lm:-1 (6动态图片 7静态图片)
	//gsm:3c pn值的十六进制数
	private static final String BAIDU_IMAGE_SEARCH_URL = "http://image.baidu.com/search/avatarjson?tn=resultjsonavatarnew&ie=utf-8&word=%s&pn=%d&rn=%d&z=3&ic=0&s=0&face=0&st=-1&lm=-1&gsm=%s";
	private static final int PAGE_SIZE = 60;
	private static final String IMAGE_URL_REG = "\"objURL\":\"(https?://[^\"]+)\"";
	private static final Pattern IMAGE_PATTERN = Pattern.compile(IMAGE_URL_REG);
	
	@Override
	public String getSearchUrl(String keyword, int page) {
		int begin = page * PAGE_SIZE;
		return String.format(BAIDU_IMAGE_SEARCH_URL, keyword, begin, PAGE_SIZE, Integer.toHexString(begin));
	}

	@Override
	public int parseImageUrl(ConcurrentLinkedQueue<String> queue, StringBuffer data) {
		int count = 0;
		Matcher matcher = IMAGE_PATTERN.matcher(data);
		while (matcher.find()) {
			queue.offer(matcher.group(1));
			count++;
		}
		return count;
	}

}

D:\lookImgePeriS\app\src\main\java\com\glsite\utils\pachong1\BingImageCrawler.java

package com.glsite.utils.pachong1;

import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class BingImageCrawler extends ImageCrawler {

	//async=content
	//q=美女 搜索关键字
	//first=118 开始条数
	//count=35 显示数量
	private static final String BING_IMAGE_SEARCH_URL = "http://www.bing.com/images/async?async=content&q=%s&first=%d&count=%d";
	private static final int PAGE_SIZE = 35;
	private static final String IMAGE_URL_REG = "imgurl:&quot;(https?://[^,]+)&quot;";
	private static final Pattern IMAGE_PATTERN = Pattern.compile(IMAGE_URL_REG);
	
	@Override
	public String getSearchUrl(String keyword, int page) {
		int begin = page * PAGE_SIZE;
		return String.format(BING_IMAGE_SEARCH_URL, keyword, begin, PAGE_SIZE);
	}

	@Override
	public int parseImageUrl(ConcurrentLinkedQueue<String> queue, StringBuffer data) {
		int count = 0;
		Matcher matcher = IMAGE_PATTERN.matcher(data);
		while (matcher.find()) {
			queue.offer(matcher.group(1));
			count++;
		}
		return count;
	}

}

D:\lookImgePeriS\app\src\main\java\com\glsite\utils\pachong1\GoogleImageCrawler.java

package com.glsite.utils.pachong1;

import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GoogleImageCrawler extends ImageCrawler {
	
	//tbm=isch
	//q=美女 搜索关键字
	//ijn=0 页码(***Google只提供到0到8页数据!)
	//start=0 开始条数
	//tbs=isz:l 搜索条件
	//	尺寸
	//	tbs=isz:l 大
	//	tbs=isz:m 中
	//	颜色
	//	tbs=ic:color 彩色
	//	tbs=ic:gray 黑白
	//	tbs=ic:trans 透明
	//	类型
	//	tbs=itp:face 脸部特写
	//	tbs=itp:photo 照片
	//	tbs=itp:clipart 剪贴画
	//	tbs=itp:lineart 素描画
	//	tbs=itp:animated 动画
	//	条件组合
	//	tbs=isz:l,ic:color,itp:face
	private static final String GOOGLE_IMAGE_SEARCH_URL = "https://www.google.com/search?tbm=isch&q=%s&ijn=%d&start=%d&tbs=isz:l";
	private static final int PAGE_SIZE = 100;
	private static final String IMAGE_URL_REG = "\"ou\":\"(https?://[^\"]+)\"";
	private static final Pattern IMAGE_PATTERN = Pattern.compile(IMAGE_URL_REG);
	
	@Override
	public String getSearchUrl(String keyword, int page) {
		int begin = page * PAGE_SIZE;
		return String.format(GOOGLE_IMAGE_SEARCH_URL, keyword, page, begin);
	}

	@Override
	public int parseImageUrl(ConcurrentLinkedQueue<String> queue, StringBuffer data) {
		int count = 0;
		Matcher matcher = IMAGE_PATTERN.matcher(data);
		while (matcher.find()) {
			queue.offer(matcher.group(1));
			count++;
		}
		return count;
	}
}

D:\lookImgePeriS\app\src\main\java\com\glsite\utils\pachong1\ImageCrawler.java

package com.glsite.utils.pachong1;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.concurrent.ConcurrentLinkedQueue;

public abstract class ImageCrawler {

	private static final int CONN_TIME_OUT = 5 * 1000;
	private static final String USER_AGENT = "User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36";
	private static final int DEFAULT_MAX_THREAD = 100;
	private static final String THREAD_NAME_STRING = "%1$-15s";
	private static final String DEFAULT_ENCODE = "UTF-8";

	public ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();

	public void fetch(String keyword, String basePath) {
		fetch(keyword, basePath, DEFAULT_MAX_THREAD);
	}
	
	public void fetch(String keyword, String basePath, int maxThread) {
		
		String type = this.getClass().getSimpleName().replaceAll("ImageCrawler", "");
		
		new File(basePath + "\\md5\\").mkdirs();
		new File(basePath + "\\duplicate\\").mkdirs();
		File saveDir = new File(basePath);
		
		startThread(saveDir, maxThread, type,basePath);

		int page = 0;
		while (true) {
			try {
				String url = getSearchUrl(URLEncoder.encode(keyword, DEFAULT_ENCODE), page);

				System.out.println(type + " Crawler will start. URL:" + url);
				StringBuffer data = getPage(url);
	            int count = parseImageUrl(queue, data);
				System.out.println(type + " Crawler Completed (" + count + " images found). URL:" + url);
				
				if (count == 0) {
					break;
				}
				
				page++;
				if (!queue.isEmpty()) {
					Thread.sleep(1000);
				}
			} catch (Exception e) {
				System.err.println(type + " Crawler Failed. Error:" + e.getMessage());
				page++;
			}
		}

	}

	private StringBuffer getPage(String url) throws Exception {
		URL uri = new URL(url);
		URLConnection con = uri.openConnection();
		con.setConnectTimeout(CONN_TIME_OUT);
		con.setRequestProperty("User-Agent", USER_AGENT);
		InputStream is = con.getInputStream();
		BufferedReader in = new BufferedReader(new InputStreamReader(is, DEFAULT_ENCODE));  
		String line;
		StringBuffer data = new StringBuffer();
		while ((line = in.readLine()) != null) {  
			data.append(line);
			System.out.println("line: "+line);
		}  
		in.close();
		System.out.println("data: "+data);
		return data;
	}

	private void startThread(File saveDir, int maxThread, String type,String basePath) {//保存本地
		int threadNum = 0;
		while (threadNum < maxThread) {
			Thread t = new Thread(new ImageWorker(queue, saveDir,basePath));//保存本地
			t.setName(String.format(THREAD_NAME_STRING, type + "Thread-" + threadNum));
			t.start();
			threadNum++;
		}
	}
	
	public abstract String getSearchUrl(String keyword, int begin);
	public abstract int parseImageUrl(ConcurrentLinkedQueue<String> queue, StringBuffer data);
}

D:\lookImgePeriS\app\src\main\java\com\glsite\utils\pachong1\ImageDownloader.java

package com.glsite.utils.pachong1;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.UUID;

public class ImageDownloader {

	private static final int CONN_TIME_OUT = 5 * 1000;
	private static final String USER_AGENT = "User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36";
	
	private String url;
	private File saveDir;

	public ImageDownloader(String url, File saveDir) {
		this.url = url;
		this.saveDir = saveDir;
	}

	public void download() {
		try {
			URL url = new URL(this.url);
			URLConnection con = url.openConnection();
			con.setConnectTimeout(CONN_TIME_OUT);
			con.setRequestProperty("User-Agent", USER_AGENT);
			InputStream is = con.getInputStream();
			String fileName = getSaveFileName(con.getContentType());
			System.out.println("fileName: "+fileName);
			System.out.println("saveDir.getPath(): "+saveDir.getPath());
			System.out.println("saveDir.getPath() + fileName + .ren: "+saveDir.getPath() + "\\" + fileName + ".ren");

			//



			//File outputTmpFile = new File(saveDir.getPath() + "\\" + fileName + ".ren");
			File outputTmpFile = new File(saveDir.getPath() , fileName );
			byte[] bs = new byte[1024];
			int len;
			OutputStream os = new FileOutputStream(outputTmpFile);
			while ((len = is.read(bs)) != -1) {
				os.write(bs, 0, len);
			}
			os.close();
			is.close();

			if (outputTmpFile.length() == 0) {
				outputTmpFile.delete();
				System.out.println(Thread.currentThread().getName() + " - Empty Image Found. Name:" + fileName);
				return;
			}
			
			String md5 = MD5Checksum.md5Hex(outputTmpFile);
			File md5File = new File(saveDir.getPath() + "\\md5\\" + md5);
			if (md5File.exists()) {
				File dFile = new File(saveDir.getPath() + "\\duplicate\\" + fileName);
				outputTmpFile.renameTo(dFile);
				System.out.println(Thread.currentThread().getName() + " - Duplicate Image Found. Name:" + fileName);
				return;
			}

			File oFile = new File(saveDir.getPath() + "\\" + fileName);
			outputTmpFile.renameTo(oFile);
			md5File.createNewFile();
			
			System.out.println(Thread.currentThread().getName() + " - Download Finished. URL:" + this.url);
		} catch (Exception e) {
			System.err.println(Thread.currentThread().getName() + " - Download Failed. Error:" + e.getMessage());
		}
	}

	private String getSaveFileName(String contentType) {
		contentType = contentType.toLowerCase(); 
		String uuid = UUID.randomUUID().toString();
		if ("image/jpeg".equals(contentType)) {
			return uuid + ".jpg";
		} else if ("image/png".equals(contentType)) {
			return uuid + ".png";
		} else if ("image/gif".equals(contentType)) {
			return uuid + ".gif";
		} else {
			return uuid + ".jpg";
		}
	}
	
}

D:\lookImgePeriS\app\src\main\java\com\glsite\utils\pachong1\ImageWorker.java

package com.glsite.utils.pachong1;

import android.os.Environment;
import android.widget.Toast;

import java.io.File;
import java.util.concurrent.ConcurrentLinkedQueue;

public class ImageWorker implements Runnable {

	private ConcurrentLinkedQueue<String> queue;
	private File saveDir;
	private String basePath;

	public ImageWorker(ConcurrentLinkedQueue<String> queue, File saveDir,String basePath) {
		this.queue = queue;
		this.saveDir = saveDir;
		this.basePath = basePath;
	}

	public void run() {
		while (true) {
			String url = queue.poll();
			while (url == null) {
				try {
					Thread.sleep(1000);
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					url = queue.poll();
				}
			}
			if(freeSpace()){
                break;
            }
            new ImageDownloader(url, this.saveDir).download();
		}
	}

	//获取文件下载或读取路径
	private Boolean freeSpace() {
		File sdfile = Environment.getExternalStorageDirectory();//sd卡
		File ndfile = Environment.getDataDirectory();//内存
		String sdrectory = sdfile.getAbsolutePath();//sd卡路径
		String ndrectory = ndfile.getAbsolutePath();//获取内存路径

		//判断sd卡是否挂载
		if (basePath !=null && basePath.equals(sdrectory)) {
			long freeSpace = sdfile.getFreeSpace();//获取sd储存空间
            System.out.println("-------储存卡容量: "+freeSpace+"  -----sd储存路径sdrectory: "+sdrectory);
			if (freeSpace < 5 * 1024 * 1024) {
				return true;
			}

		} else  if(basePath !=null && basePath.equals(ndrectory)){
			long freeSpace = ndfile.getFreeSpace();//获取内存储存空间
            System.out.println("-------内存容量: "+freeSpace+"  -----内存路径ndrectory: "+ndrectory);
			if (freeSpace < 5 * 1024 * 1024) {
				return true;
			}
		}

		return false;
	}
}

D:\lookImgePeriS\app\src\main\java\com\glsite\utils\pachong1\MD5Checksum.java

package com.glsite.utils.pachong1;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

// commons-codec  DigestUtils.java
public class MD5Checksum {
	private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

	private static char[] encodeHex(byte[] data, char[] toDigits) {
		int l = data.length;
		char[] out = new char[l << 1];

		int i = 0;
		for (int j = 0; i < l; i++) {
			out[(j++)] = toDigits[((0xF0 & data[i]) >>> 4)];
			out[(j++)] = toDigits[(0xF & data[i])];
		}
		return out;
	}

	private static String encodeHexString(byte[] data) {
		return new String(encodeHex(data, DIGITS_LOWER));
	}

	private static MessageDigest updateDigest(MessageDigest digest, InputStream data) throws IOException {
		byte[] buffer = new byte[1024];
		int read = data.read(buffer, 0, 1024);
		while (read > -1) {
			digest.update(buffer, 0, read);
			read = data.read(buffer, 0, 1024);
		}
		return digest;
	}

	private static byte[] digest(MessageDigest digest, InputStream data) throws IOException {
		return updateDigest(digest, data).digest();
	}

	private static MessageDigest getDigest(String algorithm) {
		try {
			return MessageDigest.getInstance(algorithm);
		} catch (NoSuchAlgorithmException e) {
			throw new IllegalArgumentException(e);
		}
	}

	private static MessageDigest getMd5Digest() {
		return getDigest("MD5");
	}

	private static byte[] md5(InputStream data) throws IOException {
		return digest(getMd5Digest(), data);
	}

	private static String md5Hex(InputStream data) throws IOException {
		return encodeHexString(md5(data));
	}

	public static String md5Hex(File file) throws IOException {
		String result = "";
		FileInputStream fs = null;
		try {
			fs = new FileInputStream(file);
			result = md5Hex(fs);
		} finally {
			if (fs != null) {
				fs.close();
			}
		}
		return result;
	}
}

D:\lookImgePeriS\app\src\main\java\com\glsite\utils\pachong1\Startup.java

package com.glsite.utils.pachong1;

public class Startup {

	public static void main(String[] args) {
		//new BaiduImageCrawler().fetch("美女", "D:\\data\\baidu\\");
		new BingImageCrawler().fetch("美女", "D:\\data\\bing\\");
		//new GoogleImageCrawler().fetch("美女", "D:\\data\\google\\");
	}

}

==============================================================================================

MainActivity.java  项目中用的这个方法调用爬虫获取图片:

 /**
     * 获取图片数据连接
     */
    private void getImageAddsWithURL() {

        int a00 = mConfig.getInt("a0", -1);
        if (0 != a00){


        new Thread() {

            @Override
            public void run() {
                //娱乐女明星排行榜2018 性感美女 性感睡衣
                String drectory = getDrectoryPath();//文件下载路径
                Random random = new Random();
                int i = random.nextInt(18);
                //   System.out.println("----随机数i: " + i);
                int a0 = mConfig.getInt("a0", -1);
            //    System.out.println("----初始----a2 :" + a2 + " i: " + i);
                if (0 != a0 && i == 0) {
                    new BaiduImageCrawler().fetch("性感睡衣", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
              //      System.out.println("--------a0 :" + a0 + " i: " + i);
                }
                if (0 != a0 && i == 1) {
                    new BaiduImageCrawler().fetch("性感美女", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
               //     System.out.println("--------a1 :" + a1 + " i: " + i);
                }
                if (0 != a0 && i == 2) {
                    new BaiduImageCrawler().fetch("美女", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
               //     System.out.println("--------a2 :" + a2 + " i: " + i);
                }
                if (0 != a0 && i == 3) {
                    new BaiduImageCrawler().fetch("娱乐女明星排行榜2018", drectory);//爬取图片
                   // mEdit.putInt("a0", 0);
                    //mEdit.commit();
                //    System.out.println("--------a3 :" + a3 + " i: " + i);
                }
                if (0 != a0&& i == 5) {
                    new BaiduImageCrawler().fetch("贾静雯古装", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 6) {
                    new BaiduImageCrawler().fetch("美女游泳", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 7) {
                    new BaiduImageCrawler().fetch("古装美女", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 8) {
                    new BaiduImageCrawler().fetch("睡衣美女", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 9) {
                    new BaiduImageCrawler().fetch("睡衣美女 真丝", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 10) {
                    new BaiduImageCrawler().fetch("睡衣美女 真丝 睡袍 ", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 11) {
                    new BaiduImageCrawler().fetch("睡衣美女 真丝 少女", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 12) {
                    new BaiduImageCrawler().fetch("睡衣美女好看", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 13) {
                    new BaiduImageCrawler().fetch("睡衣美女 冰丝", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 14) {
                    new BaiduImageCrawler().fetch("睡衣美女 睡袍", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                   // mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 15) {
                    new BaiduImageCrawler().fetch("睡衣美女 真丝 吊带 少女", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 16) {
                    new BaiduImageCrawler().fetch("睡衣美女 真丝 丝绸", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0 && i == 17) {
                    new BaiduImageCrawler().fetch("睡衣美女 真丝 高档", drectory);//爬取图片
                    //mEdit.putInt("a0", 0);
                    //mEdit.commit();
                    //    System.out.println("--------a4 :" + a4 + " i: " + i);
                }
                if (0 != a0){
                    mEdit.putInt("a0", 0);
                    mEdit.commit();
                    Message msg = Message.obtain();
                    msg.what = LOAD_IMAGE;
                    mHandler.sendMessage(msg);
                }

            }

        }.start();
        }else{
            Toast.makeText(this, "不要贪心哦!首次打开APP时可有效加载一次!", Toast.LENGTH_SHORT).show();
        }
    }

图片压缩:

BitmapFactory.Options options = new BitmapFactory.Options();//解析位图的附加条件
options.inJustDecodeBounds = true;//inJustDecodeBounds设为true,不去解析真实的位图,读取头文件获取基本信息
options.inSampleSize = 8;
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(fileList.get(i).getAbsolutePath(), options);

 

ListView单张图片查看

主要是在BaseAdapter类中的getView()方法中用了ImageView点击事件获取图片数据,后通过弹出框 AlertDialog进行展示;

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_无往而不胜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值