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