package com.electric.chargingpile.activity; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; import android.app.ProgressDialog; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.WindowManager; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.electric.chargingpile.R; import com.electric.chargingpile.entity.CarBrandGroupEntity; import com.electric.chargingpile.entity.CarSeriesEntity; import com.electric.chargingpile.event.CarBrandEvent; import com.electric.chargingpile.event.CarSerieEvent; import com.electric.chargingpile.util.BarColorUtil; import com.electric.chargingpile.util.FileUtils; import com.electric.chargingpile.util.JsonUtils; import com.electric.chargingpile.util.LoadingDialog; import com.electric.chargingpile.util.ToastUtil; import com.electric.chargingpile.view.TextImageView; import com.electric.chargingpile.view.xrichtext.SDCardUtil; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.zhihu.matisse.Matisse; import com.zhihu.matisse.MimeType; import com.zhihu.matisse.engine.impl.GlideEngine; import com.zhihu.matisse.internal.entity.CaptureStrategy; import com.zhy.http.okhttp.OkHttpUtils; import com.zhy.http.okhttp.callback.StringCallback; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.io.ByteArrayOutputStream; import java.io.File; import java.util.ArrayList; import java.util.List; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import okhttp3.Call; /** * 车主认证 */ public class CarOwnerCertificateActivity extends AppCompatActivity implements View.OnClickListener { private static final int RC_ALBUM_PERM = 123; private static final int REQUEST_CODE_CHOOSE = 342; private Bitmap insertBitmap; private String u_path = ""; private int drivingLicenseType = 1; private ProgressDialog insertDialog; private TextView nav_title; private Button submit_btn; private TextImageView driving_license_type_first; private TextImageView driving_license_type_second; private TextImageView driving_license_type_third; private TextView add_car_model_btn; private LoadingDialog loadDialog; private ArrayList groups; private CarSeriesEntity carSeriesEntity; private ConstraintLayout car_model_constraint_layout; private ConstraintLayout car_model_selected_constraint_layout; private ImageView car_icon; private TextView car_name; private TextView car_series; private ConstraintLayout driving_license; private ImageView driving_license_icon; private ImageView driving_license_upload_icon; private TextView driving_license_text_view; private Drawable selected; private Drawable normal; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 禁止顶部固定部分滑动 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); setContentView(R.layout.activity_car_owner_certificate); BarColorUtil.initStatusBarColor(CarOwnerCertificateActivity.this); initViews(); brandListRequest(false); add_car_model_btn.setVisibility(View.GONE); EventBus.getDefault().register(this); } private void initViews() { loadDialog = new LoadingDialog(this); loadDialog.setCanceledOnTouchOutside(false); insertDialog = new ProgressDialog(this); insertDialog.setMessage("正在插入图片..."); insertDialog.setCanceledOnTouchOutside(false); nav_title = findViewById(R.id.nav_title); findViewById(R.id.iv_back).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); add_car_model_btn = findViewById(R.id.add_car_model_btn); car_model_constraint_layout = findViewById(R.id.car_model_constraint_layout); car_model_selected_constraint_layout = findViewById(R.id.car_model_selected_constraint_layout); add_car_model_btn.setOnClickListener(this); car_model_selected_constraint_layout.setOnClickListener(this); car_icon = findViewById(R.id.car_icon); car_name = findViewById(R.id.car_name); car_series = findViewById(R.id.car_series); driving_license = findViewById(R.id.driving_license); driving_license.setOnClickListener(this); driving_license_icon = findViewById(R.id.driving_license_icon); driving_license_upload_icon = findViewById(R.id.driving_license_upload_icon); driving_license_text_view = findViewById(R.id.driving_license_text_view); driving_license_type_first = findViewById(R.id.driving_license_type_first); driving_license_type_second = findViewById(R.id.driving_license_type_second); driving_license_type_third = findViewById(R.id.driving_license_type_third); driving_license_type_first.setOnClickListener(this); driving_license_type_second.setOnClickListener(this); driving_license_type_third.setOnClickListener(this); selected = getResources().getDrawable(R.drawable.icon_radio_selected, null); selected.setBounds(0, 0, selected.getMinimumWidth(), selected.getMinimumHeight()); normal = getResources().getDrawable(R.drawable.icon_radio_normal, null); normal.setBounds(0, 0, normal.getMinimumWidth(), normal.getMinimumHeight()); submit_btn = findViewById(R.id.submit_btn); submit_btn.setOnClickListener(this); } private void brandListRequest(Boolean showLoading) { if (showLoading) loadDialog.show(); // https://www.jianshu.com/p/10382cc71127 // String url = "https://api.touchev.com:83/car/api/v1000/brand/list.do"; String url = "http://car.d1ev.com/car/api/v1000/brand/list.do"; // String url = MainApplication.url + "/zhannew/basic/web/index.php/member/get-score?id=" + MainApplication.userId + // "&phone=" + MainApplication.userPhone + "&password=" + MainApplication.userPassword + "&token=" + "xxxxxx"; OkHttpUtils.get().url(url).build().connTimeOut(5000).readTimeOut(5000).execute(new StringCallback() { @Override public void onError(Call call, Exception e) { Toast.makeText(getApplicationContext(), "网络不给力,请检查网络状态", Toast.LENGTH_SHORT).show(); loadDialog.dismiss(); add_car_model_btn.setVisibility(View.VISIBLE); } @Override public void onResponse(String response) { loadDialog.dismiss(); add_car_model_btn.setVisibility(View.VISIBLE); String code = JsonUtils.getKeyResult(response, "code"); String desc = JsonUtils.getKeyResult(response, "desc"); if ("1000".equals(code)) { String data = JsonUtils.getKeyResult(response, "data"); Gson gson = new Gson(); groups = gson.fromJson(data, new TypeToken>() { }.getType()); if (groups == null || groups.size() == 0) { if (showLoading) ToastUtil.showToast(getApplicationContext(), desc, Toast.LENGTH_SHORT); } else { if (showLoading) { EventBus.getDefault().postSticky(new CarBrandEvent(groups)); startActivity(new Intent(CarOwnerCertificateActivity.this, CarBrandActivity.class)); } } } else { if (showLoading) ToastUtil.showToast(getApplicationContext(), desc, Toast.LENGTH_SHORT); } } }); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.add_car_model_btn: case R.id.car_model_selected_constraint_layout: if (groups == null || groups.size() == 0) { brandListRequest(true); } else { EventBus.getDefault().postSticky(new CarBrandEvent(groups)); startActivity(new Intent(CarOwnerCertificateActivity.this, CarBrandActivity.class)); } break; case R.id.driving_license: Matisse.from(CarOwnerCertificateActivity.this) .choose(MimeType.of(MimeType.JPEG, MimeType.PNG)) .showSingleMediaType(true) .countable(true) .maxSelectable(1) .capture(true) .captureStrategy(new CaptureStrategy(true, "com.electric.chargingpile.provider")) .imageEngine(new GlideEngine()) .forResult(REQUEST_CODE_CHOOSE); break; case R.id.driving_license_type_first: drivingLicenseType = 1; driving_license_type_first.setCompoundDrawables(selected, null, null, null); driving_license_type_second.setCompoundDrawables(normal, null, null, null); driving_license_type_third.setCompoundDrawables(normal, null, null, null); break; case R.id.driving_license_type_second: drivingLicenseType = 2; driving_license_type_first.setCompoundDrawables(normal, null, null, null); driving_license_type_second.setCompoundDrawables(selected, null, null, null); driving_license_type_third.setCompoundDrawables(normal, null, null, null); break; case R.id.driving_license_type_third: drivingLicenseType = 3; driving_license_type_first.setCompoundDrawables(normal, null, null, null); driving_license_type_second.setCompoundDrawables(normal, null, null, null); driving_license_type_third.setCompoundDrawables(selected, null, null, null); break; case R.id.submit_btn: if (carSeriesEntity == null) { ToastUtil.showToast(this, "请添加车型" + drivingLicenseType, Toast.LENGTH_SHORT); return; } break; } } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } @Subscribe(threadMode = ThreadMode.MAIN) public void onCarSeriesMessage(CarSerieEvent event) { if (event != null && event.getCarSeriesEntity() != null) { carSeriesEntity = event.getCarSeriesEntity(); car_model_constraint_layout.setVisibility(View.GONE); car_model_selected_constraint_layout.setVisibility(View.VISIBLE); car_name.setText(carSeriesEntity.getBrandName()); car_series.setText(carSeriesEntity.getSeriesName()); Glide.with(CarOwnerCertificateActivity.this).load(carSeriesEntity.getIcon()).placeholder(android.R.color.white).fitCenter().into(car_icon); } else { carSeriesEntity = null; car_model_constraint_layout.setVisibility(View.VISIBLE); car_model_selected_constraint_layout.setVisibility(View.GONE); } } @Override protected void onActivityResult(int requestCode, int resultCode, final Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (data != null) { if (requestCode == REQUEST_CODE_CHOOSE) { insertImagesSync(data); } } } } private Bitmap imageZoom(Bitmap bm) { // 图片允许最大空间 单位:KB double maxSize = 200.00; // 将bitmap放至数组中,意在bitmap的大小(与实际读取的原文件要大) ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] b = baos.toByteArray(); // 将字节换成KB double mid = b.length / 1024; // 判断bitmap占用空间是否大于允许最大空间 如果大于则压缩 小于则不压缩 if (mid > maxSize) { // 获取bitmap大小 是允许最大大小的多少倍 double i = mid / maxSize; // 开始压缩 此处用到平方根 将宽带和高度压缩掉对应的平方根倍 // (1.保持刻度和高度和原bitmap比率一致,压缩后也达到了最大大小占用空间的大小) bm = zoomImage(bm, bm.getWidth() / Math.sqrt(i), bm.getHeight() / Math.sqrt(i)); } return bm; } public Bitmap zoomImage(Bitmap bgimage, double newWidth, double newHeight) { // 获取这个图片的宽和高 float width = bgimage.getWidth(); float height = bgimage.getHeight(); // 创建操作图片用的matrix对象 Matrix matrix = new Matrix(); // 计算宽高缩放率 float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // 缩放图片动作 matrix.postScale(scaleWidth, scaleHeight); Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width, (int) height, matrix, true); return bitmap; } /** * 异步方式插入图片 * * @param data */ private void insertImagesSync(final Intent data) { insertDialog.show(); Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter subscriber) throws Exception { try { List uriList = Matisse.obtainResult(data); Uri uri = uriList.get(0); Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)); File file = FileUtils.from(CarOwnerCertificateActivity.this, uri); bitmap = FileUtils.rotateIfRequired(file, bitmap); bitmap = imageZoom(bitmap); insertBitmap = bitmap; u_path = SDCardUtil.saveToSdCard(bitmap); subscriber.onNext(u_path); subscriber.onComplete(); } catch (Exception e) { e.printStackTrace(); subscriber.onError(e); } } }) .subscribeOn(Schedulers.io())//生产事件在io .observeOn(AndroidSchedulers.mainThread())//消费事件在UI线程 .subscribe(new Observer() { @Override public void onComplete() { insertDialog.dismiss(); driving_license_icon.setImageBitmap(insertBitmap); driving_license_upload_icon.setVisibility(View.GONE); driving_license_text_view.setVisibility(View.GONE); // uploadPic(insertBitmap, u_path); // TODO EditAnswerActivity } @Override public void onError(Throwable e) { insertDialog.dismiss(); ToastUtil.showToast(getApplicationContext(), "图片插入失败", Toast.LENGTH_SHORT); } @Override public void onSubscribe(Disposable d) { } @Override public void onNext(String imagePath) { } }); } }