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.getExternalStoragePublicDirectoryEnvironment.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

    上一篇: Android: Take Photo Without User Interface

    下一篇: How do I center float elements?