【问题标题】:Android taking a picture and storing it as a byte arrayAndroid 拍照并将其存储为字节数组
【发布时间】:2011-07-16 22:20:54
【问题描述】:

我在这里有一段简单的代码,但由于某种原因它没有存储数据。我确定这很愚蠢,但我似乎无法弄清楚。任何帮助将不胜感激。

    private byte[] picture;

    public void takePicture(){
    Camera camera = Camera.open();
    Camera.Parameters parameters = camera.getParameters();
    parameters.set("camera-id",2);
            camera.setParameters(parameters);
    parameters.set("gps-timestamp", "1233744883");
    camera.setParameters(parameters);
    Log.i("method", "in takePicture()");
    camera.takePicture(null, rawCallback, null);
    camera.release();
}

    PictureCallback rawCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
    // TODO Do something with the image RAW data.
        Log.i("rawcallback", "in rawcallback");
        picture = data;
    }
};

当我运行代码时,不会调用回调中的日志,“图片”也不会保存“数据”。有什么想法吗?我正在尝试用前置摄像头拍照,我需要一些特别的东西吗?我没有这样做?

我也有这些权限

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />

【问题讨论】:

    标签: android save bytearray android-camera


    【解决方案1】:

    Camera.takePicture()的最后一个参数对应JPEG回调。所以你应该在 camera.setParameters() 调用之前添加parameters.setPictureFormat(PixelFormat.JPEG); 行。或者改用camera.takePicture(null, rawCallback, null);

    您还应该确保在 AndroidManifest.xml 中有以下行:

     <uses-permission android:name="android.permission.CAMERA" />
     <uses-feature android:name="android.hardware.camera" />  
    

    来自我的评论:

    用于访问字体摄像头的API 仅出现在 Android 2.3(API 版本 9)中。在早期版本中,您应该使用供应商特定的技术。看看this working solution 的 Galaxy S:

    Camera.Parameters parameters = mCamera.getParameters();
    parameters.set("camera-id", 2);
    parameters.setPreviewSize(640, 480); // or (800,480) this is supported front camera preview size @ Samsung Galaxy S
    mCamera.setParameters(parameters);
    

    希望对你有所帮助。如果没有,请尝试使用上面的setPreviewSize参数。

    【讨论】:

    • 我改成了 camera.takePicture(null, rawCallback, null);但仍然没有运气。我确实在清单中有这些,我还评论说这是前置摄像头,如果这意味着我需要添加另一个使用功能/权限?
    • 用于访问字体摄像头的API仅出现在Android 2.3中。在早期版本中,您应该使用供应商特定的技术。看看this working solution 的 Galaxy S。我希望它会对你有所帮助。如果不尝试玩parameters.setPreviewSize
    【解决方案2】:

    我在 JPEG 回调中遇到了类似的问题。拍照后并不总是调用它。 这可能是因为您过早释放相机。

    您应该等待所有回调都返回,然后再释放您的相机或退出您的应用程序。 Camera 类不是线程安全的。回调将在事件线程 open(int) 被调用时被调用。 (见doc

    我设法通过使用 setJpegQuality() 函数降低 JPEG 质量来更频繁地调用它,以减少要计算的数据。但更好的方法应该是等到回调返回。

    根据Android code documentation,还需要在拍照前将SurfaceHolder传递给Camera并开始预览。 出于我的目的,我想在用户屏幕上没有任何预览的情况下拍照。 我使用的是本地 SurfaceView,但您可以使用另一个。

    我建议类似:

    Camera.PictureCallback myPictureCallback_jpeg = new Camera.PictureCallback() {
            public void onPictureTaken(byte[] imageData, Camera c) {
                //save your data
            }
        };
    
        SurfaceView mySurfaceView = new SurfaceView(this);
        SurfaceHolder mySurfaceHolder = mySurfaceView.getHolder();
        Camera  myCamera = Camera.open();
    
        try {
            myCamera.setPreviewDisplay(mySurfaceHolder);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Camera.Parameters p = myCamera.getParameters();
        p.setJpegQuality(70);//a value between 1 and 100
        myCamera.setParameters(p);
        myCamera.startPreview();
        myCamera.takePicture(null, null, null, myPictureCallback_jpeg);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        myCamera.release();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多