用Android编程拍摄多张照片?

用Android编程拍摄多张照片?,android,android-camera,Android,Android Camera,我需要使用不带预览的相机并拍摄多张照片 我已经写了我的代码,我能够采取一个镜头,它工作正常 但我只能做一次。因为相机服务的逻辑,我尝试了CreateCameraTakeShot方法,仍然没有成功 你能帮我一下吗 这是我的密码 public class ContinuingCallActivity extends Activity implements SurfaceHolder.Callback{ Camera camera; SurfaceView surfaceView; SurfaceH

我需要使用不带预览的相机并拍摄多张照片

我已经写了我的代码,我能够采取一个镜头,它工作正常

但我只能做一次。因为相机服务的逻辑,我尝试了CreateCameraTakeShot方法,仍然没有成功

你能帮我一下吗

这是我的密码

public class ContinuingCallActivity extends Activity implements SurfaceHolder.Callback{

Camera camera;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
    FileOutputStream outStream;


  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_continuingcall);

      //getWindow().setFormat(PixelFormat.UNKNOWN);
      surfaceView = (SurfaceView)findViewById(R.id.surfaceView1);
      surfaceHolder = surfaceView.getHolder();
      surfaceHolder.addCallback(this);
      surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


      //    for(int i=0;i<10;i++)
        //{
            mHandler.postDelayed(mLaunchTask, 1000);
        //}
}

  Handler mHandler = new Handler();


    private Runnable mLaunchTask = new Runnable() {
        @Override
        public void run() {


            camera.takePicture(null,myPictureCallback_RAW, myPictureCallback_JPG);
            //createCameraTakeShot();


        }
     };


  ShutterCallback myShutterCallback = new ShutterCallback(){

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

 }};

PictureCallback myPictureCallback_RAW = new PictureCallback(){

 @Override
 public void onPictureTaken(byte[] arg0, Camera arg1) {
  // TODO Auto-generated method stub

 }};

PictureCallback myPictureCallback_JPG = new PictureCallback(){

 @Override
 public void onPictureTaken(byte[] arg0, Camera arg1) {
  // TODO Auto-generated method stub
  Bitmap bitmapPicture
   = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);

  ByteArrayOutputStream bytes = new ByteArrayOutputStream();
  bitmapPicture.compress(Bitmap.CompressFormat.JPEG, 40, bytes);

final String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/MySight/"; 
  File newdir = new File(dir); 
  newdir.mkdirs();

Date d = new Date();
  CharSequence dateOfShot  = DateFormat.format("dd-MM-yy hh:mm:ss", d.getTime());

  String file = dir+dateOfShot+".jpg";
  File newfile = new File(file);

try {
        newfile.createNewFile();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

 try {
     outStream = new FileOutputStream(newfile);
     outStream.write(bytes.toByteArray());
     outStream.close();
     Log.d("Log", "onPictureTaken - wrote bytes: " + arg0.length);
 } catch (FileNotFoundException e) {
     e.printStackTrace();
 } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

 }};


public void createCameraTakeShot()
{
camera = Camera.open();

if (camera != null)
{
      try {
       camera.setPreviewDisplay(surfaceHolder);
       camera.startPreview();
       previewing = true;
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
}

camera.takePicture(null,myPictureCallback_RAW, myPictureCallback_JPG);

camera.stopPreview();


}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
  int height) {
 // TODO Auto-generated method stub

if(previewing){
  camera.stopPreview();
  previewing = false;
 }

 if (camera != null){
  try {
   camera.setPreviewDisplay(surfaceHolder);
   camera.startPreview();
   previewing = true;
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
 // TODO Auto-generated method stub
 camera = Camera.open();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
 // TODO Auto-generated method stub

camera.stopPreview();
 //camera.release();
 //camera = null;
 previewing = false;
}
} 
公共类ContinuingCallActivity扩展活动实现SurfaceHolder.Callback{
摄像机;
表面视图表面视图;
浮雕浮雕;
FileOutputStream扩展流;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u continuingcall);
//getWindow().setFormat(PixelFormat.UNKNOWN);
surfaceView=(surfaceView)findViewById(R.id.surfaceView W1);
surfaceHolder=surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(surfaceHolder.SURFACE\u TYPE\u PUSH\u缓冲区);

//对于(inti=0;i,您可以使用计时器任务代替处理程序进行生产性拍照

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       surfaceView = (SurfaceView)findViewById(R.id.surfaceView1);
       surfaceHolder = surfaceView.getHolder();
       surfaceHolder.addCallback(this);
       surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        MyTimerTask myTask = new MyTimerTask();
        Timer myTimer = new Timer();

        myTimer.schedule(myTask, 1000, 1000);        

}

class MyTimerTask extends TimerTask {
      public void run() {
          // ERROR
        camera.takePicture(null,myPictureCallback_RAW, myPictureCallback_JPG);
      }
    }



ShutterCallback myShutterCallback = new ShutterCallback(){

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

 }};

PictureCallback myPictureCallback_RAW = new PictureCallback(){

 @Override
 public void onPictureTaken(byte[] arg0, Camera arg1) {
  // TODO Auto-generated method stub

 }};

