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() {@Overridepublic 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;@Overrideprotected 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() {@Overridepublic void hasPermission() {intiView();//初始化视图Toast.makeText(MainActivity.this, "获取SD卡权限成功", Toast.LENGTH_SHORT).show();}@Overridepublic void noPermission() {}}, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE);}/*** 初始化视图*/private void intiView() {//获取滚动view/*mScrollView = findViewById(R.id.scrollView);*///获取listviewmListView = 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;//当滚动时条数用sizesetFileItem2(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() {@Overridepublic 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() {@Overridepublic 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;}/*   @Overridepublic 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);}}}}/*** 滑动时被调用*/@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {this.visibleItemCount = visibleItemCount;//当前窗口的可见数量this.firstVisibleItem = firstVisibleItem;visibleLastIndex = firstVisibleItem + visibleItemCount - 1;}/*** 滑动状态改变时被调用*/@Overridepublic 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() {@Overridepublic void run() {
*/// mVewAdpater.notifyDataSetChanged(); //数据集变化后,通知adaptermListView.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()  返回 false3. 设备的策略禁止当前应用获取这个权限的授权: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() {@Overridepublic 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.*/@Overridepublic 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 {@Overrideprotected 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() {@Overridepublic 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"><ListViewandroid: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.ConstraintLayoutxmlns: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"><ImageViewandroid: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"><Buttonandroid: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"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"android:layout_weight="1"><ImageViewandroid:id="@+id/image1"android:layout_width="0dp"android:layout_height="240dp"android:adjustViewBounds="true"android:scaleType="fitXY"android:layout_weight="1"/><ImageViewandroid:id="@+id/image2"android:layout_width="0dp"android:layout_height="240dp"android:adjustViewBounds="true"android:scaleType="fitXY"android:layout_weight="1"/><ImageViewandroid: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"><Buttonandroid: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" /><applicationandroid: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);@Overridepublic 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));}@Overridepublic 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);@Overridepublic String getSearchUrl(String keyword, int page) {int begin = page * PAGE_SIZE;return String.format(BING_IMAGE_SEARCH_URL, keyword, begin, PAGE_SIZE);}@Overridepublic 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:faceprivate 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);@Overridepublic String getSearchUrl(String keyword, int page) {int begin = page * PAGE_SIZE;return String.format(GOOGLE_IMAGE_SEARCH_URL, keyword, page, begin);}@Overridepublic 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() {@Overridepublic 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进行展示;

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

  1. 能够附加图片的标签控件iOS项目源码

    这个源码案例是能够附加图片的标签控件,源码JTImageLabel,JTImageLabel能够附加图片的标签Label控件,图片可以随意更换.位置也能够很好的控制. 效果图: <ignore_ ...

  2. android+高仿+日历,项目源码--Android天气日历精致UI源码

    技术要点: 1. 天气日历精致UI 2. Android的Http通信技术 3. Android的天气信息解析 4. Android的日历信息的统计 5. Andorid的地理位置的管理 6.源码带有 ...

  3. Android图片处理神器BitmapFun源码分析

    作为一名Android开发人员,相信大家对图片OOM的问题已经耳熟能详了,关于图片缓存和解决OOM的开源项目也是相当的多,被大家熟知的就是Universal_image_loader和Volley了, ...

  4. 140款Android开源优秀项目源码

    140款Android开源优秀项目源码 BeautifulRefreshLayout-漂亮的美食下拉刷新 https://github.com/android-cjj/BeautifulRefresh ...

  5. Android项目源码分享

    ├─android web应用 │      jqmDemo_static.zip │      jqmMobileDemo-master.zip │      jqmMobileDemo1_1-ma ...

  6. Android Glide图片加载框架(二)源码解析之with()

    文章目录 一.前言 二.如何阅读源码 三.源码解析 1.with() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图 ...

  7. 自己帮别人写的网站可以公开源码吗_专注爬虫:20个精心总结爬虫项目,爬虫技术这里强(附源码)...

    写在前面 你想成为Python爬虫的高手么?你想爬取你想要的高质量数据么? 那么你得需要进行爬虫项目的演练,那样你才有可能在Python爬虫的道路上走的更远 小编在这里精心总结了20个爬虫项目的演练, ...

  8. Android高级开发之【RxJava】详解(附项目源码)

    文章大纲 一.什么是RxJava 二.为什么要用RxJava 三.RxJava使用详解 四.项目源码下载 一.什么是RxJava Rx(Reactive Extensions)是一个库,用来处理事件和 ...

  9. GitHub上最火的22个Android开源项目源码(最少的一个也超过10k star)

    GitHub上最火的22个Android开源项目源码均超万星 chat图表 最全android工具类库 29.6k start Android智能下拉刷新框架-SmartRefreshLayout 2 ...

最新文章

  1. (深入理解)matplotlib的交互模式(block,interactive,ion,ioff,draw,show,plot等的区别)
  2. 大学生智能汽车竞赛-讯飞智慧餐厅组别成绩公示!
  3. SpringMVC中重定向
  4. python散点图拟合曲线-python 绘制拟合曲线并加指定点标识的实现
  5. js字符串的各种格式的转换 ToString,Format
  6. ttf能改成gfont吗_一楼业主把半地下室窗户改成门,出来就是下沉式小花园,摊上事了...
  7. C#中的三种委托方式:Func委托,Action委托,Predicate委托
  8. 关于导入c3p0-0.9.5.5.jar包引发NoClassDefFoundError、ClassNotFoundException
  9. left join、right join、inner join的区别
  10. 字符串匹配之KMP---全力解析
  11. ElasticSearch中doc values和fielddata
  12. 可悲的外企Infrastructure - 些须感触(杂)
  13. python dict排序
  14. Google 抓取工具(Googlebot)汇总
  15. Kindle3与亚马逊
  16. 现代opengl 设计 assimp 3D 模型加载库
  17. iOS逆向--MachoO文件
  18. ev4转换MP4格式教程
  19. html打开ppt自动播放,如何让ppt文档打开自动播放_让ppt文档打开自动播放的方法-系统城...
  20. Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十六(商品排序,Thymeleaf快速入门,商品详情页的展示)

热门文章

  1. firefox 插件可能用得上的Firefox插件及下载
  2. 对设计领域中Tile和Card的理解
  3. Django-分页、中间件和请求的声明周期
  4. C++交换两个数组的前n个字节
  5. 多线程NSObjectNSThreadNSOperationGCD
  6. 【转】Android实例剖析笔记(二)--用实例讲解Andriod的开发过程,以NotesList为实例介绍Android的菜单机制...
  7. bzoj1113[Poi2008]海报PLA
  8. nginx访问静态文件
  9. 几款主流的 Python IDE
  10. shell脚本备份MySQL