Пиксельный экран с помощью CameraX на Android Pie (9.0) - PullRequest
1 голос
/ 01 октября 2019

Я использую CameraX, чтобы делать фотографии с моим приложением. Я тестировал его на Sony Xperia (Android Nougat), Huawei P9 (Android Nougat), Samsung Galaxy A3 (Android Oreo) и Samsung S8 + (Android Pie).

Отлично работает на первых трех, но когдаэто касается моего S8 +, textureView моей камеры имеет пиксели (как в аду). Но когда я делаю снимок, его качество отличное.

Вот мой код, когда я запускаю свою камеру. Кто-нибудь знает в чем может быть причина? Я много раз менял PreviewConfig и ImageCaptureConfig, но когда я это делаю, качество моих фотографий ужасное, и на моем S8 +, если я медленно поворачиваю свой телефон, экран искажается.

private void startCamera() {
    DisplayMetrics mDisplayMetrics = new DisplayMetrics();
    Display mDisplay = getWindowManager().getDefaultDisplay();

    mDisplay.getRealMetrics(mDisplayMetrics);

    PreviewConfig mPreviewConfig = new PreviewConfig.Builder()
            .setTargetResolution(new Size(mViewFinderTV.getWidth(), mViewFinderTV.getHeight()))
            .setTargetAspectRatio(new Rational(mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels))
            .setTargetRotation(getWindowManager().getDefaultDisplay().getRotation())
            .setTargetRotation(mViewFinderTV.getDisplay().getRotation())
            .build();

    Preview mPreview = new Preview(mPreviewConfig);

    mPreview.setOnPreviewOutputUpdateListener(output -> {
        ViewGroup mViewGroup = (ViewGroup) mViewFinderTV.getParent();
        mViewGroup.removeView(mViewFinderTV);
        mViewGroup.addView(mViewFinderTV, 0);

        mViewFinderTV.setSurfaceTexture(output.getSurfaceTexture());
    });

    ImageCaptureConfig mImageCaptureConfig = new ImageCaptureConfig.Builder()
            .setTargetAspectRatio(new Rational(mViewFinderTV.getWidth(), mViewFinderTV.getHeight()))
            .setTargetRotation(getWindowManager().getDefaultDisplay().getRotation())
            .setCaptureMode(ImageCapture.CaptureMode.MAX_QUALITY)
            .build();

    ImageCapture mImageCapture = new ImageCapture(mImageCaptureConfig);

    mTakePhotoFAB.setOnClickListener(view -> {
        mDir = new File(getExternalCacheDir(), "PhotosAuthentifier");
        boolean success = true;

        if (!mDir.exists()) {
            success = mDir.mkdir();
        }

        if (success) {
            File mFile = new File(mDir, new SimpleDateFormat("yyyyMMdd-HHmmss", Locale.getDefault()).format(new Date()) + ".jpg");

            mImageCapture.takePicture(mFile,
                    new ImageCapture.OnImageSavedListener() {
                        @Override
                        public void onImageSaved(@NonNull File file) {
                            mListOfPhotos.add(file.getAbsolutePath());

                            mAdapter.setmListOfPhotos(mListOfPhotos);
                            mRecyclerView.setAdapter(mAdapter);

                            if (mListOfPhotos.size() < 3) {
                                actualNumberOfPhoto();
                            } else {
                                new AsyncTaskUpdateRecyclerView().execute();
                            }

                        }

                        @Override
                        public void onError(@NonNull ImageCapture.ImageCaptureError imageCaptureError, @NonNull String message, @Nullable Throwable cause) {
                            String mMessage = "Photo capture failed: " + message;
                            Toast.makeText(CameraActivity.this, mMessage, Toast.LENGTH_SHORT).show();

                            assert cause != null;
                            cause.printStackTrace();
                        }

                    });
        }

    });

    mSendPhotoFAB.setOnClickListener(view -> {
        AlertDialog.Builder mAlertDialogBuilder = new AlertDialog.Builder(CameraActivity.this);

        mAlertDialogBuilder
                .setCancelable(false)
                .setMessage(R.string.validationBeforePursue)
                .setPositiveButton(R.string.yes, (dialogInterface, i) -> {
                    if (mIDDemande != 0) {
                        new AsyncTaskSendComplementaryPhotos(this).execute();
                    } else {
                        new AsyncTaskSendData(this).execute();
                    }

                })
                .setNegativeButton(R.string.no, (dialogInterface, i) -> dialogInterface.dismiss());

        AlertDialog mAlertDialog = mAlertDialogBuilder.create();
        mAlertDialog.show();
    });

    mGalleryFAB.setOnClickListener(view -> {
        checkPermissions();

        if (mPermission) {
            Intent mIntentGallery = new Intent(Intent.ACTION_PICK);
            mIntentGallery.setType("image/*");
            startActivityForResult(mIntentGallery, GALLERY_REQUEST);
        }

    });

    CameraX.bindToLifecycle(this, mPreview, mImageCapture);
}

1 Ответ

1 голос
/ 29 октября 2019

Эта проблема решена в версии alpha06, попробуйте.

...