2016-01-10 3 views
0

Я разрабатываю приложение для Android (моя работа в семестре в университете) - так что я, наконец, сложена - мне очень плохо в программировании (только что началось). Я знаю, что эта проблема была решена здесь Taking picture from camera without preview и здесь Background Service to take picture with Camera. Но ничто из этого не помогло мне (да, я такой манекен). Таким образом, на данный момент у меня только этот главный класс:Съемка с сервисом с/без SurfaceView (android)

public class MainActivity extends Activity { 

public static SurfaceView surfaceView; 
public static SurfaceHolder surfaceHolder; 
public static Camera camera; 
final String LOG_TAG = "myLogs"; 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    Log.d(LOG_TAG, "onCreateMain"); 
    setContentView(R.layout.main); 

    surfaceView = (SurfaceView) findViewById(R.id.surface); 
    surfaceHolder = surfaceView.getHolder(); 
    surfaceHolder.addCallback(new SurfaceHolder.Callback() { 
     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      try { 
       camera.setPreviewDisplay(holder); 
       camera.startPreview(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void surfaceChanged(SurfaceHolder holder, int format, 
            int width, int height) { 
     } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 
     } 
    }); 
} 

public void Start(View view){ 
    startService(new Intent(this, MyService.class)); 
    Log.d(LOG_TAG, "onStartMain"); 
    finish(); 
} 

public void Stop(View view){ 
    stopService(new Intent(this, MyService.class));} 
} 

А вот Класс обслуживания:

public class MyService extends Service { 

private Camera camera = MainActivity.camera; 
private SurfaceView surfaceView = MainActivity.surfaceView; 
private SurfaceHolder surfaceHolder = MainActivity.surfaceHolder; 
File photoFile; 
final String LOG_TAG = "myLogs"; 

@Override 
public void onCreate(){ 
    super.onCreate(); 
    Log.d(LOG_TAG, "onCreate"); 
    File pictures = Environment 
      .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
    photoFile = new File(pictures, "myphoto.jpg"); 
} 

@Override 
public int onStartCommand(Intent intent,int flags, int startId){ 
    Log.d(LOG_TAG, "onStartCommand"); 
    camera = Camera.open(); 
    takePicture(); 
    return super.onStartCommand(intent, flags, startId); 
} 

private void takePicture() { 
    Log.d(LOG_TAG, "onTakePicture"); 
    camera.takePicture(null, null, new Camera.PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      try { 
       FileOutputStream fos = new FileOutputStream(photoFile); 
       fos.write(data); 
       fos.close(); 
       Log.d(LOG_TAG, "PictureTaken"); 
      } catch (Exception e) { 
       Log.d(LOG_TAG,"Exception"); 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

@Override 
public void onDestroy(){ 
    Log.d(LOG_TAG, "onDestroy"); 
    releaseCamera(); 
    super.onDestroy(); 
} 

private void releaseCamera() { 
    if (camera != null) 
     camera.release(); 
    camera = null; 
} 


@Override 
public IBinder onBind(Intent intent) { 
    return null;} 
} 

Программа стеков после входа

Log.d (LOG_TAG " onTakePicture ");

Если я остановлюсь на обслуживании - все будет хорошо (звонки onDestroy()). Проблема только в том, что она не делает снимок или не сохраняет его. Журнальное сообщение отсутствует

Log.d (LOG_TAG, «PictureTaken»);

Итак, может ли кто-нибудь помочь мне решить эту проблему?

+0

Существует все в порядке в Manifest разрешения –

+0

Выполните это решение: http://stackoverflow.com/questions/39631013/take-photo-from-camera-in-service/39632436#39632436 –

ответ

0

Я не запускал ваш код, но я думаю, вы должны удалить finish() звонок в MainActivity.Start(), поскольку это заставляет приложение закрываться. Картинка не берется немедленно, и вам нужно дождаться вызова onPictureTaken(), который у вас есть в классе «Служба».

+0

К сожалению, не связанное с тем, что у вас есть написано: Я правильно понял, что камера работает только через Surface View? Если это так, это единственный способ заставить SurfaceView работать, предоставляя доступ к UI-потоку? –

+0

Вам необходимо «SurfaceView» для рендеринга предварительного просмотра с камеры (в основном по соображениям конфиденциальности). Поскольку ваша Служба запущена в том же контексте, что и MainActivity, вызовы объекта «Камера» являются достаточными и будут обрабатывать предварительный просмотр для вас. –

+0

Большое спасибо! –