HardwarePropertiesManager 不工作

HardwarePropertiesManager is not working

我正在尝试使用 HardwarePropertiesManager (https://developer.android.com/reference/android/os/HardwarePropertiesManager.html) 访问信息。我正在使用 Android 7.0(API 级别 24)和以下代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView helloTV = findViewById(R.id.helloTV);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            HardwarePropertiesManager hardwarePropertiesManager = getApplicationContext().getSystemService(HardwarePropertiesManager.class);
            CpuUsageInfo[] cpuUsages = hardwarePropertiesManager.getCpuUsages();
            ///...

现在,当我的应用程序找到 hardwarePropertiesManager.getCpuUsages(); 行时,它会抛出以下异常:


java.lang.RuntimeException: Unable to start activity ComponentInfo{gr.serafeim.sensorplayground/gr.serafeim.sensorplayground.MainActivity}: java.lang.SecurityException: The caller is not a device or profile owner or bound VrListenerService.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2659)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6123)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
     Caused by: java.lang.SecurityException: The caller is not a device or profile owner or bound VrListenerService.
        at android.os.Parcel.readException(Parcel.java:1683)
        at android.os.Parcel.readException(Parcel.java:1636)
        at android.os.IHardwarePropertiesManager$Stub$Proxy.getCpuUsages(IHardwarePropertiesManager.java:127)
        at android.os.HardwarePropertiesManager.getCpuUsages(HardwarePropertiesManager.java:155)
        at gr.serafeim.sensorplayground.MainActivity.onCreate(MainActivity.java:21)
        at android.app.Activity.performCreate(Activity.java:6672)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1140)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2612)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6123) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 

谁能给我解释一下:

getCpuUsages 的文档只是说它会抛出一个 SecurityException "if something other than the device owner or the current VR service tries to retrieve information provided by this service" -- 这并没有说明任何事情。

经过一番研究,我发现了问题所在。使用 HardwarePropertiesManager API 仅允许在企业配置的 Android 设备中使用(参见此处 https://developer.android.com/work/overview.html and here https://sdgsystems.com/blog/introduction-android-work)。因此,此 API 主要用于 Kiosk 模式(或自带设备 - BYOD)的设备,以便您轻松地远程监控此设备。 "device owner" 或 "profile owner" 指的是 BYOD 或 COSU - 公司拥有的单一用途应用程序或用户配置文件。

因此很遗憾,这个 API 不能被普通设备使用。