android 8.1 disable unsupported sensor

如果device不支持某种sensor,可以在android/frameworks/base/core/java/android/hardware/SystemSensorManager.java里将其disabled掉。以disable proximity sensor为例。

复制代码
public SystemSensorManager(Context context, Looper mainLooper) {
        synchronized(sLock) {
            if (!sNativeClassInited) {
                sNativeClassInited = true;
                nativeClassInit();
            }
        }
 
        mMainLooper = mainLooper;
        mTargetSdkLevel = context.getApplicationInfo().targetSdkVersion;
        mContext = context;
        mNativeInstance = nativeCreate(context.getOpPackageName());
 
        // initialize the sensor list
        for (int index = 0;;++index) {
            Sensor sensor = new Sensor();
            if (!nativeGetSensorAtIndex(mNativeInstance, sensor, index)) break; 
            //disable p_sensor solution: Remove proximity sensor from sensor list.
            if ((sensor != null) && sensor.getType() == Sensor.TYPE_PROXIMITY){
                Log.i(TAG,"skip proximity sensor");
                continue;
            }
            mFullSensorsList.add(sensor);
            mHandleToSensor.put(sensor.getHandle(), sensor);
        }
    }

就是将p_sensor 从mFullSensorsList中移出。这一步基本上已经work了(SensorManager#getSensorList(8)得不到p_sensor的讯息),但是如果你的code还需要通过CTS测试,那么最好在android/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java的hasSystemFeature方法里做remove proximity sensor feature

复制代码
public boolean hasSystemFeature(String name, int version) {
        // allow instant applications
        synchronized (mAvailableFeatures) {
            final FeatureInfo feat = mAvailableFeatures.get(name);
            if (feat == null) {
                return false;
            } else {
                
                    //remove proximity sensor feature
                    if(name.equals("android.hardware.sensor.proximity")){
                        Log.w(TAG, "skip standard  proximity sensor");
                        return false;
                      }
                
                return feat.version >= version;
            }
        }
    }

这样一来PackageManager#hasSystemFeature(android.hardware.sensor.proximity) return false。

可用命令adb shell pm list features来检查device都support 那些功能。

或者尝试删除frameworks\native\data\etc下相关的配置文件

相关推荐
rocpp13 小时前
Android 相册选择与拍照接入实践:MediaStore 分页、权限适配与 FileProvider
android
Flynt13 小时前
升级Flutter 3.44,我踩了HCPP和AGP 9的坑
android·flutter·dart
白色牙膏14 小时前
Cocos Creator 2.4.x 接入 AdMob 插件的迁移实践
android
我命由我1234516 小时前
C++ - 面向对象 - 常成员函数
android·java·linux·c语言·开发语言·c++·算法
tryqaaa_16 小时前
学习日志(四)【php反序列化魔术方法以及pop构造配实战】
android
Java小学生丶18 小时前
记录一下我的 Gradle 开发环境配置过程
android·java·gradle·maven·安卓
问心无愧051319 小时前
ctf show web 入门256
android·前端·笔记
霸道流氓气质19 小时前
MySQL 索引设计实战指南
android·数据库·mysql
R语言爱好者19 小时前
叠氮酸介绍
android
方白羽19 小时前
Android WebView 中实现第三方 QQ 登录的架构与流程详解
android·app