Android:无需用户界面拍照
我有兴趣为Android编写一个应用程序,在应用程序中的某个事件之后,使用android上的相机自动拍摄照片。
我需要的东西:
没有预览照片
用户无按钮拍照
只需运行该操作即可拍摄照片并将其存储到相册中。
这里是我从网上的一个教程尝试的一些代码:
public void snap(){
       mCamera = Camera.open();
       SurfaceView sv = new SurfaceView(getApplicationContext());
       try {
                  mCamera.setPreviewDisplay(sv.getHolder());
                  parameters = mCamera.getParameters();
                   //set camera parameters
                 mCamera.setParameters(parameters);
                 mCamera.startPreview();
                 mCamera.takePicture(null, null, mCall);
            } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }
       //Get a surface
         sHolder = sv.getHolder();
}
 Camera.PictureCallback mCall = new Camera.PictureCallback()
    {
       public void onPictureTaken(byte[] data, Camera camera)
       {
             //decode the data obtained by the camera into a Bitmap
             FileOutputStream outStream = null;
                  try{
                      outStream = new FileOutputStream("/sdcard/Image.jpg");
                      outStream.write(data);
                      outStream.close();
                  } catch (FileNotFoundException e){
                      Log.d("CAMERA", e.getMessage());
                  } catch (IOException e){
                      Log.d("CAMERA", e.getMessage());
                  }
       }
    };
      public IBinder onBind(Intent intent) {
            // TODO Auto-generated method stub
            return null;
      }
以及它所做的logcat
    11-24 01:54:37.738: E/AndroidRuntime(6971): FATAL EXCEPTION: main                                                                                                                  
    11-24 01:54:37.738: E/AndroidRuntime(6971): java.lang.RuntimeException: Unable to start activity   ComponentInfo{com.example.udptest/com.example.udptest.Main}: java.lang.RuntimeException: takePicture failed
    11-24 01:54:37.738: E/AndroidRuntime(6971):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2308)
    11-24 01:54:37.738: E/AndroidRuntime(6971):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358)
    11-24 01:54:37.738: E/AndroidRuntime(6971):     at android.app.ActivityThread.access$600(ActivityThread.java:153)
    11-24 01:54:37.738: E/AndroidRuntime(6971):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
    11-24 01:54:37.738: E/AndroidRuntime(6971):     at android.os.Handler.dispatchMessage(Handler.java:99)
    11-24 01:54:37.738: E/AndroidRuntime(6971):     at android.os.Looper.loop(Looper.java:137)
    11-24 01:54:37.738: E/AndroidRuntime(6971):     at android.app.ActivityThread.main(ActivityThread.java:5227)
