2013-01-11 8 views
5

カメラから写真を撮るために働くことができたコードは、アクティビティから実行されます。私は、サービス内から、またはサービスによって起動されたAsyncTaskから写真を撮ることができることはかなり確信しています。Android:UIなしのサービスからカメラで写真を撮ることは可能ですか?

カメラAPIには、UIに結びつけられているSurfaceViewが必要です。たぶん私は間違っています。写真をサービスから撮ることができるコードを書いた人はいますか?

答えて

-2

カメラがプレビュー画面を必要とするため、これは可能ではないと思います。類似の質問を参照here

+0

あなたがリンクした質問に示されているように、*効果的に*プレビューなしで行うことができます。 – Sam

+0

@グリッドメールどのようにユーザーの知識なしに写真を撮っているのですか? 。彼らは、写真を撮り、ダミーサーフェイスビュー/サーフェステクスチャを使用するサービスを開始しました。 https://play.google.com/store/apps/details?id=com.zenaapps.backgroundcameraどうすれば同じことができますか?コードサンプルがあれば提供できますか? –

5

AndroidでWindowManagerを使用すると可能です。私が言うべき

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

はい、あなたは写真を撮るためにSurfaceViewを必要とするが、それは、特定のXMLレイアウトに縛られる必要はありません。サービスでも動作するWindowManagerクラスに追加することができます。したがって、ここではWindowManagerはAndroidで浮動効果を実行するための 'ウィンドウ'を開きます。

具体的には、

あなたはWindowManagerSurfaceViewを追加し、次のようにパラメータを設定することができます。

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はこの機能を備えていますが、iOSではありません。このため、iOSではなくAndroidのホーム画面でFacebookのチャットヘッドをアクティブにすることができます。

Show facebook like chat head from a broadcast receiver in android

+4

このメソッドには、ユーザーが問題を起こす可能性があるandroid.permission.SYSTEM_ALERT_WINDOW権限が必要であることに注意してください。 – yincrash

+0

コードサンプルにいくつかの重要な部分が欠けていますが、これは私にとっては役に立ちました。 – Sam

+0

@Samは欠けている必須部分を追加するように気をつけますか? – Ben

2

あなたはまだ探しているなら、ここではいくつかのより完全なコードです。

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

私の実験では、ダミーの 'SurfaceTexture'の回避策はNexus 4とHTC One m8で機能しましたが、Nexus 5 :( – dzeikei

+0

Nexus 5を試しているときに何が問題になったのですか? – venkat

+0

ダミーの「SurfaceTexture」技術のため、Android 4.3を実行しているSony Xperia Mではこれが動作しません。 – Sam

関連する問題