我刚刚开始用Java编程,我需要一个简单的应用程序,它可以显示相机,拍照并在某处发送图片数据.
我一直在网上搜索试图找到一个按预期工作的好的相机教程,但显然它们都需要一些我还没有的内在知识.
在this页面上,commonsWare指向代码中有一些示例代码用于使用相机.我已经使用PictureDemo代码并使其运行没有错误.但是,它只会出现黑屏.我认为这是因为程序实际上并没有在主函数中激活预览或相机,但每次我尝试添加我认为需要的代码时,我都会遇到异常.
所以我的问题是,我需要在主要功能中添加什么来让相机运行?或者是否有一个更好的教程,我可以看到简单的基本代码来获取相机?
package assist.core;import androID.app.Activity;import androID.graphics.PixelFormat;import androID.harDWare.Camera;import androID.os.AsyncTask;import androID.os.Bundle;import androID.os.Environment;import androID.util.Log;import androID.vIEw.KeyEvent;import androID.vIEw.SurfaceHolder;import androID.vIEw.SurfaceVIEw;import androID.Widget.Toast;import java.io.file;import java.io.fileOutputStream;import java.io.IOException;import java.util.logging.Level;import java.util.logging.Logger;public class MainActivity extends Activity{ private SurfaceVIEw prevIEw = null; private SurfaceHolder prevIEwHolder = null; private Camera camera = null; private boolean inPrevIEw = false; /** * */ @OverrIDe public voID onCreate(Bundle savedInstanceState) { //Call the parent class super.onCreate(savedInstanceState); setContentVIEw(R.layout.main); prevIEw = (SurfaceVIEw) findVIEwByID(R.ID.prevIEw); prevIEwHolder = prevIEw.getHolder(); prevIEwHolder.addCallback(surfaceCallback); prevIEwHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @OverrIDe public voID onResume() { super.onResume(); //Get the camera instance camera = CameraFinder.INSTANCE.open(); } @OverrIDe public voID onPause() { if (inPrevIEw) { camera.stopPrevIEw(); } camera.release(); camera = null; inPrevIEw = false; super.onPause(); } @OverrIDe public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_CAMERA || keyCode == KeyEvent.KEYCODE_SEARCH) { if (inPrevIEw) { camera.takePicture(null, null, photoCallback); inPrevIEw = false; } return(true); } return(super.onKeyDown(keyCode, event)); } private Camera.Size getBestPrevIEwSize(int wIDth, int height, Camera.Parameters parameters) { Camera.Size result = null; for (Camera.Size size : parameters.getSupportedPrevIEwSizes()) { if (size.wIDth <= wIDth && size.height <= height) { if (result == null) { result=size; } else { int resultArea = result.wIDth * result.height; int newArea = size.wIDth * size.height; if (newArea > resultArea) { result = size; } } } } return(result); } SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() { public voID surfaceCreated(SurfaceHolder holder) { try { camera.setPrevIEwdisplay(prevIEwHolder); } catch (Throwable t) { Log.e("MainActivity-surfaceCallback", "Exception in setPrevIEwdisplay()", t); Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_LONG).show(); } } public voID surfaceChanged(SurfaceHolder holder, int format, int wIDth, int height) { Camera.Parameters parameters = camera.getParameters(); Camera.Size size = getBestPrevIEwSize(wIDth, height, parameters); if (size != null) { parameters.setPrevIEwSize(size.wIDth, size.height); parameters.setPictureFormat(PixelFormat.JPEG); camera.setParameters(parameters); camera.startPrevIEw(); inPrevIEw = true; } } public voID surfaceDestroyed(SurfaceHolder holder) { // no-op } }; Camera.PictureCallback photoCallback = new Camera.PictureCallback() { public voID onPictureTaken(byte[] data, Camera camera) { new SavePhotoTask().execute(data); camera.startPrevIEw(); inPrevIEw = true; } }; class SavePhotoTask extends AsyncTask<byte[], String, String> { @OverrIDe protected String doInBackground(byte[]... jpeg) { file photo = new file(Environment.getExternalStorageDirectory(), "photo.jpg"); if(photo.exists()) { photo.delete(); } try { fileOutputStream fos = new fileOutputStream(photo.getPath()); fos.write(jpeg[0]); fos.close(); } catch (java.io.IOException e) { Log.e("MainActivity", "Exception in photoCallback", e); } return(null); } }}
更新
至于我得到的例外情况,如果我尝试制作主函数,如下面的代码,
public voID onCreate(Bundle savedInstanceState){ //Call the parent class super.onCreate(savedInstanceState); setContentVIEw(R.layout.main); prevIEw = (SurfaceVIEw) findVIEwByID(R.ID.prevIEw); prevIEwHolder = prevIEw.getHolder(); prevIEwHolder.addCallback(surfaceCallback); prevIEwHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); Camera.Parameters parameters = camera.getParameters(); parameters.setPictureFormat(PixelFormat.JPEG); camera.setParameters(parameters); try { //Start the camera prevIEw display camera.setPrevIEwdisplay(prevIEwHolder); camera.startPrevIEw(); } catch (IOException ex) { Logger.getLogger(MainActivity.class.getname()).log(Level.SEVERE, null, ex); }}
我得到“应用程序意外停止.请再试一次.”我基本上试图遵循android documention规定的步骤.我还尝试在检索到相机对象后将此代码放入onResume函数,然后调用this.onResume.
解决方法:
如果你需要的只是打开相机,拍照,并获得图像.
然后你可以这样做:
launch Camera using Intents
您的上述代码是集成版本.这将相机集成到您的应用程序中.
我不确定你是否有真正的AndroID设备进行测试.
更换真实相机时,模拟器将显示黑色或“androID图标”屏幕.
如果不是,请在真实设备上进行测试.
您是否可以更明确地指出您获得的例外情况?
总结以上是内存溢出为你收集整理的java – 你如何获得一个适用于Android的简单相机程序?全部内容,希望文章能够帮你解决java – 你如何获得一个适用于Android的简单相机程序?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)