Rotierender Handy schnell um 180 Grad, Kamera-Vorschau dreht sich kopfüber

Habe ich eine benutzerdefinierte Kamera-Anwendung. Wenn ich drehen Sie das Telefon um 90, Kamera-Vorschau funktioniert gut. Aber wenn ich drehen Mobiltelefon schnell eine 180-Grad -, Kamera-Vorschau-schaltet auf den Kopf. Gibt es eine Lösung...

Hier ist mein code unter:

public class CustomCameraActivity extends Activity implements
    SurfaceHolder.Callback {

Camera camera;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
boolean previewing = false;
LayoutInflater controlInflater = null;
private Sensor mOrientaion1;
int cameraId = 0;
public final String TAG = "CustomCamera";
private SensorManager sensorManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.main);

    context = this;

    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    mOrientaion1 = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

    //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    imageView = (ImageView) findViewById(R.id.imgError);

    getWindow().setFormat(PixelFormat.UNKNOWN);
    surfaceView = (SurfaceView) findViewById(R.id.camerapreview);
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    controlInflater = LayoutInflater.from(getBaseContext());
    View viewControl = controlInflater.inflate(R.layout.custom, null);
    LayoutParams layoutParamsControl = new LayoutParams(
            LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);

    Button btn1 = (Button) viewControl.findViewById(R.id.Button01);
    Button btn2 = (Button) viewControl.findViewById(R.id.Button02);

    btn1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            //Toast.makeText(context, "1111111111111111111111111",
            //Toast.LENGTH_SHORT).show();
            camera.takePicture(null, null, mPicture);

            Constant.rotationValueForCamera = Constant.rotationValue;
        }
    });

    btn2.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            //Toast.makeText(context, "22222222222222222222222222",
            //Toast.LENGTH_SHORT).show();
            Log.e("0 imagePickerStatus", Constant.imagePickerStatus + "");

            Constant.imagePickerStatus = 0;

            Log.e("0 imagePickerStatus", Constant.imagePickerStatus + "");

            finish();
        }
    });

    this.addContentView(viewControl, layoutParamsControl);

    int ot = getResources().getConfiguration().orientation;

    if (Configuration.ORIENTATION_LANDSCAPE == ot) {
        imageView.setVisibility(View.GONE);
        Log.e("ori1111", "land");
    } else {
        imageView.setVisibility(View.VISIBLE);
        Log.e("ori111", "port");
    }
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    //Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        //Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        findViewById(R.id.Button01).setVisibility(View.VISIBLE);
        findViewById(R.id.Button02).setVisibility(View.VISIBLE);
        imageView.setVisibility(View.GONE);
        Log.e("ori", "land");
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        findViewById(R.id.Button01).setVisibility(View.INVISIBLE);
        findViewById(R.id.Button02).setVisibility(View.INVISIBLE);
        imageView.setVisibility(View.VISIBLE);
        Log.e("ori", "port");
    }
}

public String getPollDeviceAttitude() {

    return Constant.rotationValueForCamera;
}

private SensorEventListener sensorEventListener = new SensorEventListener() {

    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
};

protected void onPause() {
    super.onPause();

    sensorManager.unregisterListener(sensorEventListener);

}

@Override
public void onResume() {
    super.onResume();

    sensorManager.registerListener(sensorEventListener,
            sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_NORMAL);
    sensorManager.registerListener(sensorEventListener,
            sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
            SensorManager.SENSOR_DELAY_NORMAL);
    sensorManager.registerListener(sensorEventListener,
            sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
            SensorManager.SENSOR_DELAY_NORMAL);

    if (Constant.isCapturedOk) {
        Constant.isCapturedOk = false;

        finish();
    }

}

