注:参考了别人的代码,来源不清楚,然后实践之后记录下来,防止忘记
1.导入包
//图片选择器
implementation 'com.github.donkingliang:ImageSelector:1.6.8'
implementation 'com.github.nanchen2251:CompressHelper:1.0.5'
//glide
implementation 'com.github.bumptech.glide:glide:3.7.0'
//retrofit
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
allprojects {
repositories {
google()
jcenter()
maven{url 'https://jitpack.io'}
}
}
manifest配置
<!-- 储存卡的读写权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 调用相机权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<activity
android:name="com.donkingliang.imageselector.ImageSelectorActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" /> <!-- 图片预览Activity -->
<activity
android:name="com.donkingliang.imageselector.PreviewActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" /> <!-- 图片剪切Activity -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
xml里添加file_paths.xml文件
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!-- 这个是保存拍照图片的路径,必须配置。 -->
<external-path
name="images"
path="Pictures" />
</paths>
可以在imageview的监听里调用该方法
private void imageSelectMethod(int n) {
//不限数量的多选
ImageSelector.builder()
.useCamera(true) // 设置是否使用拍照
.setSingle(false) //设置是否单选
.setMaxSelectCount(1) // 图片的最大选择数量,小于等于0时,不限数量。
.setViewImage(true) //是否点击放大图片查看,,默认为true
.start(this, n); // 打开相册,n为了判断点击的是那个imageview
}
case R.id.id_photo1: {
imageSelectMethod(0x1);
break;
}
在onActivityResult回调里调用该方法
//根据图片路径,得到图片文件,并进行压缩处理
private File formatImageUrl(String url, int index) {
try {
File newFile = new CompressHelper.Builder(this)
.setMaxWidth(720) // 默认最大宽度为720
.setMaxHeight(960) // 默认最大高度为960
.setQuality(80) // 默认压缩质量为80
.setFileName("picture" + index) // 设置你需要修改的文件名
.setCompressFormat(Bitmap.CompressFormat.JPEG) // 设置默认压缩为jpg格式
.setDestinationDirectoryPath(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES).getAbsolutePath())
.build()
.compressToFile(new File(url));
return newFile;
} catch (Exception e) {
Toast.makeText(this, "未知原因,导致部分图片添加失败", Toast.LENGTH_SHORT).show();
return null;
}
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 0x1 && resultCode == RESULT_OK) {
if (data != null) {
**ArrayList<String> images = data.getStringArrayListExtra(
ImageSelectorUtils.SELECT_RESULT);
file1=formatImageUrl(images.get(0),0);**
RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), file1);
MultipartBody.Part part = MultipartBody.Part.createFormData("frontImage", file1.getName(), requestBody);
parts.add(part);
Glide.with(this).load(images.get(0)).into(imageView1)
}
}
super.onActivityResult(requestCode, resultCode, data);
}
4.附加。。。。。。。。
用retrofit传到服务器
//接口
@Multipart
@POST("此为url")
Call<ResponseBody> addNumber(
@PartMap Map<String, RequestBody> map,
@Part List<MultipartBody.Part> parts);
//string需要转为requestBody
private RequestBody convertToRequestBody(String param){
RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), param);
return requestBody;
}
//图片类型要转为MultipartBody.Part
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 0x1 && resultCode == RESULT_OK) {
if (data != null) {
ArrayList<String> images = data.getStringArrayListExtra(
ImageSelectorUtils.SELECT_RESULT);
file1=formatImageUrl(images.get(0),0);
**RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), file1);
MultipartBody.Part part = MultipartBody.Part.createFormData("frontImage", file1.getName(), requestBody);
parts.add(part);**
Glide.with(this).load(images.get(0)).into(imageView1)
}
}
super.onActivityResult(requestCode, resultCode, data);
}