2014-06-21 2 views
5

ScheduledExecutorService은 내 서비스 내부에서 백그라운드로 이미지를 전송합니다. ScheduledExecutorService은 한 번만 실행되는 것이고, interval이 지나간 후에 하나의 그림 만 찍는 것을 의미합니다. 오류가 전혀 표시되지 않습니다. 다음은 오류를받지 못하고 있기 때문에 내 ServiceScheduledExecutorService는 서비스 내에서 한 번만 실행됩니다.

package com.anawaz.spy; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.ScheduledFuture; 
import java.util.concurrent.TimeUnit; 

import android.app.Service; 
import android.content.Intent; 
import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.hardware.Camera.ShutterCallback; 
import android.os.IBinder; 
import android.util.Log; 

public class CamService extends Service { 

    private static final String TAG = "TAG"; 

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

    Camera camera; 
    ScheduledFuture beeperHandle; 

    /* Service Life cycle Overrides */ 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     camera = Camera.open(); 
     try { 
      camera.setPreviewDisplay(null); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     //takePicsPeriodically(MainActivity.getSpInt(MainActivity.SP_Period)); 
     takePicsPeriodically(5); 
    } 

    @Override 
    public void onDestroy() { 
     stopPics(); 
     super.onDestroy(); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    // @Override 
    // public IBinder onBind(Intent arg0) { 
    // return myRemoteServiceStub; 
    // } 
    // /* ----------------------------------- */ 
    // 
    // private IMyRemoteService.Stub myRemoteServiceStub = new 
    // IMyRemoteService.Stub() { 
    // 
    // /* Basic Service Methods */ 
    // public boolean isCollecting() { 
    // return (beeperHandle != null); 
    // } 
    // /* ------------------------- */ 
    // }; 

    public void takePicsPeriodically(long period) { 
     final Runnable beeper = new Runnable() { 
      public void run() { 
       Log.d("TAG", "New Picture Taken"); 
       camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
      } 
     }; 
     camera.startPreview(); 
     beeperHandle = scheduler.scheduleAtFixedRate(beeper, period, period,TimeUnit.SECONDS); 
    } 

    public void stopPics() { 
     beeperHandle.cancel(true); 
     beeperHandle = null; 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
    } 

    /* Camera Call backs */ 
    ShutterCallback shutterCallback = new ShutterCallback() { 
     public void onShutter() { 
      Log.d(TAG, "onShutter'd"); 
     } 
    }; 

    /** Handles data for raw picture */ 
    PictureCallback rawCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      Log.d(TAG, "onPictureTaken - raw"); 
     } 
    }; 

    /** Handles data for j peg picture */ 
    PictureCallback jpegCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      FileOutputStream outStream = null; 
      try { 
       // write to local sand box file system 
       // outStream = 
       // CameraDemo.this.openFileOutput(String.format("%d.jpg", 
       // System.currentTimeMillis()), 0); 
       // Or write to s d card 
       File mFolder; 
       mFolder = new File("/sdcard/Spy/"); 
       if (!mFolder.exists()) { 
        mFolder.mkdir(); 
       } 
       outStream = new FileOutputStream(String.format(
         "/sdcard/Spy/Image_%d.jpg", System.currentTimeMillis())); 
       outStream.write(data); 
       outStream.close(); 
       Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
      } 
      Log.d(TAG, "onPictureTaken - jpeg"); 
     } 
    }; 

} 

없음 로그 캣의 코드입니다. 사진 촬영 후 서비스가 실행 중입니다. 내가 뭘 잘못하고 있니?

답변

9

이 게시물을 읽고 난 후 http://code.nomad-labs.com/2011/12/09/mother-fk-the-scheduledexecutorservice/ 나는 try catch 블록을 시도했다. 그리고 camera.takePicture(shutterCallback, rawCallback, jpegCallback);이 예외를 던지고있는 것을 발견했습니다. 내 실수로 인해서 첫 사진을 찍은 후에 미리보기를 시작하지 못했습니다. 이 대답을 참조하십시오. https://stackoverflow.com/a/21728454/1770916

다음은 내 서비스의 업데이트 된 작업 코드입니다.

package com.anawaz.spy; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.ScheduledFuture; 
import java.util.concurrent.TimeUnit; 

import android.app.Service; 
import android.content.Intent; 
import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.hardware.Camera.ShutterCallback; 
import android.os.IBinder; 
import android.util.Log; 

public class CamService extends Service { 

    private static final String TAG = "TAG"; 

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

    Camera camera; 
    ScheduledFuture beeperHandle; 

    /* Service Life cycle Overrides */ 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     camera = Camera.open(); 
     try { 
      camera.setPreviewDisplay(null); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     File mFolder = new File("/sdcard/Spy/"); 
     if (!mFolder.exists()) { 
      mFolder.mkdir(); 
     } 
     takePicsPeriodically(MainActivity.getSpInt(MainActivity.SP_Period)); 
     //takePicsPeriodically(5); 
    } 

    @Override 
    public void onDestroy() { 
     stopPics(); 
     super.onDestroy(); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    public void takePicsPeriodically(long period) { 
     camera.startPreview(); 
     beeperHandle = scheduler.scheduleAtFixedRate(beeper,period, period,TimeUnit.SECONDS); 
    } 

    final Runnable beeper = new Runnable() { 
     public void run() { 
      Log.d("TAG", "New Picture Taken"); 
      try { 
       camera.startPreview(); 
       camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
      }catch (Exception e) { 
       Log.e("TAG","error in executing: It will no longer be run!: "+e.getMessage()); 
       e.printStackTrace(); 
      } 
     } 
    }; 
    public void stopPics() { 
     beeperHandle.cancel(true); 
     beeperHandle = null; 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
    } 

    /* Camera Call backs */ 
    final ShutterCallback shutterCallback = new ShutterCallback() { 
     public void onShutter() { 
      Log.d(TAG, "onShutter'd"); 
     } 
    }; 

    /** Handles data for raw picture */ 
    final PictureCallback rawCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      Log.d(TAG, "onPictureTaken - raw"); 
     } 
    }; 

    /** Handles data for j peg picture */ 
    final PictureCallback jpegCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      FileOutputStream outStream = null; 
      try { 
       // write to local sand box file system 
       // outStream = 
       // CameraDemo.this.openFileOutput(String.format("%d.jpg", 
       // System.currentTimeMillis()), 0); 
       // Or write to s d card 

       outStream = new FileOutputStream(String.format(
         "/sdcard/Spy/Image_%d.jpg", System.currentTimeMillis())); 
       outStream.write(data); 
       outStream.close(); 
       Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
      } 
      Log.d(TAG, "onPictureTaken - jpeg"); 
     } 
    }; 

} 
+0

머리를 주셔서 감사합니다 :) –

관련 문제