Android拍照及本地上传图片实现(单张)


定义2个常量,分别代表拍照和本地上传
private static final int IMAGE_REQUEST_CODE = 0;
private static final int CAMERA_REQUEST_CODE = 1;
private static final int RESULT_REQUEST_CODE = 2;
定义一个全局变量
private Uri imageUri;
拍照代码
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
                    Date date = new Date(System.currentTimeMillis());
                    String filename = format.format(date);
                    //创建File对象用于存储拍照的图片 SD卡根目录
                    //File outputImage = new File(Environment.getExternalStorageDirectory(),test.jpg);
                    //存储至DCIM文件夹
                    File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
                    File outputImage = new File(path, filename + ".png");
                    try {
                        if (outputImage.exists()) {
                            outputImage.delete();
                        }
                        outputImage.createNewFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    //将File对象转换为Uri并启动照相程序
                    Intent intentCamera;
                    if (Build.VERSION.SDK_INT >= 23) {
                        //将File对象转换为Uri并启动照相程序
                        //imageUri = Uri.fromFile(outputImage);
                        imageUri = FileProvider.getUriForFile(context, "com.com.suchbear.fileprovider", outputImage);
                        intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        intentCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
                    } else {
                        //将File对象转换为Uri并启动照相程序
                        imageUri = Uri.fromFile(outputImage);
                        intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    }
                    intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                    //   intentCamera.putExtra("return-data", true);
                    startActivityForResult(intentCamera, CAMERA_REQUEST_CODE);
获取本地图片代码
Intent intentFromCapture = new Intent(Intent.ACTION_PICK);
                    // 判断存储卡是否可以用,可用进行存储
                    intentFromCapture.setType("image/*");
                    startActivityForResult(intentFromCapture,
                            IMAGE_REQUEST_CODE);
接着在onActivityResult方法中处理回调
if (resultCode != RESULT_CANCELED) {
            switch (requestCode) {
                case IMAGE_REQUEST_CODE:
                    startPhotoZoom(data.getData());
                    break;
                case CAMERA_REQUEST_CODE:
                    // 判断存储卡是否可以用,可用进行存储
                    String state = Environment.getExternalStorageState();
                    if (state.equals(Environment.MEDIA_MOUNTED)) {
                        startPhotoZoom(imageUri);
                    } else {
                        Util.toastMsg("未找到存储卡,无法存储照片!");
                    }
                    break;
                case RESULT_REQUEST_CODE: // 图片缩放完成后
                    if (data != null) {
                        getImageToView(data);
                    }
                    break;
            }
        }
startPhotoZoom方法为系统自带裁剪工具
/**
     * 裁剪图片方法实现
     *
     * @param uri
     */
    public void startPhotoZoom(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        if (Build.VERSION.SDK_INT >= 23) {
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }
        intent.setDataAndType(uri, "image/*");
        // 设置裁剪
        intent.putExtra("crop", "true");
        // aspectX aspectY 是宽高的比例
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // outputX outputY 是裁剪图片宽高
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 200);
        intent.putExtra("return-data", true);
        startActivityForResult(intent, RESULT_REQUEST_CODE);
    }
getImageToView方法是获取图片后的相关处理
/**
     * 保存裁剪之后的图片数据
     */
    private void getImageToView(Intent data) {
        Bundle extras = data.getExtras();
        if (extras != null) {
            Bitmap photo = extras.getParcelable("data");
            //文件流
            /*File file = new File("/sdcard/DCIM/Camera/tempHeader.png");
            if (file.exists()) {
                file.delete();
            }
            FileOutputStream out;
            try {
                out = new FileOutputStream(file);
                if (photo.compress(Bitmap.CompressFormat.PNG, 90, out)) {
                    out.flush();
                    out.close();
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }*/
        }
    }