ImageSelector图片选择器以及图片处理,可以选择几张,是否拍照

本文记录了使用ImageSelector图片选择器的实践过程,包括导入相关包、配置manifest、创建file_paths.xml以及处理选择结果的方法。在ImageView的点击事件中调用选择器,并在onActivityResult中处理返回结果。此外,还介绍了如何通过Retrofit将选定图片上传至服务器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:参考了别人的代码,来源不清楚,然后实践之后记录下来,防止忘记
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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值