android 自定义相机返回图片URL,高清

有没有经常使用拍照返回图片 ,裁剪图片,需要返回图片url的操作?

返回的图片不高清有没有

使用第三方的库包太累赘有么有 ?

自己太懒不想重写相机的有没有 ?


studou使用第三方的库,很多时候会因为隐痛相同的库而无法打包,有时候又找不到那个库 , 让我苦不堪言 ,前段时间用的是google的相机库 , 这个项目始终有相同的库,我又找不到 , 最后只能考虑自己重写一个相机 。 嗯,还是勤快点,自己写吧 

不贴源码地址了 ,几个类,贴代码出来


先把相关的权限贴出来 ,SD卡读写权限,相机权限

<uses-feature
    android:name="android.hardware.camera"
    android:required="false" />

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />


 activity_Cameral.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/camera_preview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ImageView
        android:id="@+id/btn_capture"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_margin="10dp"
        android:src="@drawable/ic_camera" />

    <ImageView
        android:id="@+id/btn_switch_camera"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_margin="10dp"
        android:src="@drawable/selector_switch_camera" />

</RelativeLayout>

图片的保存类工具类

package com.mirror.mobile.activity.camera;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.hardware.Camera;
import android.os.Handler;
import android.util.Log;

import com.mirror.mobile.config.ApInfo;
import com.mirror.mobile.util.FileUtils;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;

/**
 * Created by jsjm on 2017/12/9.
 */

public class PicSaveFile {
    public final String TAG = "CameraSimple";

    public void saveImage(final int mCameraId, final byte[] data, final WritrFileListener listener) {
        Log.e(TAG, "=======拍照回掉===");
        FileUtils.creatFileNotExciet();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String picturePath = ApInfo.IMAGE_URL + "/" + System.currentTimeMillis() + ".jpg";
                    File file = new File(picturePath);
                    if (!file.exists()) {
                        file.createNewFile();
                    }
                    Log.e(TAG, "拍照回掉===0000000000000");
                    // 获取当前旋转角度, 并旋转图片
                    Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
                            data.length);
                    if (mCameraId == Camera.CameraInfo.CAMERA_FACING_BACK) {
                        bitmap = rotateBitmapByDegree(bitmap, 90);
                    } else {
                        bitmap = rotateBitmapByDegree(bitmap, -90);
                    }
                    Log.e(TAG, "拍照回掉===111111111111111");
                    BufferedOutputStream bos = new BufferedOutputStream(
                            new FileOutputStream(file));
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
                    bos.flush();
                    bos.close();
                    Log.e(TAG, "拍照回掉===222222222222222222");
                    bitmap.recycle();
                    Log.e(TAG, "拍照回掉===3333333333333333333");
                    backState(picturePath, true, listener);
                } catch (Exception e) {
                    backState("", false, listener);
                    Log.e(TAG, "拍照回掉异常===" + e.toString());
                    e.printStackTrace();
                }
            }
        }).start();
    }

    private Handler handler = new Handler();

    public void backState(final String savePath, final boolean isSuccess, final WritrFileListener listener) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                if (isSuccess) {
                    listener.writeSuccess(savePath);
                } else {
                    listener.writeFailed();
                }
            }
        });
    }

    // 旋转图片
    public Bitmap rotateBitmapByDegree(Bitmap bm, int degree) {
        Bitmap returnBm = null;
        Matrix matrix = new Matrix();
        matrix.postRotate(degree);
        try {
            returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                    bm.getHeight(), matrix, true);
        } catch (OutOfMemoryError e) {
        }
        if (returnBm == null) {
            returnBm = bm;
        }
        if (bm != returnBm) {
            bm.recycle();
        }
        return returnBm;
    }

    public interface WritrFileListener {
        void writeSuccess(String savePath);

        void writeFailed();
    }

}


自定义拍照界面

package com.mirror.mobile.activity.camera;

import java.io.IOException;

import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CameraPreview extends SurfaceView implements
        SurfaceHolder.Callback {
    private SurfaceHolder mHolder;
    private Camera mCamera;

    public CameraPreview(Context context, Camera camera) {
        super(context);
        mCamera = camera;
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        if (mHolder.getSurface() == null) {
            return;
        }
        try {
            mCamera.stopPreview();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

cameralActivity界面类

package com.mirror.mobile.activity.camera;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Toast;

import com.cdl.dialog.WaitDialogUtil;
import com.mirror.mobile.activity.BaseActivity;
import com.mirror.mobile.activity.UpdateImageActivity;
import com.mirror.mobile.view.MyToastView;
import com.mirrormobile.R;

import java.util.List;

@SuppressWarnings("deprecation")
public class CameraActivity extends BaseActivity {

    public static final String TAG = "CameraSimple";
    private Camera mCamera;
    private CameraPreview mPreview;
    private FrameLayout mCameralayout;
    private ImageView mTakePictureBtn;
    private ImageView mSwitchCameraBtn;
    private int mCameraId = CameraInfo.CAMERA_FACING_BACK;
    WaitDialogUtil waitDialogUtil;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_camera);

        if (!checkCameraHardware(this)) {
            Toast.makeText(CameraActivity.this, "相机不支持", Toast.LENGTH_SHORT)
                    .show();
        } else {
            openCamera();
            initView();
            setCameraDisplayOrientation(this, mCameraId, mCamera);
        }

    }

    private void initView() {
        waitDialogUtil = new WaitDialogUtil(CameraActivity.this);
        mTakePictureBtn = (ImageView) findViewById(R.id.btn_capture);
        mTakePictureBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mCamera.autoFocus(mAutoFocusCallback);
            }
        });
        mSwitchCameraBtn = (ImageView) findViewById(R.id.btn_switch_camera);
        mSwitchCameraBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                switchCamera();
            }
        });
    }

    // 判断相机是否支持
    private boolean checkCameraHardware(Context context) {
        if (context.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA)) {
            return true;
        } else {
            return false;
        }
    }

    // 获取相机实例
    public Camera getCameraInstance() {
        Camera c = null;
        try {
            c = Camera.open(mCameraId);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return c;
    }

    // 开始预览相机
    public void openCamera() {
        if (mCamera == null) {
            mCamera = getCameraInstance();
            Camera.Parameters parameters = mCamera.getParameters();
            List<Camera.Size> list = parameters.getSupportedPictureSizes();
            Camera.Size size = list.get(0);
            parameters.setPictureSize(size.width, size.height);
            mCamera.setParameters(parameters);
            mPreview = new CameraPreview(CameraActivity.this, mCamera);
            mPreview.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    mCamera.autoFocus(null);
                    return false;
                }
            });
            mCameralayout = (FrameLayout) findViewById(R.id.camera_preview);
            mCameralayout.addView(mPreview);
            mCamera.startPreview();
        }
    }

    // 释放相机
    public void releaseCamera() {
        try {
            if (mCamera != null) {
                mCamera.setPreviewCallback(null);
                mCamera.stopPreview();
                mCamera.release();
                mCamera = null;
            }
        } catch (Exception e) {
        }

    }

    PicSaveFile fileSaveFile;
    // 拍照回调
    private PictureCallback mPictureCallback = new PictureCallback() {
        @Override
        public void onPictureTaken(final byte[] data, Camera camera) {
            waitDialogUtil.showDialog("图片保存");
            if (fileSaveFile == null) {
                fileSaveFile = new PicSaveFile();
            }
            fileSaveFile.saveImage(mCameraId, data, new PicSaveFile.WritrFileListener() {
                @Override
                public void writeSuccess(String savePath) {
                    waitDialogUtil.dismiss();
                    Intent mIntent = new Intent();
                    mIntent.putExtra(UpdateImageActivity.TAG_CAMERAL_BACK, savePath);
                    setResult(UpdateImageActivity.REQUEST_CODE_CAMERA, mIntent);
                    finish();
                }

                @Override
                public void writeFailed() {
                    waitDialogUtil.dismiss();
                    MyToastView.getInstance().Toast(CameraActivity.this, "图片保存失败");
                    mCamera.startPreview();
                }
            });
        }
    };

    // 设置相机横竖屏
    public void setCameraDisplayOrientation(Activity activity, int cameraId,
                                            Camera camera) {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(cameraId, info);
        int rotation = activity.getWindowManager().getDefaultDisplay()
                .getRotation();
        int degrees = 0;
        switch (rotation) {
            case Surface.ROTATION_0:
                degrees = 0;
                break;
            case Surface.ROTATION_90:
                degrees = 90;
                break;
            case Surface.ROTATION_180:
                degrees = 180;
                break;
            case Surface.ROTATION_270:
                degrees = 270;
                break;
        }

        int result;
        if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            result = (info.orientation + degrees) % 360;
            result = (360 - result) % 360;
        } else {
            result = (info.orientation - degrees + 360) % 360;
        }
        camera.setDisplayOrientation(result);
    }

    // 切换前置和后置摄像头
    public void switchCamera() {
        CameraInfo cameraInfo = new CameraInfo();
        Camera.getCameraInfo(mCameraId, cameraInfo);
        if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
            mCameraId = CameraInfo.CAMERA_FACING_FRONT;
        } else {
            mCameraId = CameraInfo.CAMERA_FACING_BACK;
        }
        mCameralayout.removeView(mPreview);
        releaseCamera();
        openCamera();
        setCameraDisplayOrientation(CameraActivity.this, mCameraId, mCamera);
    }

    // 聚焦回调
    private AutoFocusCallback mAutoFocusCallback = new AutoFocusCallback() {
        @Override
        public void onAutoFocus(boolean success, Camera camera) {
            Log.e(TAG, "聚焦成功====" + success);
            if (success) {
                mCamera.takePicture(null, null, mPictureCallback);
            }
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        releaseCamera();
    }
}

界面调用的类

Intent intent = new Intent(UpdateImageActivity.this, CameraActivity.class);
startActivityForResult(intent, REQUEST_CODE_CAMERA);


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Uri uri = null;
    if (requestCode == REQUEST_CODE_CAMERA) { //拍照返回数据
        String savePath = data.getStringExtra(TAG_CAMERAL_BACK);
        File file = new File(savePath);
        if (!file.exists()) {
            MyToastView.getInstance().Toast(UpdateImageActivity.this, "文件不存在,请重新操作");
            return;
        }//下面是裁剪的工具
        uri = Utils.getImageContentUri(UpdateImageActivity.this, file);
        Utils.getInstance().cropPicture(this, uri);
    }











猜你喜欢

转载自blog.csdn.net/fkgjdkblxckvbxbgb/article/details/78758646