如何获取CameraControl和CameraInfo

Len*_*ena 5 android androidx android-camerax

我是一名初级 Android 开发人员。\n我正在使用 CameraX 的最新版本 (alpha08)。

\n\n

我正在尝试设置缩放功能,为此我需要 CameraControl。\n要获取 CameraControl,我需要根据https://developer.android.com/reference提供 Camera -> Camera.getCameraControl() 的实例/androidx/相机/核心/CameraControl

\n\n

我似乎无法获取 Camera 的实例。如果我尝试实例化 Camera,它会要求我实现 getCameraControl() 和 getCameraInfo(),它们都返回 null。

\n\n

有人可以向我解释一下该怎么做吗?

\n\n

这是我的 ApplicationClass 文件

\n\n
public class ApplicationClass extends Application implements CameraXConfig.Provider {\n\n    @NonNull\n    @Override\n    public CameraXConfig getCameraXConfig() {\n        return Camera2Config.defaultConfig();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的 startCamera() 函数进入我的 CameraActivity

\n\n
private void startCamera() {\n\n        CameraSelector mCameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;\n\n        mFlashToggle.setVisibility(View.VISIBLE);\n        mGalleryFAB.setVisibility(View.VISIBLE);\n        mTakePhotoFAB.setVisibility(View.VISIBLE);\n\n        Point mSize = new Point();\n        Display mDisplay = getWindowManager().getDefaultDisplay();\n\n        mDisplay.getSize(mSize);\n        int mWidth = mSize.x;\n        int mHeight = mSize.y;\n\n        Preview mPreview = new Preview.Builder()\n                .setTargetResolution(new Size(mWidth, mHeight))\n                .build();\n\n        mPreview.setPreviewSurfaceProvider(mCameraPP.getPreviewSurfaceProvider());\n\n        ImageCapture mImageCapture = new ImageCapture.Builder()\n                .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)\n                .setTargetRotation(getWindowManager().getDefaultDisplay().getRotation())\n                .setTargetResolution(new Size(mWidth, mHeight))\n                .build();\n\n\n        // FLASHLIGHT PART\n        mFlashToggle.getBackground().setAlpha(0);\n\n        mFlashToggle.setOnClickListener(new View.OnClickListener() {\n            boolean mIsActivated = true;\n\n            @Override\n            public void onClick(View v) {\n                if (mIsActivated) {\n                    mImageCapture.setFlashMode(ImageCapture.FLASH_MODE_ON);\n                    mFlashToggle.setColorFilter(getResources().getColor(R.color.conforme));\n                    mFlashToggle.getBackground().setAlpha(0);\n                    mIsActivated = false;\n                } else {\n                    mImageCapture.setFlashMode(ImageCapture.FLASH_MODE_OFF);\n                    mFlashToggle.setColorFilter(getResources().getColor(R.color.black));\n                    mFlashToggle.getBackground().setAlpha(0);\n                    mIsActivated = true;\n                }\n            }\n        });\n\n        // CLICK ON TAKE PHOTO BUTTON TRIGGERS THIS\n        mTakePhotoFAB.setOnClickListener(view -> {\n            mDir = new File(getExternalCacheDir(), "PhotosAuthentifier");\n            boolean success = true;\n\n            if (!mDir.exists()) {\n                success = mDir.mkdir();\n            }\n\n            if (success) {\n                File mFile = new File(mDir, new SimpleDateFormat("yyyyMMdd-HHmmss", Locale.getDefault()).format(new Date()) + ".jpg");\n\n                mImageCapture.takePicture(mFile, command -> new Thread(command).start(),\n                        new ImageCapture.OnImageSavedCallback() {\n                            @Override\n                            public void onImageSaved(@NonNull File file) {\n                                runOnUiThread(() -> {\n                                    // ADD PHOTO INTO FINAL TAB\n                                    mListOfPhotos.add(file.getAbsolutePath());\n\n                                    // UPDATE PREVIEW OF PHOTOS ON SCREEN\n                                    mAdapter.setmListOfPhotos(mListOfPhotos);\n                                    mRecyclerView.setAdapter(mAdapter);\n\n                                    if (mListOfPhotos.size() < 3) {\n                                        actualNumberOfPhoto();\n                                    } else {\n                                        actualNumberOfPhoto();\n                                    }\n                                });\n\n                            }\n\n                            @Override\n                            public void onError(int imageCaptureError, @NonNull String message, @Nullable Throwable cause) {\n                                String mMessage = "Photo capture failed: " + message;\n                                Toast.makeText(CameraActivity.this, mMessage, Toast.LENGTH_SHORT).show();\n\n                                assert cause != null;\n                                cause.printStackTrace();\n                            }\n\n                        });\n            }\n\n        });\n\n        // CLICK ON SEND BUTTON TRIGGERS THIS\n        mSendPhotoFAB.setOnClickListener(view -> {\n            if (mSendPhotoFAB.isClickable()) {\n                mSendPhotoFAB.setClickable(false);\n                AlertDialog.Builder mAlertDialogBuilder = new AlertDialog.Builder(CameraActivity.this);\n\n                String mMessage = null;\n\n\n                if (sIDDemande == 0) {\n                    LayoutInflater mInflater = this.getLayoutInflater();\n                    View mDialogView = mInflater.inflate(R.layout.activity_camera_parameters, null);\n\n                    // Parameters initialization\n                    mDescriptionET = mDialogView.findViewById(R.id.activityCameraParametersDescriptionET);\n                    mLanguageSpinner = mDialogView.findViewById(R.id.activityCameraSpecimenLanguageSpinner);\n                    mMarkerYesButton = mDialogView.findViewById(R.id.activityCameraMarkerYesButton);\n                    mMarkerNoButton = mDialogView.findViewById(R.id.activityCameraMarkerNoButton);\n                    mMarkerInfoIB = mDialogView.findViewById(R.id.activityCameraMarkerInfoIB);\n                    TextView mMarkerTV = mDialogView.findViewById(R.id.activityCamera15CreditTV);\n                    TextView mMarkerInfoTV = mDialogView.findViewById(R.id.activityCameraMarkerInfoTV);\n                    mSerialNumberET = mDialogView.findViewById(R.id.activityCameraSerialNumberET);\n                    mModelNameET = mDialogView.findViewById(R.id.activityCameraModelNameET);\n\n                    mAlertDialogBuilder.setView(mDialogView);\n\n                    // OPTIONAL PARAMETERS FORM\n                    if (sIDDemande == 0) {\n                        ArrayAdapter<String> mSpinnerAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item);\n                        mSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\n\n                        mLanguageSpinner.setAdapter(mSpinnerAdapter);\n                        mSpinnerAdapter.add(getResources().getString(R.string.french));\n                        mSpinnerAdapter.add(getResources().getString(R.string.english));\n\n                        mSpinnerAdapter.notifyDataSetChanged();\n\n                        //To make Description part scrollable\n                        mDescriptionET.setOnTouchListener((v, event) -> {\n                            if (mDescriptionET.hasFocus()) {\n                                v.getParent().requestDisallowInterceptTouchEvent(true);\n\n                                if ((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_SCROLL) {\n                                    v.getParent().requestDisallowInterceptTouchEvent(false);\n                                    return true;\n                                }\n                            }\n\n                            return false;\n                        });\n\n                        // Default specimen language is defined according to app language\n                        String mLanguage = LocaleHelper.getLanguage(this).getString(LocaleHelper.SELECTED_LANGUAGE, null);\n\n                        if (mLanguage != null) {\n                            if (mLanguage.equals("fr")) {\n                                mLanguageSpinner.setSelection(0);\n                            } else if (mLanguage.equals("en")) {\n                                mLanguageSpinner.setSelection(1);\n                            }\n                        }\n\n                        mMarkerInfoIB.setOnClickListener(v -> {\n                            if (!mMarkerInfoIsClicked) {\n                                mMarkerInfoTV.setVisibility(View.VISIBLE);\n                                mMarkerInfoIsClicked = true;\n                            } else {\n                                mMarkerInfoTV.setVisibility(View.GONE);\n                                mMarkerInfoIsClicked = false;\n                            }\n                        });\n\n                        mMarkerNoButton.setBackgroundColor(getResources().getColor(R.color.authentifier));\n                        mMarkerYesButton.setBackgroundColor(getResources().getColor(R.color.text_color));\n\n                        mMarkerYesButton.setOnClickListener(v -> {\n                            if (!mMarkerYesClicked) {\n                                mMarkerYesButton.setBackgroundColor(getResources().getColor(R.color.authentifier));\n                                mMarkerNoButton.setBackgroundColor(getResources().getColor(R.color.text_color));\n                                mMarkerTV.setVisibility(View.VISIBLE);\n                                mMarkerYesClicked = true;\n                            }\n                        });\n\n                        mMarkerNoButton.setOnClickListener(v -> {\n                            if (mMarkerYesClicked) {\n                                mMarkerNoButton.setBackgroundColor(getResources().getColor(R.color.authentifier));\n                                mMarkerYesButton.setBackgroundColor(getResources().getColor(R.color.text_color));\n                                mMarkerTV.setVisibility(View.GONE);\n                                mMarkerYesClicked = false;\n                            }\n                        });\n\n                        if (mAlertDialog != null) {\n                            Objects.requireNonNull(mAlertDialog.getWindow()).setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);\n                        }\n                    }\n                }\n\n                if (sIDDemande != 0) {\n                    mMessage = getResources().getString(R.string.validationBeforePursue);\n                }\n\n                mAlertDialogBuilder\n                        .setTitle(R.string.activityCameraParametersTitle)\n                        .setCancelable(false)\n                        .setMessage(mMessage)\n                        .setPositiveButton(R.string.yes, (dialog, which) -> {\n                            ((AlertDialog) dialog).getButton(which).setClickable(false);\n                            dialog.dismiss();\n\n                            if (sIDDemande != 0) {\n                                new AsyncTaskSendComplementaryPhotos(sCameraActivity, sCameraActivity.getApplicationContext()).execute();\n                            } else {\n                                if (mDescriptionET.getText() != null && !mDescriptionET.getText().toString().equals("")) {\n                                    mMapApplication.put(ConstantsClass.APPLICATION_DESCRIPTION, mDescriptionET.getText().toString());\n                                }\n\n                                if (mSerialNumberET.getText() != null && !mSerialNumberET.getText().toString().equals("")) {\n                                    mMapApplication.put(ConstantsClass.SERIAL_NUMBER, mSerialNumberET.getText().toString());\n                                }\n\n                                if (mModelNameET.getText() != null && !mModelNameET.getText().toString().equals("")) {\n                                    mMapApplication.put(ConstantsClass.MODEL_NAME, mModelNameET.getText().toString());\n                                }\n\n                                String mSpinnerValue = mLanguageSpinner.getSelectedItem().toString();\n\n                                if (mSpinnerValue.equals("French")) {\n                                    mSpinnerValue = "Fran\xc3\xa7ais";\n                                }\n\n                                if (mSpinnerValue.equals("English")) {\n                                    mSpinnerValue = "Anglais";\n                                }\n\n                                mMapApplication.put(ConstantsClass.LANGUAGE_SPECIMEN, mSpinnerValue);\n\n                                if (mMarkerYesClicked) {\n                                    mMapApplication.put(ConstantsClass.MARKER, "OUI");\n                                } else {\n                                    mMapApplication.put(ConstantsClass.MARKER, "NON");\n                                }\n\n                                new AsyncTaskSendData(sCameraActivity).execute();\n                            }\n                        })\n                        .setNegativeButton(R.string.no, (dialogInterface, i) -> {\n                            dialogInterface.dismiss();\n                            mSendPhotoFAB.setClickable(true);\n                        });\n\n                mAlertDialog = mAlertDialogBuilder.create();\n\n                mAlertDialog.show();\n            } else {\n                Toast mToast = Toast.makeText(this, getResources().getString(R.string.waitingMessageBeforeParameters), Toast.LENGTH_LONG);\n                View mToastView = mToast.getView();\n\n                mToastView.setBackgroundColor(getResources().getColor(R.color.authentifier));\n                mToast.setGravity(Gravity.CENTER, 0, 0);\n\n                mToast.show();\n            }\n        });\n\n        // CLICK ON GALLERY BUTTON TRIGGERS THIS\n        mGalleryFAB.setOnClickListener(view -> {\n            checkPermissions();\n\n            if (mPermission) {\n                Intent mIntentGallery = new Intent(Intent.ACTION_PICK);\n                mIntentGallery.setType("image/*");\n                startActivityForResult(mIntentGallery, GALLERY_REQUEST);\n            }\n\n        });\n\n        ImageAnalysis mAnalysis = new ImageAnalysis.Builder()\n                .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)\n                .build();\n\n        mCameraProviderFuture.addListener(() -> {\n            try {\n                mCameraProvider = mCameraProviderFuture.get();\n            } catch (ExecutionException | InterruptedException e) {\n                e.printStackTrace();\n            }\n            assert mCameraProvider != null;\n            mCameraProvider.bindToLifecycle(sCameraActivity, mCameraSelector, mPreview, mAnalysis, mImageCapture);\n        }, ContextCompat.getMainExecutor(this));\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

Den*_*mus 5

作为方法末尾androidx.camera.core.Camera调用的结果,您将获得实例。mCameraProvider.bindToLifecycle(sCameraActivity, mCameraSelector, mPreview, mAnalysis, mImageCapture);

例子

private Camera camera;

camera = mCameraProvider.bindToLifecycle(sCameraActivity, mCameraSelector, mPreview, mAnalysis, mImageCapture);
Run Code Online (Sandbox Code Playgroud)

然后,当您需要访问相机的 CameraControl 或 CameraInfo 时,只需使用:

camera.getCameraControl()
camera.getCameraInfo()
Run Code Online (Sandbox Code Playgroud)

  • @lena我相信这是一个正确的答案。您可能想要接受,以便它在搜索中显示为已接受答案的答案。那么其他人就可以利用它了... (2认同)