Я использую камеру в android. Я сохранил деятельность как пейзаж в манифесте. Поскольку я задал ориентацию как фиксированную, я не могу получить ориентацию по дисплею. он всегда дает как LandScape. Но я хочу знать, когда мое устройство удерживается в портретном или вертикальном положении. Мне не нужна ориентация экрана. Может ли кто-нибудь предложить хороший способ определения ориентации устройства.
Спасибо всем
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();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
// Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
// Checks whether a hardware keyboard is available
if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
// Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show();
} else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
// Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show();
}
}
Я думаю, вам придется слушать обновления датчика акселерометра и анализировать их, чтобы определить, когда меняется ориентация. есть несколько примеров прослушивания датчиков здесь: http://www.anddev.org/accessing_the_accelerometer-t499.html и здесь http://mobilestrategist.blogspot.com/2010/01/android-accelerometer-and-orientation.html
Чтобы определить ориентацию экрана, вы можете использовать следующий код в своей деятельности
@Override
public void onConfigurationChanged(Configuration newConfig)
{ super.onConfigurationChanged(newConfig);
}
Спасибо Дипак
Попробуйте следующее: Сначала установите SensorEventListener и получите RotationSensor
sensorManager = (SensorManager)getActivity().getSystemService(Context.SENSOR_SERVICE);
rotationSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
sensorManager.registerListener(this, rotationSensor, SENSOR_INTERVAL);
int FROM_RADS_TO_DEGS = -57;
Затем вы можете определить угол устройства следующим образом:
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor == rotationSensor) {
if (event.values.length > 4) {
float[] truncatedRotationVector = new float[4];
System.arraycopy(event.values, 0, truncatedRotationVector, 0, 4);
updateRotation(truncatedRotationVector);
} else {
updateRotation(event.values);
}
}
}
private void updateRotation(float[] vectors) {
float[] rotationMatrix = new float[9];
SensorManager.getRotationMatrixFromVector(rotationMatrix, vectors);
int worldAxisX = SensorManager.AXIS_X;
int worldAxisZ = SensorManager.AXIS_Z;
float[] adjustedRotationMatrix = new float[9];
SensorManager.remapCoordinateSystem(rotationMatrix, worldAxisX, worldAxisZ, adjustedRotationMatrix);
float[] orientation = new float[3];
SensorManager.getOrientation(adjustedRotationMatrix, orientation);
float pitch = orientation[1] * FROM_RADS_TO_DEGS;
if(pitch < -45 && pitch > -135) {
// if device is laid flat on a surface, we don't want to change the orientation
return;
}
float roll = Math.abs(orientation[2] * FROM_RADS_TO_DEGS);
if((roll > 45 && roll < 135)) {
// The device is closer to landscape orientation. Enable fullscreen
if(!player.isFullScreen()) {
if(getActivity() != null) {
player.setFullScreenOn();
}
}
}
else {
// The device is closer to portrait orientation. Disable fullscreen
if(player.isFullScreen()) {
if(getActivity() != null) {
player.setFullScreenOff();
}
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// Do nothing
}
Это получило исходный код из учебника, но это было давно, поэтому я не могу вспомнить, где был учебник. Эта версия в значительной степени адаптирована к моим требованиям, но если кто ее узнает из оригинала, пожалуйста, перейдите по ссылке.
Я использовал этот код, чтобы определить, когда видеоплеер должен войти в полноэкранный режим в ViewPage, который я не хотел бы использовать для ориентации на альбом. Это хорошо работает, за исключением одного:
Он использует оборудование RotationSensor, и не все устройства Android имеют RotationSensor. Если кто-то знает способ сделать это, используя какое-то оборудование, которое включено во все устройства (определенно есть способ, потому что Android знает, когда переключать ориентацию), пожалуйста, дайте мне знать в комментарии, чтобы я мог обновить свой собственный код.
Я использую это:
@Override
public void onConfigurationChanged(Configuration _newConfig){
super.onConfigurationChanged(_newConfig);
int height = getWindowManager().getDefaultDisplay().getHeight();
int width = getWindowManager().getDefaultDisplay().getWidth();
if(width > height){
// landscape
}else{
// portrait
}
}
Это грубая, но эффективная.