11-24 01:54:37.738: E/AndroidRuntime(6971):     at java.lang.reflect.Method.invokeNative(Native Method)
11-24 01:54:37.738: E/AndroidRuntime(6971):     at java.lang.reflect.Method.invoke(Method.java:511)
11-24 01:54:37.738: E/AndroidRuntime(6971):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
11-24 01:54:37.738: E/AndroidRuntime(6971):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
11-24 01:54:37.738: E/AndroidRuntime(6971):     at dalvik.system.NativeStart.main(Native Method)
11-24 01:54:37.738: E/AndroidRuntime(6971): Caused by: java.lang.RuntimeException: takePicture failed
11-24 01:54:37.738: E/AndroidRuntime(6971):     at android.hardware.Camera.native_takePicture(Native Method)
11-24 01:54:37.738: E/AndroidRuntime(6971):     at android.hardware.Camera.takePicture(Camera.java:1101)
11-24 01:54:37.738: E/AndroidRuntime(6971):     at android.hardware.Camera.takePicture(Camera.java:1046)
11-24 01:54:37.738: E/AndroidRuntime(6971):     at com.example.udptest.Main.snap(Main.java:129)
11-24 01:54:37.738: E/AndroidRuntime(6971):     at com.example.udptest.Main.onCreate(Main.java:84)
11-24 01:54:37.738: E/AndroidRuntime(6971):     at android.app.Activity.performCreate(Activity.java:5104)
11-24 01:54:37.738: E/AndroidRuntime(6971):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
11-24 01:54:37.738: E/AndroidRuntime(6971):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2262)
11-24 01:54:37.738: E/AndroidRuntime(6971):     ... 11 more
任何想法可能会发生在这里,或更好的方式来完成这项任务?
这是在后台捕获照片的服务 ,希望它有助于:
public class CapPhoto extends Service
{
    private SurfaceHolder sHolder;    
    private Camera mCamera;
    private Parameters parameters;
  @Override
    public void onCreate()
    {
      super.onCreate();
      Log.d("CAM", "start");
      if (android.os.Build.VERSION.SDK_INT > 9) {
          StrictMode.ThreadPolicy policy = 
               new StrictMode.ThreadPolicy.Builder().permitAll().build();
          StrictMode.setThreadPolicy(policy);}
          Thread myThread = null;
  }
  @Override
  public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
 if (Camera.getNumberOfCameras() >= 2) { 
    mCamera = Camera.open(CameraInfo.CAMERA_FACING_FRONT); }
 if (Camera.getNumberOfCameras() < 2) { 
    mCamera = Camera.open(); }
    SurfaceView sv = new SurfaceView(getApplicationContext());
     try {
               mCamera.setPreviewDisplay(sv.getHolder());
               parameters = mCamera.getParameters();
               mCamera.setParameters(parameters);
               mCamera.startPreview();
               mCamera.takePicture(null, null, mCall);
         } catch (IOException e) { e.printStackTrace(); }
        sHolder = sv.getHolder();
        sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  }
  Camera.PictureCallback mCall = new Camera.PictureCallback()
  {
     public void onPictureTaken(final byte[] data, Camera camera)
     {
        FileOutputStream outStream = null;
                try{
                    File sd = new File(Environment.getExternalStorageDirectory(), "A");
                    if(!sd.exists()) {                                 
                      sd.mkdirs();
                      Log.i("FO", "folder" + Environment.getExternalStorageDirectory());
                    } 
                        Calendar cal = Calendar.getInstance();
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
                        String tar = (sdf.format(cal.getTime()));
                        outStream = new FileOutputStream(sd+tar+".jpg");
                        outStream.write(data);  outStream.close();
                        Log.i("CAM", data.length + " byte written to:"+sd+tar+".jpg");
                        camkapa(sHolder);               
                 } catch (FileNotFoundException e){
                    Log.d("CAM", e.getMessage());
                } catch (IOException e){
                    Log.d("CAM", e.getMessage());
                }}
  };
    @Override
    public IBinder onBind(Intent intent) {
          return null;
    }
    public void camkapa(SurfaceHolder sHolder) {
        if (null == mCamera)
            return;
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
        Log.i("CAM", " closed");
        }
    }
AndroidManifest.xml中
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-feature android:name="android.hardware.camera" />
<service android:name=".CapPhoto" android:enabled="true">
             <intent-filter>
            </intent-filter>
        </service>
在您的MainActivity中调用以调用服务:
    Intent service;
    ....
    Calendar cal = Calendar.getInstance();
    service = new Intent(getBaseContext(), CapPhoto.class);
    cal.add(Calendar.SECOND, 15);
    //TAKE PHOTO EVERY 15 SECONDS
    PendingIntent pintent = PendingIntent.getService(this, 0, service, 0);
    AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                 60*60*1000, pintent);
    startService(service);
几点建议:
首先,不要硬编码文件路径。 您的/ sdcard可能根本不存在,因此您的outStream将为空,并且在您从outStream调用任何方法时它会崩溃。 而是使用Environment.getExternalStoragePublicDirectory或Environment.getExternalStorageDirectory (适用于Android版本<2.2)的设备。 看这里
没有照片预览 - 您可以预览1像素x 1像素的大小,所以它几乎不可见
您需要在AndroidManifest中声明权限:
“android.permission.CAMERA”和“android.permission.WRITE_EXTERNAL_STORAGE”(如果你想保存图片)
我建议你通过文档和实验的例子。
本指南将告诉您如何构建相机应用程序。我希望这可以帮助您。 http://developer.android.com/guide/topics/media/camera.html#custom-camera
链接地址: http://www.djcxy.com/p/75713.html