I / art: Kann Klasse nicht finden:
Hallo da bin ich neu bei so einer Art Android Studio Fehler. Vielleicht ist es nur eine Warnung, aber ich hatte das Problem, die Klassen nicht zu finden.
Aktuell arbeite ich an einer Android-Kamera-API-Anwendung, und das Problem ist, dass die Vorschau meiner Frontkamera auf Stretch eingestellt ist. Das passiert nur bei 2-3 Geräten wie Huawei p8 lite. Das Gerät streckt seine Kameravorschau, wenn es auf die nach vorne gerichtete Kamera umgeschaltet wird!
Ich habe die Kamera-Vorschau-Klasse als:
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
//Variables de' Preview
private SurfaceHolder mHolder;
private List<Camera.Size> mSupportedPreviewSizes;
private Camera.Size mPreviewSize;
private int FOCUS_AREA_SIZE=300;
public static Camera previewCamera;
////////////////////////
//protected LOGGER keys
protected final String EXCEPTION_KEY="xception";
//////////////////////////
public CameraPreview(Context context, Camera camera) {
super(context);
//get the camera
previewCamera = camera;
if(previewCamera!=null){
// supported preview sizes
mSupportedPreviewSizes = previewCamera.getParameters().getSupportedPreviewSizes();
}
else{
previewCamera=camera;
// supported preview sizes
mSupportedPreviewSizes = previewCamera.getParameters().getSupportedPreviewSizes();
}
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
// deprecated setting, but required on Android versions prior to 3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
setKeepScreenOn(true);
setPreview();
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
try{
//when the surface is created, we can set the camera to draw images in this surfaceholder
setPreview();
previewCamera.setPreviewDisplay(surfaceHolder);
previewCamera.startPreview();
if(CameraActivity.cameraId==1){
previewCamera.setFaceDetectionListener(faceDetectionListener);
previewCamera.startFaceDetection();
}
} catch(Exception exp){
Log.i(EXCEPTION_KEY,"FROM surfaceCreated: "+exp.toString());
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) {
//before changing the application orientation, you need to stop the preview, rotate and then start it again
if(mHolder.getSurface() == null)//check if the surface is ready to receive camera data
return;
try{
previewCamera.stopPreview();
} catch (Exception e){
//this will happen when you are trying the camera if it's not running
}
//now, recreate the camera preview
try{
//set the camera preview on every preview change
setPreview();
//in case the preview is still stretched bingo! Then...
// Camera.Parameters params = previewCamera.getParameters();
// List<Camera.Size> sizes = params.getSupportedPreviewSizes();
// Camera.Size optimalSize = PreviewSizeParameters.getOptimalPreviewSize(sizes,i2,i3);
// params.setPreviewSize(optimalSize.width,optimalSize.height);
// previewCamera.setParameters(params);
previewCamera.setPreviewDisplay(mHolder);
previewCamera.startPreview();
if(CameraActivity.cameraId==1){
previewCamera.setFaceDetectionListener(faceDetectionListener);
previewCamera.startFaceDetection();
}
} catch(Exception exp){
Log.i(EXCEPTION_KEY,"FROM surfaceChanged: "+exp.toString());
}
}
public void setPreview(){
try{
//set the focusable true
this.setFocusable(true);
//set the touch able true
this.setFocusableInTouchMode(true);
//set the camera display orientation lock
previewCamera.setDisplayOrientation(90);
//get the camera parameters
Camera.Parameters parameters = previewCamera.getParameters();
//set the preview size
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
//set the parameter
previewCamera.setParameters(parameters);
}catch(Exception exp){
Log.i(EXCEPTION_KEY,"FROM setPreview: "+exp.toString());
}
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
//our app has only one screen, so we'll destroy the camera in the surface
//if you are using with more screens, please move this code your activity
try{
//handle in Activity onResume and onPause
}catch(Exception exp){
Log.i(EXCEPTION_KEY,"FROM surfaceDestroyed: "+exp.toString());
}
}
//Override Methods here
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
try{
final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(width, height);
if (mSupportedPreviewSizes != null) {
mPreviewSize = PreviewSizeParameters.getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
}
}catch(Exception exp){
Log.i(EXCEPTION_KEY,"FROM onMeasure: "+exp.toString());
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
private void stopPreviewAndFreeCamera() {
if (previewCamera != null) {
// Call stopPreview() to stop updating the preview surface.
previewCamera.stopPreview();
// Important: Call release() to release the camera for use by other
// applications. Applications should release the camera immediately
// during onPause() and re-open() it during onResume()).
previewCamera.release();
previewCamera = null;
}
}
//end of outer class here
}
Ich habe mich seit einigen Tagen mit diesem Problem befasst und den gleichen gestreckten Effekt auf meine benutzerdefinierte Kameravorschau erhalten.
So lautet meine Methode zum Erzielen optimaler Vorschaugrößen:
public class PreviewSizeParameters {
//protected LOGGER keys
protected static final String EXCEPTION_KEY = "xception";
//////////////////////////
public static Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double) h / w;
if (sizes == null) return null;
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
for (Camera.Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
}
Das ProbleDas Problem besteht darin, die Kameravorschau nur auf der Vorderseite der Kamera zu dehnen. Meine Log-Cat-Daten lauten wie folgt:
s werden einige Zeilen angezeigt, die wie folgt beginnen: I / art: Kann Klasse nicht finden:. Da ich ein Neuling bin, habe ich keine Ahnung, was sie bedeuten?