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\npublic class ApplicationClass extends Application implements CameraXConfig.Provider {\n\n @NonNull\n @Override\n public CameraXConfig getCameraXConfig() {\n return Camera2Config.defaultConfig();\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我的 startCamera() 函数进入我的 CameraActivity
\n\nprivate 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 }\nRun Code Online (Sandbox Code Playgroud)\n
作为方法末尾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)
| 归档时间: |
|
| 查看次数: |
2120 次 |
| 最近记录: |