На самом деле невозможно получить этот «угол места» на линии прямой видимости, поскольку вы не знаете, где находится пользователь ...
Однако вы можете предположить, что пользователь ориентирует экран устройства прямо к глазам.
С этим допущением вы можете использовать http://developer.android.com/reference/android/hardware/SensorManager.html#getRotationMatrix(float[], float [], float [], float []) , чтобы получить ориентацию устройства и получить угол между осью y и (x , z) плоскость.
Что он делает, так это использует акселерометр на оси 3, чтобы увидеть направление силы гравитации.
Это будет работать, только если устройство неподвижно. Если вам нужно лучше справляться с движением, вы должны использовать гироскоп, если он существует в устройстве.
Другое дело, что в зависимости от вашего приложения вы можете захотеть взглянуть на некоторые фреймворки дополненной реальности, если вы ищите именно такое приложение.
Редактировать: Вот код, который я собрал.
Основная функция в моем коде:
public void onSensorChanged(SensorEvent event) {
int sensor = event.type;
float[] values = event.values;
int i;
StringBuffer str=new StringBuffer();
// do something with the sensor data
TextView text = (TextView) findViewById(R.id.my_text);
float[] R = new float[9]; // rotation matrix
float[] magnetic = new float[3];
float[] orientation = new float[3];
magnetic[0]=0;
magnetic[1]=1;
magnetic[2]=0;
str.append("From Sensor :\n");
for(i=0;i<values.length; i++) {
str.append(values[i]);
str.append(", ");
}
SensorManager.getRotationMatrix(R, null, values, magnetic);
SensorManager.getOrientation(R, orientation);
str.append("\n\nGives :\n");
for(i=0;i<orientation.length; i++) {
str.append(orientation[i]);
str.append(", ");
}
text.setText(str);
}
Я не пробовал на реальном устройстве, только на эмуляторе и с использованием SensorSimulator .
Если вам нужен весь пакет исходного кода с парой инструментов, которые понадобятся вам для сенсорного имитатора, напишите мне, у меня есть все в упаковке.
Вместо того, чтобы составлять магнитные данные, вы можете получить их с компаса.
То, что вы ищете, это высота тона, которая находится в orientation[1]
, она варьируется от -pi / 2 до pi / 2.
Надеюсь, это поможет.