android7自定义相机预览及拍照功能

android7自定义相机预览及拍照功能

2023年7月7日发(作者:)

android7⾃定义相机预览及拍照功能本⽂实例为⼤家分享了Android实现摄像头切换,拍照及保存到相册,预览等功能,解决android7拍照之后不能连续预览的问题、参数设置相关问题以及前后摄像头语⾔颠倒等问题。import st;

import ty;

import t;

import ;

import eManager;

import ;

import Factory;

import ;

import ormat;

import ;

import ;

import ;

import ;

import nment;

import r;

import tyCompat;

import ;

import nt;

import eHolder;

import eView;

import ;

import Manager;

import ew;

import r.R;

import ;

import tputStream;

import ption;

import ist;

import or;

import ;

public class CamaraActivity extends Activity implements kListener {

@Bind(_back)

TextView returnBack;

@Bind(ch_camera)

TextView tvswitchCamera;

//启动摄像机

private Camera mCamera;

public boolean isopen_camara = false;

private SurfaceView surfaceView;

private SurfaceHolder mholder = null;

private SurfaceCallback previewCallBack;

private boolean isTakingPhoto;//是否正在拍照

@Override

protected void onCreate(Bundle savedInstanceState) {

te(savedInstanceState);

verifyPermission(new String[]{});

// getWindow().setFlags(_FULLSCREEN, _FULLSCREEN);

setContentView(ty_camara);

(this);

// 预览控件

surfaceView = (SurfaceView) this

.findViewById(eView);

// 设置参数

der().setKeepScreenOn(true);

der().setType(E_TYPE_PUSH_BUFFERS);

lickListener(this);

lickListener(this);

ault().register(this);

}

public void verifyPermission(String[] permissions) {

if (permissions != null) {

List lists = new ArrayList<>();

for (int i = 0; i < ; i++) {

if (elfPermission(this, permissions[i]) != SION_GRANTED) {

if (ShowRequestPermissionRationale(this, permissions[i])) {

}

(permissions[i]);

}

}

if (() > 0) {

String[] ps = new String[()];

for (int i = 0; i < (); i++) {

ps[i] = (i);

}

tPermissions(this, ps, 1);

}

}

}

@Override

protected void onRestart() {

art();

}

@Override

protected void onStart() {

t();

}

private void takePhoto() {

if (!isopen_camara) {

previewCallBack = new SurfaceCallback();

der().addCallback(previewCallBack);

} else {

autoTakePhoto();

}

}

@Override

protected void onResume() {

me();

if(mCamera == null){

if (!isopen_camara) {

previewCallBack = new SurfaceCallback();

der().addCallback(previewCallBack);

}

}

}

@Override

public void onClick(View v) {

switch (()) {

case _back:

finish();

break;

case ch_camera:

switchCamara();

break;

}

}

// 预览界⾯回调

private final class SurfaceCallback implements ck {

// 预览界⾯被创建

public void surfaceCreated(SurfaceHolder holder) {

try {

//1代表打开后置摄像头,0代表打开前置摄像头.

mCamera = (cameraPosition);// 打开摄像头

setParams(holder,cameraPosition);

} catch (Exception e) {

tackTrace();

if (mCamera != null) {

eview();

();

e();

mCamera = null;

}

finish();

//xt(getApplicationContext(), "该⼿机不⽀持⾃动拍照功能", _LONG).show();

}

}

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

n("surfaceChanged"); isopen_camara = true;

//autoTakePhoto();

}

// 预览界⾯被销毁

public void surfaceDestroyed(SurfaceHolder holder) {

n("surfaceDestroyed");

if(!isopen_camara)

return;

if (mCamera != null) {

Callback(this);

viewCallback(null);

eview();

();

e();

mCamera = null;

}

}

}

public void reset(){

Info cameraInfo = new Info();

if (mCamera != null) {

if(surfaceView != null && der() != null && previewCallBack != null){

der().removeCallback(previewCallBack);

}

viewCallback(null);

eview();

();

e();

mCamera = null;

mCamera = (cameraPosition);

if (null != mholder)

setParams(mholder,);

}

}

@Override

protected void onDestroy() {

roy();

if (mCamera != null) {

if(surfaceView != null && der() != null && previewCallBack != null){

der().removeCallback(previewCallBack);

}

viewCallback(null);

eview();

();

e();

mCamera = null;

}

(this);

ault().unregister(this);

}

