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);
}
}
- 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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie OrientationEventListener auslösen der Neuberechnung der rotation der Kamera.
Hinzufügen, um Ihre Tätigkeit:
zu
onCreate()
:zu
surfaceCreated()
:zu
surfaceDestroyed()
:Nun ist es fast funktioniert. Um
setCameraDisplayOrientation()
robuster,camera != null
camera.setDisplayOrientation(result)
(oder führen Sie keine schweren heben), wennresult
geändert seit dem letzten mal die Funktion aufgerufen wurde.SurfaceHolder.Callback.surfaceDestroyed()
und nichtActivity.onDestroy()
.SurfaceHolder.Callback.surfaceDestroyed()
es scheint nicht synchronisiert zu jedem onPause/onStop/etc. also meiner Experimente war es, die aufgerufen wird, wenn die activty war bereits gegangen und ich war im launcher. Auch wenn Sie drücken Sie die power-Taste aus irgendeinem GrundSurfaceHolder.Callback.surfaceDestroyed()
werden nicht genannt, überhaupt.SurfaceHolder.Callback.surfaceDestroyed()
so dass jede Ressource die Reinigung getan werden muss, onPause() oder ähnliches in das fragment und so hatte ich zu tunorientationListener.disable()
in onPause()setDisplayOrientation()
(oder heavy-lifting überhaupt) nur, wennresult
hat seit dem letzten mal geändert.savedResult=0
in onPauseFügen Sie diese Zeile in der Android-Manifest-Datei nach dem deklarieren alle Aktivitäten in Aktivität-tags *
Werden kann, wird es hilft Ihnen.