我已经尝试了一些代码,以了解如何使用摄像头设备。下面的代码可以工作,但是我有一些似乎无法解决的问题。


第一次通话永远无法进行。第一次运行代码时,永远不会调用onPictureTaken回调,因此永远不会写入文件。但是,相机会经历所有其他步骤,包括制造虚假的快门噪音。
我似乎无法将图片大小设置为默认值以外的其他值。如果我尝试将其设置为其他内容,则代码将停止工作。与上面的操作相同,在此过程中摄像机进行了所有动作,但是从不调用onPictureTaken回调。
将图片保存到DCIM文件夹后,除非重新启动手机,否则拍摄的图片不会显示在手机的默认“照片”应用程序中。
是否可以通过代码禁用快门噪声?


抱歉,代码有点混乱,因为它是一个实验。

另外,此代码在BroadcastReceiver中执行

    @Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub


    if(intent.getAction().equals(TAKE_PICTURE_INTENT))
    {


        Toast.makeText(context, "Test", Toast.LENGTH_LONG).show();


                System.out.println("GOT THE INTENT");

                    try
                    {
                        Camera camera = Camera.open();

                        System.out.println("CAMERA OPENED");

                        Parameters params = camera.getParameters();
                        params.set("flash-mode", "off");
                        params.set("focus-mode", "infinity");
                        params.set("jpeg-quality", "100");
                        //params.setPictureSize(2592, 1952);

                        String str = params.get("picture-size" + "-values");
                        System.out.println(str);

                        String size = str.split(",")[0];
                        System.out.println(size);

                        //params.set("picture-size", size);

                        camera.setParameters(params);


                        System.out.println("CAMERA PARAMETERS SET");



                        camera.startPreview();
                        System.out.println("CAMERA PREVIEW STARTED");


                        camera.autoFocus(new AutoFocusCallBackImpl());


                    }
                    catch(Exception ex)
                    {
                        System.out.println("CAMERA FAIL, SKIP");
                        return ;
                    }


    }//if

}//onreceive


private void TakePicture(Camera camera)
{
    camera.takePicture(new Camera.ShutterCallback() {

        @Override
        public void onShutter() {
            // TODO Auto-generated method stub

            System.out.println("CAMERA SHUTTER CALLBACK");
        }
    }
     , null,
        new Camera.PictureCallback() {

                public void onPictureTaken(byte[] imageData, Camera c) {
                    //c.release();

                    System.out.println("CAMERA CALLBACK");

                    FileOutputStream outStream = null;
                    try {

                        System.out.println("Start Callback");
                        File esd = Environment.getExternalStorageDirectory();

                        outStream = new FileOutputStream(esd.getAbsolutePath() + String.format(
                                "/DCIM/%d.jpg", System.currentTimeMillis()));

                        outStream.write(imageData);
                        outStream.close();
                        System.out.println( "onPictureTaken - wrote bytes: " + imageData.length);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();

                          System.out.println("File not found exception");
                    } catch (IOException e) {
                        e.printStackTrace();

                          System.out.println("IO exception");
                    } finally {
                          System.out.println("Finally");
                          c.release();
                    }

                }
            }
         );
    //camera.release();
}//TAKE PICTURE

private class AutoFocusCallBackImpl implements Camera.AutoFocusCallback {
    @Override
    public void onAutoFocus(boolean success, Camera camera) {
        //bIsAutoFocused = success; //update the flag used in onKeyDown()
        System.out.println("Inside autofocus callback. autofocused="+success);
        //play the autofocus sound
        //MediaPlayer.create(CameraActivity.this, R.raw.auto_focus).start();

        if(success)
        {
            System.out.println("AUTO FOCUS SUCCEDED");
        }
        else
        {
            System.out.println("AUTO FOCUS FAILED");
        }

        TakePicture(camera);
        System.out.println("CALLED TAKE PICTURE");

    }
 }//AUTOFOCUSCALLBACK

最佳答案

1.首先将所有摄像机逻辑从BroadCast接收器中取出,并放入单独的Activity中。

2。


  将图片保存到DCIM文件夹后,除非重新启动手机,否则所拍摄的图片不会显示在手机的默认“照片”应用程序中。


因为拍照后需要调用MediaScanner重新扫描图像/更改。当您重新启动电话时,mediascanner会扫描媒体并查找新图像。对于此问题,您应该签出MediaScanner。

3.按照Android Camera TutorialCamera API

-谢谢

09-27 11:03