I am developing a simple app based on the CameraX
Jetpack support library through the provided getting started guide and a GitHub repo. Getting the error
I/zygote: Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$2>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener;
when I set the layout of the sample activity (CameraActivity
). Tested the sample code on both the virtual and real devices on API level 26
. The version of the CameraX
library is 1.0.0-alpha03
which is the latest available version.
Here is the code of my layout
:
<TextureView android:id="@+id/textureView" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <ImageButton android:id="@+id/btnCapture" android:layout_width="72dp" android:layout_height="72dp" android:scaleType="fitCenter" android:layout_margin="24dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:srcCompat="@drawable/ic_camera_accent" android:background="?selectableItemBackgroundBorderless" />
Here is the code of my activity
:
public class CameraActivity extends AppCompatActivity { private TextureView textureView; private ImageButton btnCapture; private int REQUEST_CODE_CAMERA_WRITE_EXT = 10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); // this line throws the error initComponents(); checkPermissions(); } private void initComponents() { textureView = findViewById(R.id.textureView); btnCapture = findViewById(R.id.btnCapture); } private void checkPermissions() { final String permissionCamera = Manifest.permission.CAMERA; final String permissionWriteExtStorage = Manifest.permission.WRITE_EXTERNAL_STORAGE; boolean isPermissionGranted = PermissionUtil.checkForPermission(this, permissionCamera); if (!isPermissionGranted) { boolean rationale = ActivityCompat.shouldShowRequestPermissionRationale( CameraActivity.this, permissionCamera); if (rationale) { AlertDialog.Builder builder = new AlertDialog.Builder(CameraActivity.this); builder.setTitle("Camera Permission"); builder.setMessage("In order to take the photo of your vein, you need to grant camera permission."); builder.setIcon(R.drawable.ic_info_accent); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCompat.requestPermissions(CameraActivity.this, new String[]{permissionCamera, permissionWriteExtStorage}, REQUEST_CODE_CAMERA_WRITE_EXT); } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); } else ActivityCompat.requestPermissions(CameraActivity.this, new String[]{permissionCamera, permissionWriteExtStorage}, REQUEST_CODE_CAMERA_WRITE_EXT); } else startCamera(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_CODE_CAMERA_WRITE_EXT) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { startCamera(); } } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } private void startCamera() { CameraX.unbindAll(); int aspRatioW = textureView.getWidth(); //get width of screen int aspRatioH = textureView.getHeight(); //get height Rational asp = new Rational(aspRatioW, aspRatioH); //aspect ratio Size screen = new Size(aspRatioW, aspRatioH); //size of the screen PreviewConfig pConfig = new PreviewConfig.Builder().setTargetAspectRatio(asp).setTargetResolution(screen).build(); Preview preview = new Preview(pConfig); //lets build it preview.setOnPreviewOutputUpdateListener( new Preview.OnPreviewOutputUpdateListener() { //to update the surface texture we have to destroy it first then re-add it @Override public void onUpdated(Preview.PreviewOutput output) { ViewGroup parent = (ViewGroup) textureView.getParent(); parent.removeView(textureView); parent.addView(textureView, 0); textureView.setSurfaceTexture(output.getSurfaceTexture()); updateTransform(); } }); ImageCaptureConfig imgCConfig = new ImageCaptureConfig.Builder().setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY) .setTargetRotation(getWindowManager().getDefaultDisplay().getRotation()).build(); final ImageCapture imgCap = new ImageCapture(imgCConfig); btnCapture.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ContextWrapper contextWrapper = new ContextWrapper(CameraActivity.this); String path = contextWrapper.getFilesDir().getPath(); File file = new File(path + "/" + System.currentTimeMillis() + ".jpg"); imgCap.takePicture(file, new ImageCapture.OnImageSavedListener() { @Override public void onImageSaved(@NonNull File file) { String msg = "Photo capture succeeded: " + file.getAbsolutePath(); Toast.makeText(getBaseContext(), msg, Toast.LENGTH_LONG).show(); } @Override public void onError(@NonNull ImageCapture.UseCaseError useCaseError, @NonNull String message, @Nullable Throwable cause) { String msg = "Photo capture failed: " + message; Toast.makeText(getBaseContext(), msg, Toast.LENGTH_LONG).show(); if (cause != null) { cause.printStackTrace(); } } }); } }); /* image analyser */ ImageAnalysisConfig imgAConfig = new ImageAnalysisConfig.Builder().setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE).build(); ImageAnalysis analysis = new ImageAnalysis(imgAConfig); analysis.setAnalyzer( new ImageAnalysis.Analyzer() { @Override public void analyze(ImageProxy image, int rotationDegrees) { //y'all can add code to analyse stuff here idek go wild. } }); //bind to lifecycle: CameraX.bindToLifecycle((LifecycleOwner) this, analysis, imgCap, preview); } private void updateTransform() { //compensates the changes in orientation for the viewfinder, bc the rest of the layout stays in portrait mode. //methinks :thonk: Matrix mx = new Matrix(); float w = textureView.getMeasuredWidth(); float h = textureView.getMeasuredHeight(); float cX = w / 2f; //calc centre of the viewfinder float cY = h / 2f; int rotationDgr; int rotation = (int) textureView.getRotation(); //cast to int bc switches don't like floats switch (rotation) { //correct output to account for display rotation case Surface.ROTATION_0: rotationDgr = 0; break; case Surface.ROTATION_90: rotationDgr = 90; break; case Surface.ROTATION_180: rotationDgr = 180; break; case Surface.ROTATION_270: rotationDgr = 270; break; default: return; } mx.postRotate((float) rotationDgr, cX, cY); textureView.setTransform(mx); //apply transformations to textureview } }
Solved the issue for me.
build.gradle (app level)
//Adding dependency
implementation 'androidx.core:core:1.5.0-alpha04'
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With