在Android Pie(9.0)上使用CameraX进行屏幕像素化

在Android Pie(9.0)上使用CameraX进行屏幕像素化,android,androidx,android-9.0-pie,android-camerax,Android,Androidx,Android 9.0 Pie,Android Camerax,我正在使用CameraX使用我的应用程序拍照。 我在索尼Xperia(安卓牛轧糖)、华为P9(安卓牛轧糖)、三星Galaxy A3(安卓Oreo)和三星S8+(安卓派)上测试过它 它在前三个方面效果很好,但当涉及到我的S8+时,我相机的纹理视图是像素化的(就像地狱一样)。但是当我拍照的时候,它的质量非常好 这是我启动相机时的密码。 有人知道原因是什么吗?我多次更改了PreviewConfig和ImageCaptureConfig,但当我这样做时,我的照片质量很差,在我的S8+上,如果我慢慢旋转手

我正在使用CameraX使用我的应用程序拍照。 我在索尼Xperia(安卓牛轧糖)、华为P9(安卓牛轧糖)、三星Galaxy A3(安卓Oreo)和三星S8+(安卓派)上测试过它

它在前三个方面效果很好,但当涉及到我的S8+时,我相机的纹理视图是像素化的(就像地狱一样)。但是当我拍照的时候,它的质量非常好

这是我启动相机时的密码。 有人知道原因是什么吗?我多次更改了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);
}
private void startCamera(){
DisplayMetrics mDisplayMetrics=新的DisplayMetrics();
显示mDisplay=getWindowManager().getDefaultDisplay();
getRealMetrics(mDisplayMetrics);
PreviewConfig mPreviewConfig=新建PreviewConfig.Builder()
.setTargetResolution(新大小(mViewFinderTV.getWidth(),mViewFinderTV.getHeight())
.SetTargetSpectratio(新的Rational(mDisplayMetrics.widthPixels,mDisplayMetrics.heightPixels))
.setTargetRotation(getWindowManager().getDefaultDisplay().getRotation())
.setTargetRotation(mViewFinderTV.getDisplay().getRotation())
.build();
预览mPreview=新预览(mPreviewConfig);
mPreview.setonPreviewOutUpdateListener(输出->{
视图组mViewGroup=(视图组)mViewFinderTV.getParent();
mViewGroup.removeView(mViewFinderTV);
mViewGroup.addView(mViewFinderTV,0);
mViewFinderTV.setSurfaceTexture(output.getSurfaceTexture());
});
ImageCaptureConfig mImageCaptureConfig=新建ImageCaptureConfig.Builder()
.setTargetSpectratio(新的Rational(mViewFinderTV.getWidth(),mViewFinderTV.getHeight())
.setTargetRotation(getWindowManager().getDefaultDisplay().getRotation())
.setCaptureMode(ImageCapture.CaptureMode.MAX_质量)
.build();
ImageCapture mImageCapture=新图像捕获(mImageCaptureConfig);
mTakePhotoFAB.setOnClickListener(视图->{
mDir=新文件(getExternalCacheDir(),“PhotoAuthentifier”);
布尔成功=真;
如果(!mDir.exists()){
success=mDir.mkdir();
}
如果(成功){
File mFile=新文件(mDir,新SimpleDataFormat(“yyyyMMdd HHmmss”,Locale.getDefault()).format(new Date())+“.jpg”);
mImageCapture.takePicture(mFile,
新建ImageCapture.OnImageSavedListener(){
@凌驾
public void onImageSaved(@NonNull File){
mListOfPhotos.add(file.getAbsolutePath());
mAdapter.setmListOfPhotos(mListOfPhotos);
mRecyclerView.setAdapter(mAdapter);
if(mListOfPhotos.size()<3){
实际照片数量();
}否则{
新建AsyncTaskUpdateRecyclerView().execute();
}
}
@凌驾
public void onError(@NonNull ImageCapture.ImageCaptureError ImageCaptureError,@NonNull字符串消息,@null可丢弃原因){
字符串mMessage=“照片捕获失败:”+消息;
Toast.makeText(CameraActivity.this、mMessage、Toast.LENGTH_SHORT).show();
断言原因!=null;
cause.printStackTrace();
}
});
}
});
mSendPhotoFAB.setOnClickListener(视图->{
AlertDialog.Builder mAlertDialogBuilder=新建AlertDialog.Builder(CameraActivity.this);
mAlertDialogBuilder
.setCancelable(错误)
.setMessage(R.string.validationBeforeMessage)
.setPositiveButton(R.string.yes,(dialogInterface,i)->{
if(mIDDemande!=0){
新建AsyncTaskSendComplementaryPhotos(this).execute();
}否则{
新建AsyncTaskSendData(this.execute();
}
})
.setNegativeButton(R.string.no,(dialogInterface,i)->dialogInterface.disease());
AlertDialog mAlertDialog=mAlertDialogBuilder.create();
mAlertDialog.show();
});
mGalleryFAB.setOnClickListener(视图->{
检查权限();
如果(mPermission){
Intent mIntentGallery=新意图(Intent.ACTION\u PICK);
setType(“image/*”);
startActivityForResult(MinentGallery,GALLERY_请求);
}
});
CameraX.bindToLifecycle(此、mPreview、mImageCapture);
}

这个问题在alpha06版本中得到了解决,试一试。

androidx仍处于实验阶段,它仍然有很多bug。如果你想要一个稳定的版本,那么你应该使用Camera2API。。。我发现你的工作有问题code@user1241241请让我知道:)@Lena问题在于屏幕上的像素化。解开它将解决问题。@Lena请验证