Android:PackageManager.getSystemAvailableFeatures() 在 Nexus9 上没有按预期工作

Posted

技术标签:

【中文标题】Android:PackageManager.getSystemAvailableFeatures() 在 Nexus9 上没有按预期工作【英文标题】:Android: PackageManager.getSystemAvailableFeatures() is not working as expected on Nexus9 【发布时间】:2015-03-20 21:48:21 【问题描述】:

我正在尝试使用PackageManager.getSystemAvailableFeatures() 在我的 Nexus9 设备上获取所有可用的系统功能。

android 5.0 Lollipop 开始,Google 引入了new camera APIs (camera2)。我认为 Nexus9 正在使用 Camera2 API。

当我在 Nexus9 设备上运行此 API 时,它没有列出 camera2 API 功能,例如:

android.hardware.camera.level.full

android.hardware.camera.capability.manual_post_processing

android.hardware.camera.capability.manual_sensor

android.hardware.camera.capability.raw

我正在使用以下代码来获取所有可用功能:

public final static boolean isFeatureAvailable(Context context, String feature) 
        final PackageManager packageManager = context.getPackageManager();
        final FeatureInfo[] featuresList = packageManager.getSystemAvailableFeatures();
        for (FeatureInfo f : featuresList) 
            if (f.name != null && f.name.equals(feature)) 
                 return true;
            
        

       return false;
    

问题:

    Nexus9 是否使用并拥有 camera2 API 功能?

    如果上述问题的答案是肯定的,那么为什么没有列出这些系统级功能?我做错了什么?

提前感谢您的 cmets!

【问题讨论】:

【参考方案1】:

Nexus9 是否使用并拥有 camera2 API 功能?

是的。所有 Android Lollipop 设备和更新的设备都有 camera2 API。

如果上述问题的答案是肯定的,那么为什么没有列出这些系统级功能?

支持的 API 通常不包含在系统功能列表中。大多数系统功能都与因设备而异的事物相关,通常与硬件功能(例如传感器、蓝牙、NFC 等)或系统范围的软件支持(例如备份、设备管理、多用户等)有关.有一个所有受支持功能的列表here。

我做错了什么?

根据docs,检查camera2 API是否存在的推荐方法是通过以下方式请求相机服务:

CameraManager cameraManager = (CameraManager) getSystemService("camera");

如果 camera2 API 不可用,这个方法基本上会返回 null,要么是因为 Android 版本太旧(sdkVersion

【讨论】:

迈克,谢谢你的回答。它有部分帮助。是的,您是,这些是设备功能而不是功能。以及如何获取有关这些能力的信息可以通过使用 CameraCharacteristics 类来实现。我已经发布了详细的答案。【参考方案2】:

我终于能够得到我的问题的答案。

Nexus9 是否使用并拥有 camera2 API 功能?

Ans:是的,Nexus9 拥有并使用 Camera2 API。它具有有限支持的硬件级别并具有以下功能:BACKWARD_COMPATIBLE 和 MANUAL_SENSOR

如果上述问题的答案是肯定的,那么为什么没有列出这些系统级功能?我做错了什么?

Ans:因为使用上面的代码,我列出的是功能而不是功能。列出我在下面的代码中使用的功能:

Activity activity = getActivity();
        CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
        try 
            for (String cameraId : manager.getCameraIdList()) 
                CameraCharacteristics characteristics
                        = manager.getCameraCharacteristics(cameraId);
                if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL) 
                    Log.d("Camera2 SUPPORTED_HARDWARE_LEVEL: ", "FULL");
                 else if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) 
                    Log.d("Camera2 SUPPORTED_HARDWARE_LEVEL: ", "LEGACY");
                 else if(characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED) 
                    Log.d("Camera2 SUPPORTED_HARDWARE_LEVEL: ", "LIMITED");
                

                StringBuilder stringBuilder = new StringBuilder();

                for (int i=0; i<characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES).length; i++) 
                    if(characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)[i] ==CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) 
                        stringBuilder.append("BACKWARD_COMPATIBLE" + "  ");
                     else if (characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)[i] ==CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING) 
                        stringBuilder.append("MANUAL_POST_PROCESSING" + "  ");
                     else if(characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)[i] ==CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR) 
                        stringBuilder.append("MANUAL_SENSOR" + "  ");
                     else if (characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)[i] ==CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW) 
                        stringBuilder.append("RAW" + "  ");
                    
               
                Log.d("Camera2: ", stringBuilder.toString());

【讨论】:

以上是关于Android:PackageManager.getSystemAvailableFeatures() 在 Nexus9 上没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制

Android游戏开发大全的目录