2010-12-03 83 views
1

我有一些代码,我一直在试验看看我可以用相机设备做什么。下面的代码有效,但我有一些问题,我似乎无法解决。Android相机故障

  1. 第一个调用从不起作用。第一次运行代码时,onPictureTaken回调从不被调用,所以文件从不写入。然而,相机会经历所有其他步骤,包括制作假快门噪音。

  2. 我似乎无法将图片大小设置为其他默认值以外的值。如果我尝试将其设置为其他内容,代码将停止工作。与上述相同,相机经历所有动作,但onPictureTaken回调不会被调用。

  3. 当图像被保存到DCIM文件夹时,拍摄的照片没有在默认的“照片”应用程序出现在我的手机上,除非我重启手机。

  4. 有没有办法通过代码可关闭快门声音?

对不起,代码有点混乱,因为它的一个实验。

此外,该代码在所有的一个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

1.首先执行把所有相机逻辑移出广播接收机&的放入seprate活动。

2.

当图像被保存到DCIM文件夹时,拍摄的照片没有在默认的“照片”应用程序出现在我的手机上,除非我重启手机。

因为需要调用MediaScanner来重新扫描一次拍摄照片后的图像/更改。当您重新启动手机mediascanner扫描媒体&发现新的图像。因此,您应该查看MediaScanner。

3.Follow Android相机Tutorial & Camera API

-Thanks

+0

我明白你的意思有关媒体扫描仪是什么,我不知道,就存在。它在广播接收机中的原因是我希望能够创建一些可以在需要时通过代码获取图像的东西。我真的不希望那里有涉及的活动。 – Kratz 2010-12-03 06:08:40