Java 使用/不使用SurfaceView(android)在服务中拍照

Java 使用/不使用SurfaceView(android)在服务中拍照,java,android,android-service,Java,Android,Android Service,我正在开发android应用程序(我在大学的一个学期的工作)-所以我最终积累了-我的编程非常差(刚刚开始)。我知道,这个问题在这里和这里都得到了解决。但这两件事对我都没有帮助(是的,我太笨了)。因此,目前我只有这门主要课程: public class MainActivity extends Activity { public static SurfaceView surfaceView; public static SurfaceHolder surfaceHolder; public st

我正在开发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_标签,“ontakepoint”)

如果我停止服务,它将正常运行(调用onDestroy()。问题只在于它不拍照或不保存。没有日志消息

Log.d(Log_标签,“PictureTaken”)


那么,有人能帮我解决这个问题吗?

我还没有运行你的代码,但我认为你应该删除
finish()
调用
MainActivity.Start()
,因为这会迫使应用程序关闭。照片不会立即拍摄,您必须等待服务类中的回调调用
onPictureTaken()

Manifest Permissions中的所有内容都可以遵循以下解决方案:抱歉,与您所写的内容无关:我是否正确地认为相机只能通过曲面视图工作?如果是这样的话,让SurfaceView工作的唯一方法是通过允许访问UI线程吗?您需要一个“SurfaceView”来从相机渲染预览(主要是出于隐私原因)。由于您的服务与MainActivity在相同的上下文中运行,因此对“Camera”对象的调用就足够了,可以为您处理预览的渲染。