仿微信小视频录制功能,打开相机后,点击是拍照,长按是录制,录制小于1秒,要提示“录制时间太短”,最大可以录制1分钟的视频,拍完照或录制完视频后,要自动跳转到相片或视频展示页面,点击确认,回到留言板界面,将相片或视频发送到阿里云,然后再发送留言;如果点击“重新拍照”,则返回到相机页面;
activity页面,点击相机按钮:
case R.id.ll_camera: //设置权限 if (!PermissionHelper.checkPermission(mContext, Manifest.permission.CAMERA)) { ToastUtils.showShort(mContext, String.format(getString(R.string.permission_help_text), getString(R.string.per_camera))); return; } if (!PermissionHelper.checkPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { ToastUtils.showShort(mContext, String.format(getString(R.string.permission_help_text), getString(R.string.per_storage))); return; } //打开自定义相机 Intent cameraIntent = new Intent(this, TakePicActivity.class); startActivity(cameraIntent); break;
TakePicActivity.java
package com.haier.uhome.appliance.newVersion.module.messageboard; import android.animation.Animator; import android.animation.ObjectAnimator; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.PixelFormat; import android.graphics.Point; import android.hardware.Camera; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.animation.LinearInterpolator; import android.widget.Button; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.haier.uhome.appliance.R; import com.haier.uhome.appliance.newVersion.module.messageboard.util.CameraConfiguration; import com.haier.uhome.appliance.newVersion.module.messageboard.view.CircleProgressView; import com.haier.uhome.common.util.LogUtil; import com.orhanobut.logger.Logger; import java.io.File; import java.io.IOException; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import static com.haier.uhome.appliance.newVersion.module.messageboard.util.CameraConfiguration.getPreviewDegree1; public class TakePicActivity extends AppCompatActivity implements Camera.PreviewCallback { private static final String TAG = "TakePicActivity"; SurfaceView surfaceView; SurfaceHolder surfaceHolder; RelativeLayout rl_btn; @BindView(R.id.fl_content) FrameLayout flContent; //进度条 @BindView(R.id.circleProgress) CircleProgressView circleProgress; @BindView(R.id.iv_turn) ImageView ivTurn; private Camera camera; private Camera.Parameters parameters = null; Bundle bundle = null; // 声明一个Bundle对象,用来存储数据 Button takepicture; ImageView iv_takeBack; RelativeLayout rl_playPic; int w, h; protected boolean isPreview; private MediaRecorder mMediaRecorder; private boolean isRecording = true; // true表示没有录像,点击开始;false表示正在录像,点击暂停 private File mRecVedioPath; private File mRecAudioFile; //录制视频时的计时器 private TextView timer; private int hour = 0; private int minute = 0; private int second = 0; private boolean bool; private String fileName;//视频文件名 String model = android.os.Build.MODEL;//手机的型号 private Animator animator; private boolean isRecordState = false;//是否是视频录制状态 private int progress; private int cameraPosition = 0;//0代表后置摄像头,1代表前置摄像头 private static int isScreenConfigChange = 0;//0 代表竖屏 3代表横屏 private static final int DEFAULT_WIDTH = 1920; private static final int DEFAULT_HEIGHT = 1080; private Point screenResolution; @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // land do nothing is ok Log.i("info", "landscape"); // 横屏 } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { // port do nothing is ok Log.i("info", "portrait"); // 竖屏 } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); initCamera(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_take_pic); ButterKnife.bind(this); this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); takepicture = (Button) findViewById(R.id.takepicture); iv_takeBack = (ImageView) findViewById(R.id.iv_takeBack); surfaceView = (SurfaceView) this .findViewById(R.id.surfaceView); rl_btn = (RelativeLayout) this.findViewById(R.id.buttonLayout); timer = (TextView) this.findViewById(R.id.show_time); // 设置计时器不可见 // timer.setVisibility(View.GONE); // 设置缓存路径 mRecVedioPath = new File(Environment.getExternalStorageDirectory() .getAbsolutePath() + "/hfdatabase/video/temp/"); if (!mRecVedioPath.exists()) { mRecVedioPath.mkdirs();//可以创建指定目录以及所有的父目录 } //圆形进度条设置 circleProgress.setBgColor(getResources().getColor(R.color.text_white)); circleProgress.setProgressColor(getResources().getColor(R.color.colorPrimaryDark)); ViewTreeObserver observerCircle = circleProgress.getViewTreeObserver(); observerCircle.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { progress = circleProgress.getmProgress(); return true; } }); surfaceView.getHolder() .setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surfaceView.getHolder().setFixedSize(176, 144); //设置Surface分辨率 surfaceView.getHolder().setKeepScreenOn(true);// 屏幕常亮 surfaceView.getHolder().addCallback(new SurfaceCallback());//为SurfaceView的句柄添加一个回调函数 //长按录制 takepicture.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { isRecordState = true; if (isRecording) { /* * 点击开始录像 */ if (isPreview) { camera.stopPreview(); camera.release(); camera = null; } second = 0; minute = 0; hour = 0; bool = true; if (mMediaRecorder == null) mMediaRecorder = new MediaRecorder(); else mMediaRecorder.reset(); //拍摄视频时的相机配置 if (camera != null) { freeCameraResource(); } camera = Camera.open(cameraPosition); // CameraConfiguration.setCameraDisplayOrientation(TakePicActivity.this, cameraPosition, camera); int result = CameraConfiguration.getPreviewDegree1(TakePicActivity.this, cameraPosition); camera.setDisplayOrientation(result); camera.startPreview(); camera.unlock(); mMediaRecorder.setCamera(camera); mMediaRecorder.setOnErrorListener(null); mMediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mMediaRecorder.setMaxDuration(60 * 1000); mMediaRecorder.setVideoSize(320, 240); mMediaRecorder.setVideoEncodingBitRate(1 * 1024 * 1024);// 设置帧频率,然后就清晰了 // mMediaRecorder.setVideoFrameRate(15); if (cameraPosition == 1) { if (isScreenConfigChange == 3) { mMediaRecorder.setOrientationHint(90); } else { mMediaRecorder.setOrientationHint(270); } } else if (cameraPosition == 0) { mMediaRecorder.setOrientationHint(90); } // mMediaRecorder.setOrientationHint(90);// 输出旋转90度,保持竖屏录制 try { mRecAudioFile = File.createTempFile("Vedio", ".mp4", mRecVedioPath); } catch (IOException e) { e.printStackTrace(); } mMediaRecorder.setOutputFile(mRecAudioFile.getAbsolutePath()); try { mMediaRecorder.prepare(); timer.setVisibility(View.GONE); handler.postDelayed(task, 1000); mMediaRecorder.start(); } catch (Exception e) { e.printStackTrace(); } showMsg("开始录制"); // scalePic.setBackgroundDrawable(iconStop); isRecording = !isRecording; recordAnimater(); } return true; } }); //返回按钮 iv_takeBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); takepicture.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Logger.t("click——-——————>").d("点击了"); parameters = camera.getParameters(); List<Camera.Size> supportedPictureSizes = parameters.getSupportedPictureSizes(); int index = getPictureSize(supportedPictureSizes); parameters.setPictureSize(supportedPictureSizes.get(index).width, supportedPictureSizes.get(index).height); camera.setParameters(parameters); camera.takePicture(null, null, new MyPictureCallback()); } }); takepicture.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_UP: Log.d(TAG, "onTouch: takepicture==setOnTouchListener==ACTION_UP"); if (isRecordState) { if (second <= 1) { // showMsg("录制时间太短"); Toast.makeText(TakePicActivity.this, "录制时间太短", Toast.LENGTH_SHORT).show(); // animator.cancel(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if (animator.isRunning()) { animator.end(); } // mMediaRecorder.setOnErrorListener(null); // mMediaRecorder.setPreviewDisplay(null); // mMediaRecorder.stop(); // mMediaRecorder.reset(); } else { if (animator.isRunning()) { animator.end(); } } } break; } return false; } }); } protected void onResume() { super.onResume(); timer.setText("点击拍照,长按摄像"); timer.setVisibility(View.VISIBLE); circleProgress.setVisibility(View.GONE); isRecordState = false; } /* * 视频录制时的进度条动画 * */ public void recordAnimater() { //设置进度条 startAnimator(); animator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { Log.i("animator", "stop"); /* * 点击停止 */ try { bool = false; // isRecordState = false; mMediaRecorder.stop(); timer.setText(format(hour) + ":" + format(minute) + ":" + format(second)); mMediaRecorder.release(); mMediaRecorder = null; //录制完成后播放摄像头 videoRename(); } catch (Exception e) { e.printStackTrace(); } isRecording = !isRecording; // scalePic.setBackgroundDrawable(iconStart); showMsg("录制完成,已保存"); // Intent backIntent = new Intent(); // backIntent.putExtra("path", mrv_wx.mVecordFile.getAbsoluteFile().toString()); // setResult(RESULT_OK, backIntent); // finish(); if (second > 1) { freeCameraResource(); Intent displayIntent = new Intent(TakePicActivity.this, ShowPicActivity.class); bundle = new Bundle(); bundle.putBoolean("isRecord", isRecordState); bundle.putString("video_path", out.getAbsolutePath());//视频路径 bundle.putString("video_name", fileName);//视频名 displayIntent.putExtras(bundle); startActivity(displayIntent); // finish(); } if (mMediaRecorder != null) { freeMediaRecorderResource(); } timer.setText("点击拍照,长按摄像"); circleProgress.setVisibility(View.GONE); isRecordState = false; second = 0; } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); } /** * 切换前后摄像头 */ @OnClick(R.id.iv_turn) public void onClick() { //切换前后摄像头 int cameraCount = 0; Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); cameraCount = Camera.getNumberOfCameras();//得到摄像头的个数 for (int i = 0; i < cameraCount; i++) { Camera.getCameraInfo(i, cameraInfo);//得到每一个摄像头的信息 if (cameraPosition == 0) { //现在是后置,变更为前置 if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {//代表摄像头的方位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置 camera.stopPreview();//停掉原来摄像头的预览 camera.release();//释放资源 camera = null;//取消原来摄像头 camera = Camera.open(i);//打开当前选中的摄像头 // camera.setDisplayOrientation(getPreviewDegree1(TakePicActivity.this, cameraPosition)); if (model != null) { if (model.equals("MI 5")) {//针对小米五机型的特殊配置 if (isScreenConfigChange == 3) {//横屏 camera.setDisplayOrientation(0); } else { camera.setDisplayOrientation(270); } } else { camera.setDisplayOrientation(getPreviewDegree1(TakePicActivity.this, cameraPosition)); } } else { camera.setDisplayOrientation(getPreviewDegree1(TakePicActivity.this, cameraPosition)); } try { camera.setPreviewDisplay(surfaceHolder);//通过surfaceview显示取景画面 } catch (IOException e) { e.printStackTrace(); } camera.startPreview();//开始预览 cameraPosition = 1; break; } } else { //现在是前置, 变更为后置 if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {//代表摄像头的方位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置 camera.stopPreview();//停掉原来摄像头的预览 camera.release();//释放资源 camera = null;//取消原来摄像头 camera = Camera.open(i);//打开当前选中的摄像头 camera.setDisplayOrientation(getPreviewDegree1(TakePicActivity.this, cameraPosition)); try { camera.setPreviewDisplay(surfaceHolder);//通过surfaceview显示取景画面 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } camera.startPreview();//开始预览 cameraPosition = 0; break; } } } } @Override public void onPreviewFrame(byte[] data, Camera camera) { } private final class SurfaceCallback implements SurfaceHolder.Callback { @Override public void surfaceCreated(SurfaceHolder holder) { try { if (camera != null) { freeCameraResource(); } camera = Camera.open(); // 打开摄像头 parameters = camera.getParameters(); //加这句小米手机会黑屏 // parameters.setPreviewFrameRate(5); // 每秒5帧 parameters.setPictureFormat(PixelFormat.JPEG);// 设置照片的输出格式 parameters.set("jpeg-quality", 85);// 照片质量 // List<Camera.Size> supportedPictureSizes = parameters.getSupportedPictureSizes(); // int index = getPictureSize(supportedPictureSizes); // parameters.setPreviewSize(supportedPictureSizes.get(index).width, supportedPictureSizes.get(index).height); // int PreviewWidth = 0; // int PreviewHeight = 0; // // 选择合适的预览尺寸 // List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes(); // // 如果sizeList只有一个我们也没有必要做什么了,因为就他一个别无选择 // if (sizeList.size() > 1) { // Iterator<Camera.Size> itor = sizeList.iterator(); // while (itor.hasNext()) { // Camera.Size cur = itor.next(); // if (cur.width >= PreviewWidth // && cur.height >= PreviewHeight) { // PreviewWidth = cur.width; // PreviewHeight = cur.height; // break; // } // } // } // Log.d("size---->", "宽" + PreviewWidth + "高" + PreviewHeight); // parameters.setPreviewSize(PreviewWidth, PreviewHeight); // 获得摄像区域的大小 // parameters.setPictureSize(PreviewWidth, PreviewHeight); // 获得保存图片的大小 camera.setParameters(parameters); camera.setPreviewDisplay(holder); // 设置用于显示拍照影像的SurfaceHolder对象 camera.setDisplayOrientation(getPreviewDegree1(TakePicActivity.this, cameraPosition)); camera.startPreview(); // 开始预览 isPreview = true; // 获得手机的方向 int rotation = TakePicActivity.this.getWindowManager().getDefaultDisplay() .getRotation(); isScreenConfigChange = rotation; // camera.autoFocus(null); } catch (Exception e) { e.printStackTrace(); } surfaceHolder = holder; } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { surfaceHolder = holder; LogUtil.d(TAG, "surfaceChanged======"); camera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { // camera.setOneShotPreviewCallback(null); Camera.Parameters parameters = camera.getParameters(); Camera.Size s = CameraConfiguration.getBestSupportedSize(parameters.getSupportedPreviewSizes(), w, h); initCamera(s.width, s.height); camera.cancelAutoFocus();//只有加上了这一句,才会自动对焦。 } }); } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (camera != null) { if (isPreview) { camera.stopPreview(); isPreview = false; } camera.release(); // 释放照相机 camera = null; } surfaceHolder = null; surfaceView = null; mMediaRecorder = null; } } private static Point findBestPreviewSizeValue(List<Camera.Size> sizeList, Point screenResolution) { int bestX = 0; int bestY = 0; int size = 0; for (int i = 0; i < sizeList.size(); i++) { // 如果有符合的分辨率,则直接返回 if (sizeList.get(i).width == DEFAULT_WIDTH && sizeList.get(i).height == DEFAULT_HEIGHT) { Log.d(TAG, "get default preview size!!!"); return new Point(DEFAULT_WIDTH, DEFAULT_HEIGHT); } int newX = sizeList.get(i).width; int newY = sizeList.get(i).height; int newSize = Math.abs(newX * newX) + Math.abs(newY * newY); float ratio = (float) newY / (float) newX; Log.d(TAG, newX + ":" + newY + ":" + ratio); if (newSize >= size && ratio != 0.75) { // 确保图片是16:9的 bestX = newX; bestY = newY; size = newSize; } else if (newSize < size) { continue; } } if (bestX > 0 && bestY > 0) { return new Point(bestX, bestY); } return null; } static byte[] picData; private final class MyPictureCallback implements Camera.PictureCallback { @Override public void onPictureTaken(byte[] data, Camera camera) { try { bundle = new Bundle(); // bundle.putByteArray("bytes", data);//将图片字节数据保存在bundle中,实现数据交换 picData = data; // saveToSDCard(data); // camera.startPreview();//拍完照后,重新开始预览 if (bundle == null) { Toast.makeText(getApplicationContext(), "请先拍照", Toast.LENGTH_SHORT).show(); } else { Intent intent = new Intent(TakePicActivity.this, ShowPicActivity.class); // intent.setClass(getApplicationContext(), ShowPicActivity.class); bundle.putBoolean("isRecord", isRecordState); bundle.putInt("isPosition", cameraPosition); bundle.putInt("isScreenConfigChange", isScreenConfigChange); intent.putExtras(bundle); startActivity(intent); if (camera != null) { freeCameraResource(); } } } catch (Exception e) { e.printStackTrace(); } } } public void initCamera(int width, int height) { parameters = camera.getParameters(); // 获取各项参数 parameters.setPictureFormat(PixelFormat.JPEG); // 设置图片格式 parameters.setPreviewSize(width, height); // 设置预览大小 // List<Camera.Size> sizes =parameters.getSupportedPreviewSizes(); // Camera.Size optimalSize = getOptimalPreviewSize(sizes, 320,240); // parameters.setPreviewSize(optimalSize.width, optimalSize.height); parameters.setPreviewFrameRate(5); //设置每秒显示4帧 parameters.setPictureSize(width, height); // 设置保存的图片尺寸 parameters.setJpegQuality(80); // 设置照片质量 parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);//1连续对焦 parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); camera.startPreview(); camera.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上 } public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { if (!isRecordState) { camera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { if (success) { Log.d("TakePicActivity", "success"); w = (int) event.getX(); h = (int) event.getY(); // setLayout(rlFocus,w-50,h-50); // Rect focusRect = calculateTapArea(w,h,100); mHandler.obtainMessage(0).sendToTarget(); initCamera(w, h); camera.cancelAutoFocus();//只有加上了这一句,才会自动对焦。 } } }); } } else if (event.getAction() == MotionEvent.ACTION_UP) { Log.d(TAG, "onTouchEvent: ACTION_UP"); } else if (event.getAction() == MotionEvent.ACTION_MOVE) { Log.d(TAG, "onTouchEvent: ACTION_MOVE"); } return super.onTouchEvent(event); } /* * 覆写返回键监听 */ @Override public void onBackPressed() { if (mMediaRecorder != null) { mMediaRecorder.stop(); mMediaRecorder.release(); mMediaRecorder = null; // videoRename(); } finish(); } @Override protected void onPause() { super.onPause(); // onBackPressed(); if (mMediaRecorder != null) { // mMediaRecorder.stop(); mMediaRecorder.release(); mMediaRecorder = null; // videoRename(); } handler.removeCallbacks(task); } View view; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: flContent.invalidate(); view = new MyView(TakePicActivity.this, w, h); // flContent.addView(view); if (flContent.getChildCount() == 3) { flContent.addView(view); mHandler.sendEmptyMessageDelayed(1, 1000);//使选框停留1秒后消失 } break; case 1: flContent.removeView(view); break; } } }; /* * 设置控件所在的位置YY,并且不改变宽高, * XY为绝对位置 */ public void setLayout(View view, int x, int y) { ViewGroup.MarginLayoutParams margin = new ViewGroup.MarginLayoutParams(view.getLayoutParams()); margin.setMargins(x, y, x + margin.width, y + margin.height); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(margin); view.setLayoutParams(layoutParams); } File out; /* * 生成video文件名字 */ protected void videoRename() { String path = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/hfdatabase/video/0/"; fileName = System.currentTimeMillis() + ".mp4"; out = new File(path); if (!out.exists()) { out.mkdirs(); } out = new File(path, fileName); if (mRecAudioFile.exists()) mRecAudioFile.renameTo(out); } /* * 消息提示 */ private Toast toast; public void showMsg(String arg) { if (toast == null) { toast = Toast.makeText(this, arg, Toast.LENGTH_SHORT); } else { toast.cancel(); toast.setText(arg); } toast.show(); } /* * 格式化时间 */ public String format(int i) { String s = i + ""; if (s.length() == 1) { s = "0" + s; } return s; } /* * 定时器设置,实现计时 */ private Handler handler = new Handler(); private Runnable task = new Runnable() { public void run() { if (bool) { if (second >= 60) { minute++; second = second % 60; } if (minute >= 60) { hour++; minute = minute % 60; } timer.setText(format(hour) + ":" + format(minute) + ":" + format(second)); second++; handler.postDelayed(this, 1000); } } }; private void startAnimator() { circleProgress.setVisibility(View.VISIBLE); animator = ObjectAnimator.ofInt(circleProgress, "progress", progress); animator.setDuration(60000); animator.setInterpolator(new LinearInterpolator()); animator.start(); } /** * 释放摄像头资源 */ private void freeCameraResource() { if (camera != null) { camera.setPreviewCallback(null); camera.stopPreview(); camera.lock(); camera.release(); camera = null; } } /** * 释放录像资源 */ private void freeMediaRecorderResource() { if (mMediaRecorder != null) { try { mMediaRecorder.setOnErrorListener(null); mMediaRecorder.setOnInfoListener(null); mMediaRecorder.setPreviewDisplay(null); mMediaRecorder.stop(); } catch (Exception e) { e.printStackTrace(); } mMediaRecorder.release(); mMediaRecorder = null; } } @Override protected void onDestroy() { super.onDestroy(); freeCameraResource(); if (mMediaRecorder != null) { mMediaRecorder.release(); mMediaRecorder = null; } } /** * 切记用intent传递图片 */ public static byte[] getDatea() { byte[] data = picData; return data; } /*获取手机相片的大小*/ private int getPictureSize(List<Camera.Size> sizes) { // 屏幕的宽度 int screenWidth = getResources().getDisplayMetrics().widthPixels; LogUtil.d(TAG, "screenWidth=" + screenWidth); int index = -1; for (int i = 0; i < sizes.size(); i++) { if (screenWidth == sizes.get(i).width) { index = i; } } // 当未找到与手机分辨率相等的数值,取列表中间的分辨率 if (index == -1) { index = sizes.size() / 2; } return index; } /*初始化camera的数据不管什么情况变成后摄像头*/ private void initCamera() { if (camera != null) { camera.stopPreview();//停掉原来摄像头的预览 camera.release();//释放资源 camera = null;//取消原来摄像头 } camera = Camera.open(0);//打开当前选中的摄像头 camera.setDisplayOrientation(getPreviewDegree1(TakePicActivity.this, 0)); try { camera.setPreviewDisplay(surfaceHolder);//通过surfaceview显示取景画面 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } camera.startPreview();//开始预览 cameraPosition = 0; } }
点击展示页的确认按钮,回到留言板界面,发送图片或视频留言:activity_take_pic.xml
视频或相片的展示页<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/fl_content" android:layout_width="match_parent" android:layout_height="match_parent"> <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/iv_takeBack" android:layout_marginTop="16dp" android:layout_marginLeft="@dimen/dp_16" android:src="@drawable/msg_camera_back" android:layout_width="@dimen/dp_22" android:layout_height="@dimen/dp_22" /> <ImageView android:id="@+id/iv_turn" android:src="@drawable/camare_change" android:layout_alignParentRight="true" android:layout_marginTop="16dp" android:layout_marginRight="@dimen/dp_16" android:layout_width="@dimen/dp_22" android:layout_height="@dimen/dp_22" /> </RelativeLayout> <RelativeLayout android:id="@+id/buttonLayout" android:layout_marginBottom="@dimen/dp_20" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/show_time" android:text="点击拍照,长按摄像" android:layout_centerHorizontal="true" android:textColor="@color/white" android:layout_marginBottom="@dimen/dp_10" android:layout_above="@+id/takepicture" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <!-- 拍照按钮 --> <Button android:id="@+id/takepicture" android:layout_width="80dp" android:layout_height="80dp" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true" android:background="@drawable/msg_camera_take" /> <com.haier.uhome.appliance.newVersion.module.messageboard.view.CircleProgressView android:id="@+id/circleProgress" android:visibility="gone" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true" android:layout_width="@dimen/dp_80" android:layout_height="@dimen/dp_80" /> </RelativeLayout> </FrameLayout>ShowPicActivity.java
package com.haier.uhome.appliance.newVersion.module.messageboard; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Environment; import android.provider.Settings; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.KeyEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.WindowManager; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.haier.uhome.activity.mine.MainMessageBoard; import com.haier.uhome.appliance.R; import com.haier.uhome.appliance.newVersion.module.messageboard.util.CameraConfiguration; import com.orhanobut.logger.Logger; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Calendar; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; public class ShowPicActivity extends AppCompatActivity { private final static String ALBUM_PATH = Environment.getExternalStorageDirectory() + "/download_img/"; private static final String TAG = "ShowPicActivity"; String imgName; ImageView iv_play; @BindView(R.id.iv_back2) ImageView ivBack2; @BindView(R.id.iv_confirm) ImageView ivConfirm; @BindView(R.id.tv_repeat) TextView tvRepeat; @BindView(R.id.rl_confirm) RelativeLayout rlConfirm; String videoPath; @BindView(R.id.sfv_display) SurfaceView sfvDisplay; private SurfaceHolder sfh_display2; MediaPlayer player; boolean isRecord = false; private int position; private int isScreenConfigChange; private String videoName; String model = android.os.Build.MODEL;//手机的型号 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_show_pic); ButterKnife.bind(this); iv_play = (ImageView) findViewById(R.id.iv_playPic); Intent intent = getIntent(); Bundle data = intent.getExtras(); if (data.get("isPosition") != null) { position = (int) data.get("isPosition"); } if (data.get("isScreenConfigChange") != null) { isScreenConfigChange = (int) data.get("isScreenConfigChange"); } Logger.t("degree").d("isScreenConfigChange" + isScreenConfigChange); Logger.t("position").d(position + "位置");//0代表后置摄像头,1代表前置摄像头 if (data.getBoolean("isRecord")) { isRecord = true; videoPath = data.getString("video_path"); videoName = data.getString("video_name"); iv_play.setVisibility(View.GONE); sfvDisplay.setVisibility(View.VISIBLE); Log.d(TAG, "videoPath=" + videoPath); showVideo(); } else { int degree = CameraConfiguration.getPreviewDegree1(ShowPicActivity.this,position); Logger.t("degree").d("角度" + degree); android.view.WindowManager manager = (WindowManager) ShowPicActivity.this.getSystemService(Context.WINDOW_SERVICE); int rotation = manager.getDefaultDisplay().getRotation(); Logger.t("degree").d("角度rotation" + rotation); //返回值0表示关闭了重力感应(锁定方向),1表示开启了重力感应(旋转) try { int a = Settings.System.getInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION); } catch (Settings.SettingNotFoundException e) { e.printStackTrace(); } Logger.t("degree").d("返回值0表示关闭了重力感应(锁定方向),1表示开启了重力感应(旋转)" + rotation); isRecord = false; iv_play.setVisibility(View.VISIBLE); sfvDisplay.setVisibility(View.GONE); // setImageBitmap(data.getByteArray("bytes")); Bitmap cameraBitmap; if (position == 1) { if (isScreenConfigChange == 3) { if (model.equals("MI 5")) { cameraBitmap = rotaingImageView(270); } else { cameraBitmap = rotaingImageView(90); } } else { cameraBitmap = rotaingImageView(270); } } else { cameraBitmap = rotaingImageView(90); } imgName = Calendar.getInstance().getTimeInMillis() + ".jpg"; saveFile(cameraBitmap, imgName); iv_play.setScaleType(ImageView.ScaleType.CENTER_CROP); iv_play.setImageBitmap(cameraBitmap); } } /** * 旋转图片 * * @param angle * @param * @return Bitmap */ public Bitmap rotaingImageView(int angle) { Bitmap cameraBitmap = byte2Bitmap(); //旋转图片 动作 Matrix matrix = new Matrix(); matrix.postRotate(angle); if (position == 1) { matrix.postScale(-1, 1);// 镜像水平翻转 } // 创建新的图片 Bitmap resizedBitmap = Bitmap.createBitmap(cameraBitmap, 0, 0, cameraBitmap.getWidth(), cameraBitmap.getHeight(), matrix, true); return resizedBitmap; } /** * 将MainActivity传过来的图片显示在界面当中 * * @param bytes */ public void setImageBitmap(byte[] bytes) { Bitmap cameraBitmap = byte2Bitmap(); // 根据拍摄的方向旋转图像(纵向拍摄时要需要将图像选择90度) Matrix matrix = new Matrix(); matrix.setRotate(CameraConfiguration.getPreviewDegree1(this, position)); cameraBitmap = Bitmap .createBitmap(cameraBitmap, 0, 0, cameraBitmap.getWidth(), cameraBitmap.getHeight(), matrix, true); imgName = Calendar.getInstance().getTimeInMillis() + ".jpg"; saveFile(cameraBitmap, imgName); iv_play.setScaleType(ImageView.ScaleType.CENTER_CROP); iv_play.setImageBitmap(cameraBitmap); } //保存图片到本地 public void saveFile(Bitmap bm, String imgName) { File dirFile = new File(ALBUM_PATH); if (!dirFile.exists()) { dirFile.mkdir(); } File myFile = new File(ALBUM_PATH + imgName); try { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myFile)); bm.compress(Bitmap.CompressFormat.JPEG, 80, bos); bos.flush(); bos.close(); } catch (Exception ex) { ex.printStackTrace(); } } /** * 从Bundle对象中获取数据 * * @return */ public byte[] getImageFormBundle() { // Intent intent = getIntent(); // Bundle data = intent.getExtras(); // byte[] bytes = data.getByteArray("bytes"); byte[] bytes = TakePicActivity.getDatea(); return bytes; } /** * 将字节数组的图形数据转换为Bitmap * * @return */ private Bitmap byte2Bitmap() { byte[] data = getImageFormBundle(); // 将byte数组转换成Bitmap对象 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); return bitmap; } @OnClick({R.id.iv_back2, R.id.iv_confirm, R.id.tv_repeat}) public void onClick(View view) { switch (view.getId()) { case R.id.iv_back2: Intent intent = new Intent(ShowPicActivity.this, TakePicActivity.class); startActivity(intent); finish(); break; case R.id.iv_confirm: Intent i = new Intent(this, MainMessageBoard.class); if (isRecord) { i.putExtra("toMainPath", videoPath);//视频文件路径 i.putExtra("videoname", videoName);//视频文件名 } else { i.putExtra("toMainPath", ALBUM_PATH + imgName); i.putExtra("takephoto", imgName); } i.putExtra("isRecord", isRecord); //要启动的activity已经在当前的任务中,那么在该activity之上的activity都会关闭,并且intent会传递给在栈顶的activity //如果 Activity 已经是运行在 Task 的 top,则该 Activity 将不会再被启动 i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(i); break; case R.id.tv_repeat: Intent intent1 = new Intent(ShowPicActivity.this, TakePicActivity.class); startActivity(intent1); finish(); break; } } //显示并播放录制的视频 public void showVideo() { sfh_display2 = sfvDisplay.getHolder(); sfh_display2.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { player = new MediaPlayer(); player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.setDisplay(sfh_display2); try { player.setDataSource(videoPath); player.prepare(); player.start(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } }); sfh_display2.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { Intent intent = new Intent(ShowPicActivity.this, TakePicActivity.class); startActivity(intent); return false; } return super.onKeyDown(keyCode, event); } }展示页的xml:<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.haier.uhome.appliance.newVersion.module.messageboard.ShowPicActivity"> <ImageView android:id="@+id/iv_back2" android:src="@drawable/msg_camera_back" android:layout_width="22dp" android:layout_height="22dp" /> <ImageView android:layout_above="@+id/rl_confirm" android:id="@+id/iv_playPic" android:layout_marginTop="20dp" android:layout_marginBottom="20dp" android:layout_below="@+id/iv_back2" android:layout_width="match_parent" android:layout_height="match_parent" /> <SurfaceView android:id="@+id/sfv_display" android:visibility="gone" android:layout_marginTop="20dp" android:layout_marginBottom="20dp" android:layout_above="@+id/rl_confirm" android:layout_width="match_parent" android:layout_height="match_parent" /> <RelativeLayout android:id="@+id/rl_confirm" android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/iv_confirm" android:layout_centerHorizontal="true" android:src="@drawable/msg_camera_confirm" android:layout_width="60dp" android:layout_height="60dp" /> <TextView android:id="@+id/tv_repeat" android:text="重新拍照" android:textColor="@color/text_white" android:layout_centerVertical="true" android:layout_alignParentRight="true" android:layout_marginRight="30dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> </RelativeLayout>
//从拍照或视频显示页面返回的处理 protected void onNewIntent(Intent intent) { super.onNewIntent(intent); camerPath = intent.getStringExtra("toMainPath"); Log.d(TAG, "camerPath=" + camerPath); boolean isRecord = intent.getBooleanExtra("isRecord", false); if (!isRecord) { fileName = intent.getStringExtra("takephoto"); msgType = 1; isMsg = 0; insertMsg(); if(!deviceMac.equals("Virtual")){ DialogHelper.showRoundProcessDialog(MainMessageBoard.this,"正在加载中",true); sendFileToAliyun("leaveMsg/" + sdf.format(new Date()) + "/" + fileName, camerPath); } // sendPicMsg(); } else {//视频 videoname = intent.getStringExtra("videoname"); msgType = 3; head_img_name = System.currentTimeMillis() + ".jpg"; MsgUtil.saveFile(MsgUtil.getVideoThumbnail(camerPath), head_img_name); thumbnail = MsgUtil.ALBUM_PATH + head_img_name; isMsg = 1;//0可以用于发送文字,图片 语音 1:用于发送视频缩略图 2:视频文件 insertMsg(); if(!deviceMac.equals("Virtual")){ DialogHelper.showRoundProcessDialog(MainMessageBoard.this,"正在加载中",true); sendFileToAliyun("leaveMsg/" + sdf.format(new Date()) + "/" + head_img_name, thumbnail); } // sendFileToAliyun("leaveMsg/"+sdf.format(new Date())+"/"+videoname,camerPath); // sendVideoMsg(); } }
/** * 上传文件到阿里云 * * @param fileName 文件名 时间戳命名 * @param filaPath 文件路径 */ public void sendFileToAliyun(String fileName, String filaPath) { PutObjectRequest put = new PutObjectRequest(HttpConstant.bucketName, fileName, filaPath); OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(HttpConstant.accessKeyId, HttpConstant.accessKeySecret); OSS oss = new OSSClient(getApplicationContext(), HttpConstant.endpoint, credentialProvider); OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() { @Override public void onSuccess(PutObjectRequest request, PutObjectResult result) { Log.d("PutObject", "UploadSuccess"); if (isMsg == 1) {//0可以用于发送文字,图片 语音 1:用于发送视频缩略图 2:视频文件 handler.sendEmptyMessage(UPLOAD_VIDEO); } else if (isMsg == 2) {//0可以用于发送文字,图片 语音 1:用于发送视频缩略图 2:视频文件 handler.sendEmptyMessage(UPLOAD_VIDEO_FILE); } else if (isMsg == 0) { handler.sendEmptyMessage(UPLOAD_File); } } @Override public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { // 请求异常 if (clientExcepion != null) { // 本地异常如网络异常等 clientExcepion.printStackTrace(); } if (serviceException != null) { // 服务异常 Log.e("ErrorCode", serviceException.getErrorCode()); Log.e("RequestId", serviceException.getRequestId()); } if (msgType == 3) { isMsg = 1; } } }); }