首页 > 解决方案 > 如何将相机预览放在扩展 InputMethodService 的类中?

问题描述

我正在创建一个自定义键盘,并且我在键盘内放置了一个相机的预览视图。但我似乎无法将其绑定到生命周期或获取相机源。我的键盘视图服务如下:

public class MainActivity extends InputMethodService
{
    private LinearLayout keyboardView;
    InputMethodManager imm;
    PreviewView mPreviewView;
    Button capture;

    @SuppressLint("InflateParams")
    @Override
    public View onCreateInputView()
    {
        imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        LayoutInflater inflater=getLayoutInflater();
        mPreviewView=(PreviewView)inflater.inflate(R.layout.keyboard_view, null).findViewById(R.id.camera);
        capture=(Button)inflater.inflate((R.layout.keyboard_view), null).findViewById(R.id.button);
        keyboardView = (LinearLayout) inflater.inflate(R.layout.keyboard_view, null);
        startCamera();
        return keyboardView;
    }


    //endregion
    private void startCamera() {

        final ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);

        cameraProviderFuture.addListener(new Runnable() {
            @Override
            public void run() {
                try {

                    ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
                    bindPreview(cameraProvider);

                } catch (ExecutionException | InterruptedException e) {
                    // No errors need to be handled for this Future.
                    // This should never be reached.
                }
            }
        }, ContextCompat.getMainExecutor(getApplicationContext()));
    }

    void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {

        Preview preview = new Preview.Builder()
                .build();

        CameraSelector cameraSelector = new CameraSelector.Builder()
                .requireLensFacing(CameraSelector.LENS_FACING_BACK)
                .build();

        ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()
                .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
                .build();

        ImageCapture.Builder builder = new ImageCapture.Builder();

        //Vendor-Extensions (The CameraX extensions dependency in build.gradle)
        HdrImageCaptureExtender hdrImageCaptureExtender = HdrImageCaptureExtender.create(builder);

        // Query if extension is available (optional).
        if (hdrImageCaptureExtender.isExtensionAvailable(cameraSelector)) {
            // Enable the extension if available.
            hdrImageCaptureExtender.enableExtension(cameraSelector);
        }

        final ImageCapture imageCapture = builder
                .build();
        mPreviewView.setScaleType(PreviewView.ScaleType.FILL_CENTER);
        preview.setSurfaceProvider(mPreviewView.getSurfaceProvider());
        Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, preview, imageAnalysis, imageCapture);

        capture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Bitmap image = mPreviewView.getBitmap();
                //Do something with the bitmap
            }
        });

    }

有什么想法可以在其中实现 Camera Preview View 甚至调用 Camera Capture 意图吗?两者中的任何一个都可以,直到它将位图无误地返回给我。

标签: javaandroidandroid-studioandroid-cameraxandroid-input-method

解决方案


推荐阅读