PictureCallback mPicture = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        Log.e("Camrera", "22222222222222222");
        BitmapFactory.Options bfo = new BitmapFactory.Options();
        bfo.inDither = false;
        //bfo.inJustDecodeBounds = true;
        bfo.inPurgeable = true;
        bfo.inTempStorage = new byte[16 * 1024];

        Intent intent = new Intent(context, PreviewActivity.class);
        //intent.putExtra("data", data);
        Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data, 0,
                data.length, bfo);
        Matrix matrix = new Matrix();
        if (Constant.result == 180) {
            matrix.postRotate(270);
        }
        if (Constant.result == 270) {
            matrix.postRotate(180);
        }
        int height = bitmapPicture.getHeight();
        int width = bitmapPicture.getWidth();
        Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmapPicture,
                height, width, true);
        Bitmap rotatedBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
                scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix,
                true);
        ByteArrayOutputStream blob = new ByteArrayOutputStream();
        Log.e("Camrera1", "22222222222222222");
        rotatedBitmap.compress(CompressFormat.JPEG,
                50 /* ignored for PNG */, blob);
        byte[] bitmapdata = blob.toByteArray();
        Constant.imageData = bitmapdata;
        Log.e("Camrera2", "22222222222222222");
        startActivity(intent);

    }
};
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    if (previewing) {
        camera.stopPreview();
        previewing = false;
    }

    if (camera != null) {
        try {
            camera.setPreviewDisplay(holder);
            camera.startPreview();
            setCameraDisplayOrientation(this, cameraId, camera);
            previewing = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public static void setCameraDisplayOrientation(Activity activity,
        int cameraId, android.hardware.Camera camera) {
    android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
    android.hardware.Camera.getCameraInfo(cameraId, info);
    int rotation = activity.getWindowManager().getDefaultDisplay()
            .getRotation();
    int degrees = 0;
    switch (rotation) {
    case Surface.ROTATION_0:
        degrees = 0;
        Constant.result = 0;
        break;
    case Surface.ROTATION_90:
        degrees = 90;
        Constant.result = 90;
        break;
    case Surface.ROTATION_180:
        degrees = 180;
        Constant.result = 180;
        break;
    case Surface.ROTATION_270:
        degrees = 270;
        Constant.result = 270;
        break;
    }

    int result;
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        result = (info.orientation + degrees) % 360;
        result = (360 - result) % 360; //compensate the mirror
    } else { //back-facing
        result = (info.orientation - degrees + 360) % 360;
    }
    camera.setDisplayOrientation(result);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    camera = Camera.open();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    camera.stopPreview();
    camera.release();
    camera = null;
    previewing = false;
}

@Override
protected void onStop() {
    super.onStop();

    Log.e("Tab", "Stoping");
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_BACK) {

        return true;

    }
    return super.onKeyDown(keyCode, event);

}

}

Rotierender Handy schnell um 180 Grad, Kamera-Vorschau dreht sich kopfüber

  • Lösung: tun Sie das nicht. es ist ein hardware-Problem.
  • so gibt es keine Lösung für dieses problem?
  • vielleicht, ich glaube einfach nicht, es hat nichts zu tun mit Ihrem code.
  • Überprüfen Sie diesen thread: stackoverflow.com/questions/12059447/...
  • Danke für Ihre Antwort. Aber es ist nicht für mich arbeiten.
  • mögliche Duplikate von Kamera gedreht direkt und schnell
  • Sie erhalten sogar die surfaceChanged() Rückruf, wenn Sie schnell drehen, von Landschaft zu Landschaft?
  • ich weiß es nicht.
  • Bitte fügen Sie eine log-Nachricht ist es. Ich vermute, dass Ihr Telefon einfach ignoriert die schnelle rotation und kein Neustart der Oberfläche. Wenn es das ist, was passiert ist, müssen Sie überprüfen Sie die Ausrichtung sensor selbst, und starten Sie neu, und Sie sich nicht auf die surfaceChanged().
  • Es nicht empfangen kann, die surfaceChange() callback, wenn Sie schnell drehen, von Landschaft zu Landschaft. Nun, was kann ich tun. Bitte Helfen Sie mir...
  • bitte helfen Sie mir. Ihre Annahme ist richtig. Nun, wie kann ich dieses problem lösen?
  • Wenn Sie legte langsam das Telefon (Landschaft) flach auf den Tisch, dann langsam zu pick it up reverse-Landschaft, macht Sie die Oberfläche drehen, richtig?
  • Öffnen Sie den Rechner, zeigen, dass es im landscape-Modus, drehen Sie es, um reverse-Landschaft. Wird der Bildschirm zeigt den Kopf stellen?
  • Ich legte langsam das Telefon (Landschaft) flach auf den Tisch, dann langsam zu pick it up reverse-Landschaft, die Oberfläche nicht richtig drehen.
  • Ich öffnete den Rechner, sah es im landscape-Modus, dann schnell drehen Sie Sie, um reverse-Querformat, wird der Bildschirm nicht auf den Kopf. Es war korrekt.
  • Ich warte auf deine Antwort Bruder.
  • Ja, ich habe Ihre app auf minimum, und ich zu sehen, dass 180° - Drehung nicht auslösen das Ereignis erwartet. Sie Graben.
  • Also @AlexCohn, gibt es eine Lösung? Bitte helfen Sie mir, wenn es irgendeine Lösung, denn es ist mir sehr wichtig. Vielen Dank für die Ausgaben Ihrer wertvollen Zeit. Ich warte immer noch auf deine Antwort.
  • Siehe stackoverflow.com/questions/4843809/....
  • Siehe auch Wie zu erkennen, screen rotation um 180 Grad vom hoch-zum Querformat?, die diskutiert teh breitere Frage, einschließlich der Fall, wenn die Ausrichtung geändert wird programmgesteuert.

Schreibe einen Kommentar