【问题标题】:takePicture in service not working服务中的拍照不工作
【发布时间】:2015-09-25 20:05:15
【问题描述】:

我正在尝试用后置摄像头拍照,然后在我正在使用此代码的服务中获取它的字节:

Camera camera = Camera.open();
SurfaceView view = new SurfaceView(getApplicationContext());
SurfaceHolder holder = view.getHolder();
camera.getParameters().setPreviewSize(1, 1);
camera.setPreviewDisplay(holder);
camera.startPreview();
camera.takePicture(null, pictureCallback, null);

但它不起作用。我没有收到异常,但从未调用 pictureCallback。

【问题讨论】:

    标签: java android


    【解决方案1】:

    取自安卓文档:http://developer.android.com/training/camera/photobasics.html

    你应该像这样调用相机意图:

    首先在androidmanifest文件中为你的应用添加必要的权限:

    <manifest ... >
        <uses-feature android:name="android.hardware.camera"
                      android:required="true" />
        ...
    </manifest>
    

    之后调用相应的intent启动摄像头:

    static final int REQUEST_IMAGE_CAPTURE = 1;
    
    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }
    

    您从相机接收到的数据将通过以下方法调用,您可以在其中存储或使用它:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            mImageView.setImageBitmap(imageBitmap);
        }
    }
    

    如果您想在服务中实现这一点,从link 获取代码,您应该能够从服务中拍照:

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

    正如 cmets 所说,请注意这需要 SYSTEM_ALERT_WINDOW 权限才能工作,用户可能不希望允许 App 使用此权限。

    【讨论】:

    • 我在服务中说过我不能在服务中使用该代码。
    猜你喜欢
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多