PictureCallback myPictureCallback_JPG = new PictureCallback(){

 @Override
 public void onPictureTaken(byte[] arg0, Camera arg1) {
  // TODO Auto-generated method stub
  Bitmap bitmapPicture
   = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);

  ByteArrayOutputStream bytes = new ByteArrayOutputStream();
  bitmapPicture.compress(Bitmap.CompressFormat.JPEG, 40, bytes);

final String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/MySight/"; 
  File newdir = new File(dir); 
  newdir.mkdirs();

Date d = new Date();
  CharSequence dateOfShot  = DateFormat.format("dd-MM-yy hh:mm:ss", d.getTime());

  String file = dir+dateOfShot+".jpg";
  File newfile = new File(file);

try {
        newfile.createNewFile();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

 try {
     outStream = new FileOutputStream(newfile);
     outStream.write(bytes.toByteArray());
     outStream.close();
     Log.d("Log", "onPictureTaken - wrote bytes: " + arg0.length);
 } catch (FileNotFoundException e) {
     e.printStackTrace();
 } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

 }};


public void createCameraTakeShot()
{
camera = Camera.open();

if (camera != null)
{
      try {
       camera.setPreviewDisplay(surfaceHolder);
       camera.startPreview();
       previewing = true;
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
}

camera.takePicture(null,myPictureCallback_RAW, myPictureCallback_JPG);


}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
  int height) {
 // TODO Auto-generated method stub

if(previewing){
  camera.stopPreview();
  previewing = false;
 }

 if (camera != null){
  try {
   camera.setPreviewDisplay(surfaceHolder);
   camera.startPreview();
   previewing = true;
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
 // TODO Auto-generated method stub
 camera = Camera.open();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
 // TODO Auto-generated method stub

camera.stopPreview();
 //camera.release();
 //camera = null;
 previewing = false;
}
} 

您可以使用计时器任务代替处理程序来大量拍照

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       surfaceView = (SurfaceView)findViewById(R.id.surfaceView1);
       surfaceHolder = surfaceView.getHolder();
       surfaceHolder.addCallback(this);
       surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        MyTimerTask myTask = new MyTimerTask();
        Timer myTimer = new Timer();

        myTimer.schedule(myTask, 1000, 1000);        

}

class MyTimerTask extends TimerTask {
      public void run() {
          // ERROR
        camera.takePicture(null,myPictureCallback_RAW, myPictureCallback_JPG);
      }
    }



ShutterCallback myShutterCallback = new ShutterCallback(){

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

 }};

PictureCallback myPictureCallback_RAW = new PictureCallback(){

 @Override
 public void onPictureTaken(byte[] arg0, Camera arg1) {
  // TODO Auto-generated method stub

 }};

PictureCallback myPictureCallback_JPG = new PictureCallback(){

 @Override
 public void onPictureTaken(byte[] arg0, Camera arg1) {
  // TODO Auto-generated method stub
  Bitmap bitmapPicture
   = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);

  ByteArrayOutputStream bytes = new ByteArrayOutputStream();
  bitmapPicture.compress(Bitmap.CompressFormat.JPEG, 40, bytes);

final String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/MySight/"; 
  File newdir = new File(dir); 
  newdir.mkdirs();

Date d = new Date();
  CharSequence dateOfShot  = DateFormat.format("dd-MM-yy hh:mm:ss", d.getTime());

  String file = dir+dateOfShot+".jpg";
  File newfile = new File(file);

try {
        newfile.createNewFile();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

 try {
     outStream = new FileOutputStream(newfile);
     outStream.write(bytes.toByteArray());
     outStream.close();
     Log.d("Log", "onPictureTaken - wrote bytes: " + arg0.length);
 } catch (FileNotFoundException e) {
     e.printStackTrace();
 } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

 }};


public void createCameraTakeShot()
{
camera = Camera.open();

if (camera != null)
{
      try {
       camera.setPreviewDisplay(surfaceHolder);
       camera.startPreview();
       previewing = true;
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
}

camera.takePicture(null,myPictureCallback_RAW, myPictureCallback_JPG);


}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
  int height) {
 // TODO Auto-generated method stub

if(previewing){
  camera.stopPreview();
  previewing = false;
 }

 if (camera != null){
  try {
   camera.setPreviewDisplay(surfaceHolder);
   camera.startPreview();
   previewing = true;
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
 // TODO Auto-generated method stub
 camera = Camera.open();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
 // TODO Auto-generated method stub

camera.stopPreview();
 //camera.release();
 //camera = null;
 previewing = false;
}
} 

我尝试过但仍然是相同的例外我正在拍摄11-03 11:32:15.476:E/AndroidRuntime(7728):java.lang.RuntimeException:takePicture失败我编辑了我的答案请参见更改。我删除了camera.StopReview();现在尝试确保您已授予在anroidmanifiest中使用camera的所有权限。xml11-03 12:01:42.531:E/CameraService(2486):CameraService::在锁定之前连接(pid 11055,组织id 0)11-03 12:01:42.541:E/AndroidRuntime(11055):致命异常:Timer-0 11-03 12:01:42.541:E/AndroidRuntime(11055):java.lang.RuntimeException:无法连接到相机服务我尝试了,但仍然是相同的异常我正在处理11-03 11:32:15.476:E/AndroidRuntime(7728):java.lang.RuntimeException:takePicture Failed我编辑了我的答案见更改。我删除了camera.StopReview();现在请尝试确保您已授予在anroidmanifiest.xml11-03 12:01:42.531:E/CameraService(2486):CameraService::锁定前连接(pid 11055,组织id 0)11-03 12:01:42.541:E/AndroidRuntime(11055):致命异常:Timer-0 11-03 12:01:42.541:E/AndroidRuntime(11055):java.lang.RuntimeException:无法连接到相机服务