private void setParams(SurfaceHolder mySurfaceView,int postion) {

try {

int PreviewWidth = 0;

int PreviewHeight = 0;

WindowManager wm = (WindowManager) getSystemService(_SERVICE);//获取窗⼝的管理器

/*PreviewWidth = display.();

PreviewHeight = ght();*/

ters parameters = ameters();

// 选择合适的预览尺⼨

List<> sizeList = portedPreviewSizes();

// 如果sizeList只有⼀个我们也没有必要做什么了,因为就他⼀个别⽆选择

if (() > 1) {

Iterator<> itor = or();

while (t()) {

cur = ();

/*if ( >= PreviewWidth

&& >= PreviewHeight) {*/

if ( >= PreviewWidth

&& >= PreviewHeight) {

PreviewWidth = ;

PreviewHeight = ;

break;

}

}

}

viewSize(PreviewWidth, PreviewHeight); //获得摄像区域的⼤⼩

//viewFrameRate(3);//每秒3帧 每秒从摄像头⾥⾯获得3个画⾯

//viewFpsRange(3,);

List list = portedPreviewFpsRange();

int[] v = null;

int index = 0;

int min = 0;

for (int i = 0; i < (); i++) {

v = (i);

if (v[0] > min) {

min = v[0];

index = i;

}

}

viewFpsRange((index)[0], (index)[1]);

tureFormat();//设置照⽚输出的格式

("jpeg-quality", 85);//设置照⽚质量

tureSize(PreviewWidth, PreviewHeight);//设置拍出来的屏幕⼤⼩

ation(180); //Java部分

if (_INT >= 24) {

if(postion == 0){

playOrientation(90);

}else {

playOrientation(270);

}

} else {

playOrientation(90);

}

ameters(parameters);//把上⾯的设置 赋给摄像头

viewDisplay(mySurfaceView);//把摄像头获得画⾯显⽰在SurfaceView控件⾥⾯

mholder = mySurfaceView;

viewCallback(new wCallback() {

@Override

public void onPreviewFrame(byte[] data, Camera camera) {

}

});

review();//开始预览

// mPreviewRunning = true;

} catch (IOException e) {

Log.e("tag", ng());

}

}

Handler handler = null;

private void autoTakePhoto() {

// 拍照前需要对焦 获取清析的图⽚

if (null == mCamera) return;

cus(new cusCallback() {

@Override

public void onAutoFocus(boolean success, Camera camera) {

if (success && isopen_camara) {

// 对焦成功

// xt(, "对焦成功 !!",_SHORT).show();

if(!isTakingPhoto) {

isTakingPhoto = true;

handler = new Handler();

(new Runnable() {

@Override

public void run() {

cture(null, null, new MyPictureCallback());

}

});

}

}

}

});

}

// 照⽚回调

private final class MyPictureCallback implements eCallback {

// 照⽚⽣成后

@Override

public void onPictureTaken(byte[] data, Camera camera) {

try {

Bitmap bitmap = ByteArray(data, 0, ); Matrix matrix = new Matrix();

ate(270);

File jpgFile = new File(ernalStorageDirectory() + "/DCIM/camera");

if (!()) {

();

}

File jpgFile1 = new File(oluteFile(), tTimeMillis() + ".jpg");

bitmap = Bitmap(bitmap, 0, 0, th(), ght(), matrix, true);

FileOutputStream fos = new FileOutputStream(jpgFile1);

ss(, 80, fos);

(getApplicationContext(), getString(_success));

();

Intent intent = new Intent(_MEDIA_SCANNER_SCAN_FILE);

Uri uri = le(jpgFile1);

a(uri);

sendBroadcast(intent);

} catch (Exception e) {

tackTrace();

}finally {

if(_INT>=24){

reset();

}

isTakingPhoto = false;

}

}

}

private int cameraPosition = 1;//0代表前置摄像头,1代表后置摄像头

private void switchCamara() {

//切换前后摄像头

int cameraCount = 0;

Info cameraInfo = new Info();

cameraCount = berOfCameras();//得到摄像头的个数

for (int i = 0; i < cameraCount; i++) {

eraInfo(i, cameraInfo);//得到每⼀个摄像头的信息

if (cameraPosition == 1) {

//现在是后置,变更为前置

if ( == _FACING_BACK) {//代表摄像头的⽅位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置

if(surfaceView != null && der() != null && previewCallBack != null){

der().removeCallback(previewCallBack);

}

viewCallback(null);

eview();//停掉原来摄像头的预览

();

e();//释放资源

mCamera = null;//取消原来摄像头

mCamera = (i);//打开当前选中的摄像头

/* try {

if (null != mholder)

viewDisplay(mholder);//通过surfaceview显⽰取景画⾯

} catch (IOException e) {

// TODO Auto-generated catch block

tackTrace();

}

review();//开始预览*/

if (null != mholder)

setParams(mholder,_FACING_BACK);

cameraPosition = 0;

break;

}

} else {

//现在是前置, 变更为后置

if ( == _FACING_FRONT) {//代表摄像头的⽅位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置

if(surfaceView != null && der() != null && previewCallBack != null){

der().removeCallback(previewCallBack);

}

viewCallback(null);

eview();//停掉原来摄像头的预览

();

e();//释放资源

mCamera = null;//取消原来摄像头

mCamera = (i);//打开当前选中的摄像头

/*try {

if (null != mholder)

viewDisplay(mholder);//通过surfaceview显⽰取景画⾯

} catch (IOException e) {

// TODO Auto-generated catch block

tackTrace();

}

review();//开始预览*/ if (null != mholder)

setParams(mholder,_FACING_FRONT);

cameraPosition = 1;

break;

}

}

}

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == E_VOLUME_DOWN) {///⾳量减拍照

takePhoto();

return true;

}

return own(keyCode, event);

}

}

以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

发布者:admin,转转请注明出处:http://www.yc00.com/news/1688678093a161799.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信