后台
参考点+依赖
多图片保存在本地服务器压缩读取图片的方式:tomcat springboot 安卓上传多图片
girdview适配器弹窗图片选择器
依赖:AndroidManifest 中application节点配置:回调 发出请求
后台 参考点+依赖 多图片保存在本地服务器参考《springboot保存图片到项目文件资源路径》
修改点:多图片保存在本地服务器的确定路径,同时压缩图片保证图片不过大导致读取服务器图片时加载过慢。
《Thumbnails 压缩后反而变大》可知,用jpg转成jpg效果最佳
使用方法
Thumbnails.of("原图存放地址")
.scale(1f)
.outputQuality(0.5f)
.toFile("压缩后存放地址");
依赖:
net.coobird
thumbnailator
0.4.8
com.twelvemonkeys.imageio
imageio-jpeg
3.6
读取图片的方式:tomcat
参考《图片上传到Linux服务器的指定路径后,如何以外链的形式访问图片呢?》
与springboot的定义的文件目录需对应对应tomcat中添加
springboot
private String staticPath="/home"; //定义上传文件的根目录
@ResponseBody
@RequestMapping(value ="/loadimages", method = RequestMethod.POST)
public AnswerRet uploadImageByVisits(@RequestParam("files") List files, Long id) {
if(files==null)
throw new RrException(55500,"file 空");
else{
File targetFile = new File(staticPath);
if (!targetFile.exists()){
targetFile.mkdirs();
}
StringBuffer stringBuffer=new StringBuffer();
for(int i=0;i(1,"成功");
}
服务器本地图片:
外网读取图片:
效果:选择图片上传时,最多九张图片上传,点击图片可浏览,图片左上角有删除按钮,点击加号弹窗提示拍照/相册
【利用girdview展示选中的图片,在最后的位置固定为+图片,直至9张图充满girdview
girdview的item 主要两项imageview 一个图片一个删除按钮
在适配器中装载图片并确定删除按钮点击事件:
public class PhotoChooseListAdapter extends baseAdapter {
//List 图片选择器选择后回调可返回的数据 即选中的list
private List selectList;
private LayoutInflater layoutInflater;
private Context context;
public PhotoChooseListAdapter(List selectList,Context context){
this.selectList=selectList;
this.context=context;
layoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return selectList.size() + 1;
}
@Override
public Object getItem(int i) {
return selectList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
ViewHolder viewHolder = null;
if (view == null) {
viewHolder = new ViewHolder();
view = layoutInflater.inflate(girdview的item, viewGroup, false);
viewHolder.addimage = (ImageView) view.findViewById(R.id.photo_img);
viewHolder.photo_delete=(ImageView) view.findViewById(R.id.photo_delete);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
if (position == selectList.size()) {
//加号图标展示
Glide.with(context)
.load(R.drawable.add_photo)
.into(viewHolder.addimage);
if (position == 9) {
//加号图标消失
viewHolder.addimage.setVisibility(View.GONE);
}
viewHolder.photo_delete.setVisibility(View.GONE);
} else {
//正常展示图片,带上删除按钮
viewHolder.photo_delete.setVisibility(View.VISIBLE);
viewHolder.photo_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
selectList.remove(position);
setList(selectList);
notifyDataSetChanged();
}
});
//图片加载
String path;
if (selectList.get(position).isCompressed())
path=selectList.get(position).getCompressPath();
else if(selectList.get(position).isCut())
path=selectList.get(position).getCutPath();
else
path=selectList.get(position).getPath();
Glide.with(context)
.load(path)
.into(viewHolder.addimage);
}
return view;
}
public void setList(List selectList){
this.selectList=selectList;
}
class ViewHolder {
ImageView addimage;
ImageView photo_delete;
}
}
绑定适配器确定点击item监听事件,i==selectList.size() :点击加号按钮弹窗提示选择拍照/相册
否则 浏览图片
// 浏览图片
PictureSelector.create(VisitsAddActivity.this)
.themeStyle(com.luck.picture.lib.R.style.picture_default_style)
.isNotPreviewDownload(true)//是否显示保存弹框
.imageEngine(GlideEngine.createGlideEngine()) // 选择器展示不出图片则添加
.openExternalPreview(i, selectList);
弹窗
弹窗出现前,需动态获取权限
依赖
//动态获取权
implementation 'com.github.tbruyelle:rxpermissions:0.9.0'
final RxPermissions rxPermissions = new RxPermissions(VisitsAddActivity.this);
rxPermissions.request(Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE
,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE)
.subscribe(new Action1() {
@Override
public void call(Boolean granted) {
if (granted) { // 在android 6.0之前会默认返回true
//打开弹窗
} else {
Toast.makeText(VisitsAddActivity.this, "拒绝", Toast.LENGTH_SHORT).show();
}
}
});
图片选择器
参考《Android 多图选择器PictureSelector 使用》的PictureSelector 版本
按上述链接完成缺少依赖glide的GlideEngine
解决方法:《关于Pictureselector相册全白、不显示图片的问题(附GlideEngine代码)》
//选择图片上传 implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' //glide版本慎用,高版本会导致闪退,具体参考github上的文件 implementation'com.github.bumptech.glide:glide:4.5.0'AndroidManifest 中application节点配置:
打开相册举例:
private List
PictureSelector.create(VisitsAddActivity.this)
.openGallery(PictureMimeType.ofImage())
.selectionData(selectList)
.maxSelectNum(9)
.minSelectNum(1)
.imageEngine(GlideEngine.createGlideEngine())
.imageSpanCount(3)
.isPreviewImage(false)
.selectionMode(PictureConfig.MULTIPLE)
.isCamera(false)
.imageFormat(PictureMimeType.PNG)
.circleDimmedLayer(true)
.isEnableCrop(false)
.isCompress(true)
.showCropframe(false)
.showCropGrid(false)
.rotateEnabled(false)
.scaleEnabled(true)
.isGif(false)
.minimumCompressSize(100)
.synOrAsy(true)
.forResult(PictureConfig.CHOOSE_REQUEST);
回调
PictureSelector.obtainMultipleResult(data)返回 List
安卓请求规格化看前文 【Android】安卓实现网络请求,得到数据并显示于listview,包含token与拦截器
ApiService中
@POST("loadimages")
Call loadImages(@Body RequestBody requestBody);
请求调用
MultipartBody.Builder bodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
for(int i=0;i responseBodyCall = apiServiceBusiness.uploadImageVisits(body);
responseBodyCall.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
String res=null;
try {
res=new String(response.body().bytes());
JSonObject jsonObject= JSON.parseObject(res);
if(Long.parseLong(jsonObject.get("code").toString())==1) {
//成功的操作
} else {
//返回码失败的操作
}
}catch (IOException e){
//读取返回数据失败的操作
}
}
@Override
public void onFailure(Call call, Throwable t) {
//请求失败的操作
}
});



