1

アプリで CameraX を使用して写真を撮っています。Sony Xperia (Android Nougat)、Huawei P9 (Android Nougat)、Samsung Galaxy A3 (Android Oreo)、Samsung S8+ (Android Pie) でテストしました。

最初の 3 つでは問題なく動作しますが、私の 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);
}
4

1 に答える 1

1

この問題はバージョン alpha06 で解決されています。試してみてください。

于 2019-10-28T21:46:36.057 に答える