簡體   English   中英

使用/不使用SurfaceView在服務中拍照(Android)

[英]Taking picture in service with/without SurfaceView (android)

我正在開發android應用(我在大學的學期工作)-所以我終於把書堆起來-我在編程方面非常糟糕(剛剛開始)。 我知道,此問題已在此處解決,而無需預覽即可從相機拍照,而此處的后台服務可使用Camera拍照 但這兩者都沒有對我有所幫助(是的,我很假)。 因此,目前我只有這個Main類:

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”);

那么,有人可以幫助我解決這個問題嗎?

我沒有運行您的代碼,但是我認為您應該刪除MainActivity.Start()中的finish()調用,因為這會強制關閉應用程序。 圖片不會立即拍攝,您必須等待Service類中對onPictureTaken()的回調調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM