当前位置: » 做app » 正文

app开发中如何调动相机拍照? – 智电网络-威尼斯人888

在应用程序开发中,调用相机进行拍照是一个常见的需求。本文将详细介绍如何在app开发中调用相机拍照的原理和步骤。

在android开发中,使用相机进行拍照可以通过调用camera类来实现。首先,需要在androidmanifest.xml文件中添加相机权限:

“`

“`

接下来,在布局文件中添加一个用于显示相机预览的surfaceview组件:

“`

android:id=”@ id/surfaceview”

android:layout_width=”match_parent”

android:layout_height=”match_parent” />

“`

然后,在activity中获取surfaceview组件,并在合适的时机初始化相机:

“`java

private surfaceview msurfaceview;

private camera mcamera;

@override

protected void oncreate(bundle savedinstancestate) {

super.oncreate(savedinstancestate);

setcontentview(r.layout.activity_main);

msurfaceview = (surfaceview) findviewbyid(r.id.surfaceview);

msurfaceview.getholder().addcallback(msurfaceholdercallback);

}

private surfaceholder.callback msurfaceholdercallback = new surfaceholder.callback() {

@override

public void surfacecreated(surfaceholder holder) {

// 初始化相机

mcamera = camera.open();

try {

mcamera.setpreviewdisplay(holder);

} catch (ioexception e) {

e.printstacktrace();

}

}

@override

public void surfacechanged(surfaceholder holder, int format, int width, int height) {

// 调整相机预览大小

camera.parameters parameters = mcamera.getparameters();

list supportedsizes = parameters.getsupportedpreviewsizes();

camera.size optimalsize = getoptimalpreviewsize(supportedsizes, width, height);

parameters.setpreviewsize(optimalsize.width, optimalsize.height);

mcamera.setparameters(parameters);

// 开始相机预览

mcamera.startpreview();

}

@override

public void surfacedestroyed(surfaceholder holder) {

// 释放相机资源

mcamera.stoppreview();

mcamera.release();

mcamera = null;

}

};

private camera.size getoptimalpreviewsize(list sizes, int width, int height) {

final double aspect_tolerance = 0.1;

double targetratio = (double) width / height;

camera.size optimalsize = null;

double mindiff = double.max_value;

for (camera.size size : sizes) {

double ratio = (double) size.width / size.height;

if (math.abs(ratio – targetratio) > aspect_tolerance) continue;

if (math.abs(size.height – height)

optimalsize = size;

mindiff = math.abs(size.height – height);

}

}

if (optimalsize == null) {

mindiff = double.max_value;

for (camera.size size : sizes) {

if (math.abs(size.height – height)

optimalsize = size;

mindiff = math.abs(size.height – height);

}

}

}

return optimalsize;

}

“`

以上代码中,msurfaceholdercallback是surfaceholder.callback的一个实现,用于监听surfaceview的状态变化。在surfacecreated方法中,我们打开相机并将预览显示在surfaceview上;在surfacechanged方法中,调整相机预览的大小,并开始相机预览;在surfacedestroyed方法中,释放相机资源。

接下来,我们可以添加一个按钮,用于触发拍照事件:

“`java

button mcapturebutton = (button) findviewbyid(r.id.capturebutton);

mcapturebutton.setonclicklistener(new view.onclicklistener() {

@override

public void onclick(view v) {

mcamera.takepicture(null, null, mpicturecallback);

}

});

“`

在mcapturebutton的点击事件中,调用mcamera.takepicture方法进行拍照。mpicturecallback是camera.picturecallback的一个实现,用于处理拍照结果:

“`java

private camera.picturecallback mpicturecallback = new camera.picturecallback() {

@override

public void onpicturetaken(byte[] data, camera camera) {

// 处理拍照结果

bitmap bitmap = bitmapfactory.decodebytearray(data, 0, data.length);

// 保存图片到本地

string filepath = environment.getexternalstoragedirectory().getpath() “/image.jpg”;

try {

fileoutputstream fos = new fileoutputstream(filepath);

bitmap.compress(bitmap.compressformat.jpeg, 100, fos);

fos.close();

} catch (ioexception e) {

e.printstacktrace();

}

// 重新开始相机预览

mcamera.startpreview();

}

};

“`

在mpicturecallback的onpicturetaken方法中,我们可以将拍照结果转换为bitmap对象,并保存到本地。最后,重新开始相机预览。

至此,我们已经完成了在app开发中调用相机拍照的步骤。通过上述代码,我们可以实现一个简单的相机应用,用户点击按钮即可拍照并保存到本地。当然,为了更好的用户体验,我们还可以添加相机预览的自定义界面、拍照参数的设置等功能,这需要根据具体需求进行扩展。希望本文对您理解相机拍照的原理和步骤有所帮助。

未经允许不得转载:https://www.zhidianwl.com/ » app开发中如何调动相机拍照?

相关推荐

推荐栏目

网站地图