Android图片爬虫,看妹纸神器项目源码
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:"(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(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);