java– 你如何获得一个适用于Android的简单相机程序?

java– 你如何获得一个适用于Android的简单相机程序?,第1张

概述我刚刚开始用Java编程,我需要一个简单的应用程序,它可以显示相机,拍照并在某处发送图片数据.我一直在网上搜索试图找到一个按预期工作的好的相机教程,但显然它们都需要一些我还没有的内在知识.在this页面上,commonsWare指向代码中有一些示例代码用于使用相机.我已经使用PictureDe

我刚刚开始用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的简单相机程序?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1114165.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存