2013-01-11 38 views
5

Mã duy nhất tôi có thể làm việc để chụp ảnh bằng camera chạy từ hoạt động. Tôi khá chắc chắn rằng có thể chụp ảnh từ bên trong một dịch vụ hoặc từ một AsyncTask được đưa ra bởi dịch vụ.Android: Có thể chụp ảnh bằng máy ảnh không có giao diện người dùng không

Dường như với tôi rằng API camera cần có SurfaceView phải được gắn vào giao diện người dùng. Có lẽ tôi đã sai lầm. Có ai viết mã nơi một bức ảnh có thể được chụp từ một dịch vụ không?

Trả lời

-2

Tôi không nghĩ rằng điều này là có thể vì máy ảnh cần màn hình xem trước. Xem câu hỏi tương tự here

+0

Có thể làm điều đó với * hiệu quả * không xem trước, như được hiển thị trong câu hỏi bạn đã liên kết. – Sam

+0

@Gridtestmail sau đó cách ứng dụng chụp ảnh mà người dùng không biết? . Họ bắt đầu một dịch vụ để chụp ảnh và sử dụng chế độ xem bề mặt giả/Bề mặt kết cấu. https://play.google.com/store/apps/details?id=com.zenaapps.backgroundcamera. Làm thế nào chúng ta có thể đạt được như vậy? bạn có thể cung cấp bất kỳ mẫu mã nào, nếu bạn có bất kỳ mẫu nào không? –

5

Có thể sử dụng WindowManager trong Android.

https://stackoverflow.com/a/10268650/3047840

tôi nên nói có bạn cần SurfaceView để chụp ảnh nhưng nó không phải được gắn với một bố cục xml nhất định. Bạn có thể thêm nó vào lớp WindowManager hoạt động ngay cả trong Dịch vụ. Vì vậy, WindowManager ở đây sẽ mở ra một 'cửa sổ' để bạn có thể thực hiện bất kỳ hiệu ứng nổi nào trong Android.

Cụ thể,

Bạn có thể thêm một SurfaceView vào WindowManager và thiết lập các thông số như sau.

mPreview = new CameraPreview(this, mCamera, jpegCallback); 
WindowManager wm = (WindowManager) this 
     .getSystemService(Context.WINDOW_SERVICE); 
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
     WindowManager.LayoutParams.WRAP_CONTENT, 
     WindowManager.LayoutParams.WRAP_CONTENT, 
     WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
     WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
     PixelFormat.TRANSPARENT); 

params.height = 1; 
params.width = 1; 

wm.addView(mPreview, params); 

Android có chức năng này trong khi iOS thì không. Đây là lý do tại sao bạn có thể có Facebook chathead hoạt động trên màn hình chủ trong Android chứ không phải là iOS.

Show facebook like chat head from a broadcast receiver in android

+4

Điều quan trọng cần lưu ý là phương pháp này yêu cầu sự cho phép android.permission.SYSTEM_ALERT_WINDOW, mà người dùng có thể gặp vấn đề. – yincrash

+0

Điều này làm việc cho tôi, mặc dù mẫu mã của bạn thiếu một số phần thiết yếu. – Sam

+0

@Sam quan tâm để thêm các phần thiết yếu còn thiếu? – Ben

2

Đây là một số mã hoàn chỉnh hơn nếu bạn vẫn đang tìm kiếm. Hoạt động trong một dịch vụ (được kiểm tra):

private void takePhoto() { 

    System.out.println("Preparing to take photo"); 
    Camera camera = null; 

    int cameraCount = 0; 
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); 
    cameraCount = Camera.getNumberOfCameras(); 
    for (int camIdx = 0; camIdx < cameraCount; camIdx++) { 
     SystemClock.sleep(1000); 

     Camera.getCameraInfo(camIdx, cameraInfo); 

      try { 
       camera = Camera.open(camIdx); 
      } catch (RuntimeException e) { 
       System.out.println("Camera not available: " + camIdx); 
       camera = null; 
       //e.printStackTrace(); 
      } 
     try{ 
      if (null == camera) { 
       System.out.println("Could not get camera instance"); 
      }else{ 
       System.out.println("Got the camera, creating the dummy surface texture"); 
       //SurfaceTexture dummySurfaceTextureF = new SurfaceTexture(0); 
       try { 
        //camera.setPreviewTexture(dummySurfaceTextureF); 
        camera.setPreviewTexture(new SurfaceTexture(0)); 
        camera.startPreview(); 
       } catch (Exception e) { 
        System.out.println("Could not set the surface preview texture"); 
        e.printStackTrace(); 
       } 
       camera.takePicture(null, null, new Camera.PictureCallback() { 

        @Override 
        public void onPictureTaken(byte[] data, Camera camera) { 
         File pictureFileDir = getDir(); 
         if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) { 
          return; 
         } 
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss"); 
         String date = dateFormat.format(new Date()); 
         String photoFile = "PictureFront_" + "_" + date + ".jpg"; 
         String filename = pictureFileDir.getPath() + File.separator + photoFile; 
         File mainPicture = new File(filename); 
         addImageFile(mainPicture); 

         try { 
          FileOutputStream fos = new FileOutputStream(mainPicture); 
          fos.write(data); 
          fos.close(); 
          System.out.println("image saved"); 
         } catch (Exception error) { 
          System.out.println("Image could not be saved"); 
         } 
         camera.release(); 
        } 
       }); 
      } 
     }catch (Exception e){ 
      camera.release(); 
     } 


    } 
+0

Từ các thử nghiệm của tôi, giải pháp 'SurfaceTexture' giả đã hoạt động trên Nexus 4 và HTC One m8 nhưng không thành công trên Nexus 5 :( – dzeikei

+0

Sự cố bạn gặp phải khi thử trong Nexus 5 là gì? – venkat

+0

Tính năng này không hoạt động trên Sony Xperia M chạy Android 4.3 của tôi vì kỹ thuật 'SurfaceTexture' giả. – Sam

Các vấn đề liên quan