我已经尝试了一些代码,以了解如何使用摄像头设备。下面的代码可以工作,但是我有一些似乎无法解决的问题。
第一次通话永远无法进行。第一次运行代码时,永远不会调用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 Tutorial&Camera API
-谢谢