因为拍照之后得裁剪图片,把裁剪之后的图片保存在sd中,首先动态申请sd的读写权限
private static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; private static final int REQUEST_EXTERNAL_STORAGE = 2; // 不可改
//动态申请sd读写权限 //1检查是否有权限 int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); //2根据检查结果判断是否有权限 if (permission != PackageManager.PERMISSION_GRANTED) { //3申请数组中的权限 在onRequestPermissionsResult方法处理权限结果 ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); }else { //已经有权限了底部弹出选择相机还是相册裁剪图片 showPopupWindow(); }@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults);//这个是相机权限申请结果,先忽略 if (requestCode == 1) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //用户同意权限,调用相机拍照 Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); i.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); startActivityForResult(i, TAKE_PICTURE); } else { //用户拒绝权限 Toast.makeText(this, "开启相机失败", Toast.LENGTH_SHORT).show(); } }//sd读写申请的结果 if (requestCode == 2){ if (permissions.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ showPopupWindow(); }else { //用户拒绝权限 Toast.makeText(this, "没有权限无法使用", Toast.LENGTH_SHORT).show(); } } }private void showPopupWindow() {//弹出popuwindow SelectPopuWindow popuWindow = new SelectPopuWindow(this); setBackgroundAlpha(0.5f, this); popuWindow.showAtLocation(mInflate, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); popuWindow.setOnbtnSelectListener(new SelectPopuWindow.OnbtnSelectListener() { @Override public void btnSelect(boolean seleceCanmera) { if (seleceCanmera) { //调用相机拍照 File file = FileUtil.createFile(Environment.getExternalStorageDirectory(), "canmera.jpg"); mImageUri = Uri.fromFile(file); if (ActivityCompat.checkSelfPermission(SelectIntentActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { //请求权限 ActivityCompat.requestPermissions(SelectIntentActivity.this, new String[]{Manifest.permission.CAMERA}, 1); } else { //调用相机拍照 Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); i.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); startActivityForResult(i, TAKE_PICTURE); } } else { //调用相机拍照 File file = FileUtil.createFile(Environment.getExternalStorageDirectory(), "temp.jpg"); mUri = Uri.fromFile(file); //从相册中选择 Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setDataAndType(mUri, "image/*"); intent.putExtra("crop", "true");//裁剪输出图片的宽高 intent.putExtra("outputX", 500); intent.putExtra("outputY", 700); intent.putExtra("scale", true); intent.putExtra(MediaStore.EXTRA_OUTPUT, mUri);//图片保存到uri中 intent.putExtra("return-data", false); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", false); // no face detection startActivityForResult(intent, TAKE_CROP_ALBUM); } } }); }//最后在onActivityResult根据保存图片的路径处理图片@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == TAKE_PICTURE) { //裁剪图片 cropImageUri(TAKE_CROP_PICTURE); } if (requestCode == TAKE_CROP_PICTURE && resultCode == Activity.RESULT_OK && data != null) { //裁剪结果 if (mImageUri != null) { mVindialog.show(); //上传图片到服务器 updataVINImgae(mImageUri); } } if (requestCode == TAKE_CROP_ALBUM && resultCode == Activity.RESULT_OK && data != null) { //裁剪结果 if (mUri != null) { mVindialog.show(); //上传图片到服务器 updataVINImgae(mUri); } } }//最后是图片上传private void updataVINImgae(Uri data) { MultipartBody.Builder requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM); if (!TextUtils.isEmpty(data.getPath())) { File mCarFile = new File(data.getPath()); requestBody.addFormDataPart("ocrFile", mCarFile.getName(), RequestBody.create(MEDIA_TYPE_PNG, mCarFile)); } //构建请求 final Request request = new Request.Builder() .url(Constants.URLS.QUERY_VINIMAGE_URL)//地址 .post(requestBody.build())//添加请求体 .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { runOnUiThread(new Runnable() { @Override public void run() { mVindialog.dismiss(); Toast.makeText(SelectIntentActivity.this, "网络异常无法解析", Toast.LENGTH_SHORT).show(); } }); } @Override public void onResponse(Call call, Response response) throws IOException { Gson gson = new Gson(); final VINNumberBean vinNumberBean = gson.fromJson(response.body().string(), VINNumberBean.class); int code = vinNumberBean.getCode(); if (code == 0){ mVindialog.dismiss(); runOnUiThread(new Runnable() { @Override public void run() { mVin_et.setText(vinNumberBean.getResponse().get(0).getVinCode()); } }); }else { runOnUiThread(new Runnable() { @Override public void run() { mVindialog.dismiss(); Toast.makeText(SelectIntentActivity.this,vinNumberBean.getMessage(),Toast.LENGTH_SHORT).show(); } }); } } }); }//还有模仿ios底部弹出菜单public class SelectPopuWindow extends PopupWindow{ private final View mView; private Button mCancle; private Button mCanmera; private Button mAlbum; private OnbtnSelectListener mOnbtnSelectListener; private Context mContext; public SelectPopuWindow(Context context){ mContext = context; mView = LayoutInflater.from(context).inflate(R.layout.view_select_popuwindow, null); setOutsideTouchable(false); // 设置视图 this.setContentView(this.mView); // 设置弹出窗体的宽和高 this.setHeight(RelativeLayout.LayoutParams.WRAP_CONTENT); this.setWidth(RelativeLayout.LayoutParams.MATCH_PARENT); // 设置弹出窗体可点击 this.setFocusable(true); // 设置弹出窗体显示时的动画,从底部向上弹出 this.setAnimationStyle(R.style.take_photo_anim); initViews(); initListener(); } private void initListener() { mCancle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setBackgroundAlpha(1.0f,mContext); dismiss(); } }); mCanmera.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnbtnSelectListener.btnSelect(true); setBackgroundAlpha(1.0f,mContext); dismiss(); } }); mAlbum.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnbtnSelectListener.btnSelect(false); setBackgroundAlpha(1.0f,mContext); dismiss(); } }); } /** * 设置背景颜色 * @param bgAlpha */ public static void setBackgroundAlpha(float bgAlpha, Context mContext) { WindowManager.LayoutParams lp = ((Activity) mContext).getWindow() .getAttributes(); lp.alpha = bgAlpha; ((Activity) mContext).getWindow().setAttributes(lp); } private void initViews() { mCanmera = (Button) mView.findViewById(R.id.canmera); mAlbum = (Button) mView.findViewById(R.id.album); mCancle = (Button) mView.findViewById(R.id.cancle); } public void setOnbtnSelectListener(OnbtnSelectListener selectListener){ mOnbtnSelectListener = selectListener; } public interface OnbtnSelectListener{ void btnSelect(boolean seleceCanmera); } }//R.layout.view_select_popuwindow 的布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:paddingLeft="10dp" android:paddingRight="10dp" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:background="@drawable/bg_shape_cancle_btn" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:background="@null" android:id="@+id/canmera" android:text="拍照" android:layout_width="match_parent" android:layout_height="wrap_content"/> <View android:background="#33333333" android:layout_width="match_parent" android:layout_height="1dp"/> <Button android:background="@null" android:id="@+id/album" android:text="从相册中选择" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> <Button android:layout_marginBottom="5dp" android:layout_marginTop="10dp" android:background="@drawable/bg_shape_cancle_btn" android:id="@+id/cancle" android:text="取消" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>使用到的动画
<style name="take_photo_anim"> <item name="android:windowExitAnimation">@anim/take_popuwindow_exit</item> <item name="android:windowEnterAnimation">@anim/take_popuwindow_enter</item> </style><?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="500" android:fromYDelta="0" android:toYDelta="50%p" /> </set><?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="500" android:fromYDelta="100%p" android:toYDelta="0" /> </set>