Проверьте доступность любого датчика в Android: PackageManager vs SensorManager - PullRequest
0 голосов
/ 22 сентября 2018

Я читал о сенсорах в Android и способах проверки их доступности на устройстве.Но я столкнулся с каким-то противоречием. Официальное руководство по Android говорит, что следует использовать SensorManager следующим образом:

private SensorManager mSensorManager;
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)) {
    // device has Accelerometer sensor...
}

, чтобы получить объект Sensor и проверить, является ли он null или нет.Но, насколько я понимаю, есть другой (похожий?) Способ сделать это, используя вместо этого PackageManager:

private PackageManager mPackageManager;
mPackageManager = mContext.getPackageManager();

if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER)) {
    // device has Accelerometer sensor...
}

Я бы без колебаний воспользовался подходом из официального руководства, но нашел этот тест , который говорит, что правильный путь через PackageManager:

Ответ.Правильный ответ - Ответ 1, версия, которая использует PackageManager.

SensorManager и Sensor являются частью Android Sensor Framework и используются для прямого доступа и сбора необработанных данных датчика.Эти классы не предоставляют какого-либо метода, такого как hasSystemFeature (), который используется для оценки возможностей системы.

Android определяет идентификаторы функций в форме ENUM для любых аппаратных или программных функций, которые могут быть доступны на устройстве.,Например, идентификатор функции для датчика компаса: FEATURE_SENSOR_COMPASS.

Если ваше приложение не может работать, если в системе не доступна определенная функция, вы можете запретить пользователям устанавливать ваше приложение с элементом в файле манифеста вашего приложения.чтобы указать необоротную зависимость.

Однако, если вы просто хотите отключить определенные элементы вашего приложения, когда функция отсутствует, вы можете использовать класс PackageManager.PackageManager используется для получения различного рода информации, связанной с пакетами приложений, которые в настоящее время установлены на устройстве.

Итак, мой вопрос: есть ли разница в том, как я это делаю?Должен ли я предпочесть SensorManager или PackageManager?Зачем? Должен или Может Я использую их обоих как

if(mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) && 
    mPackageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER)) {
    // device (surely?) has Accelerometer sensor...
}

?

Спасибо всем заранее!

...