首页 > 代码库 > Android Camera+SurfaceView实现自定义拍照
Android Camera+SurfaceView实现自定义拍照
对Activity强制横屏,保证预览方向正确。使用OrientationEventListener监听设备方向,判断竖拍时,旋转照片后再保存,保证竖拍时预览图片和保存后的图片方向一致。
运行效果:
代码:
TestCameraActivity.java
package com.example.testcamera; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import java.util.UUID; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.hardware.Camera.Size; import android.os.Build; import android.os.Bundle; import android.util.Log; import android.view.OrientationEventListener; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class TestCameraActivity extends Activity implements OnClickListener, SurfaceHolder.Callback { private static final String TAG = "TestCameraActivity"; public static final String KEY_FILENAME = "filename"; private Button mTakePhoto; private SurfaceView mSurfaceView; private Camera mCamera; private String mFileName; private OrientationEventListener mOrEventListener; // 设备方向监听器 private Boolean mCurrentOrientation; // 当前设备方向 横屏false,竖屏true /* 图像数据处理还未完成时的回调函数 */ private Camera.ShutterCallback mShutter = new Camera.ShutterCallback() { @Override public void onShutter() { // 一般显示进度条 } }; /* 图像数据处理完成后的回调函数 */ private Camera.PictureCallback mJpeg = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // 保存图片 mFileName = UUID.randomUUID().toString() + ".jpg"; Log.i(TAG, mFileName); FileOutputStream out = null; try { out = openFileOutput(mFileName, Context.MODE_PRIVATE); byte[] newData = http://www.mamicode.com/null;>
ShowPicture.javapackage com.example.testcamera; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.util.Log; import android.view.Display; import android.widget.ImageView; public class ShowPicture extends Activity { private static final String TAG = "ShowPicture"; private ImageView mPicture; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_show_picture); mPicture = (ImageView) findViewById(R.id.picture); String fileName = getIntent().getStringExtra( TestCameraActivity.KEY_FILENAME); // 图片路径 Log.i(TAG, fileName); String path = getFileStreamPath(fileName).getAbsolutePath(); Display display = getWindowManager().getDefaultDisplay(); // 显示屏尺寸 float destWidth = display.getWidth(); float destHeight = display.getHeight(); // 读取本地图片尺寸 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, options);// 设置为true,options依然对应此图片,但解码器不会为此图片分配内存 float srcWidth = options.outWidth; float srcHeight = options.outHeight; int inSampleSize = 1; if (srcHeight > destHeight || srcWidth > destWidth) { // 当图片长宽大于屏幕长宽时 if (srcWidth > srcHeight) { inSampleSize = Math.round(srcHeight / destHeight); } else { inSampleSize = Math.round(srcWidth / destWidth); } } options = new BitmapFactory.Options(); options.inSampleSize = inSampleSize; Bitmap bitmap = BitmapFactory.decodeFile(path, options); BitmapDrawable bDrawable = new BitmapDrawable(getResources(), bitmap); mPicture.setImageDrawable(bDrawable); } @Override public void onDestroy() { if (!(mPicture.getDrawable() instanceof BitmapDrawable)) return; // 释放bitmap占用的空间 BitmapDrawable b = (BitmapDrawable) mPicture.getDrawable(); b.getBitmap().recycle(); mPicture.setImageDrawable(null); } }源码下载
Android Camera+SurfaceView实现自定义拍照
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。