如何在 Android 上获取有关显示设备的 PCI 信息

Posted

技术标签:

【中文标题】如何在 Android 上获取有关显示设备的 PCI 信息【英文标题】:How to get PCI info about display device on Android 【发布时间】:2015-02-18 16:09:33 【问题描述】:

早安,伙计们!

我正在将桌面 OpenGL c++ 应用程序移植到 android。这个应用程序已经相当跨平台了。它需要在所有平台上进行可靠的渲染,因此它通过基于主机操作系统和卡的 PCI 信息启用或禁用某些代码路径来解决图形驱动程序实现的差异。具体来说,它会切换设备、供应商和修订 ID。

我需要从 Android 中获取这些 PCI ID。

我更喜欢从本机代码以编程方式执行此操作,但 JNI 路径甚至解析外部命令的输出都是合理的选择。

我一直在四处寻找,但找不到任何可靠的东西。我能想到的任何涉及 Android 和 PCI 或 ID 的谷歌搜索,即使经过大量过滤,也会返回获取 Android 设备的 ID、所有已知 PCI 设备 ID 的数据库或列表,或 PCI 安全标准委员会。与实际的 PCI 接头无关。也许我只是需要更多的 google-fu?

Android 上没有 lspci。在 adb shell 中四处寻找,我看到没有可访问的 /sys 文件系统并且 /proc/bus/pci/devices 是空的。我见过的最接近的是 Tegra 上的 /proc/device-tree/nvidia-boardids,它打印出一个相当神秘的字符串,我很确定它包含这些 ID。这可能适用于拥有它的设备,但这只是运行 nVidia 卡的设备的子集。

作为最后的手段,我们或许可以使用从 glGetString 返回的信息,但它的变化远不止 PCI ID。我强烈希望避开这条路线。

这个应用程序是为 Google Play 分发而设计的,所以我绝对不能根这些设备。

有什么想法吗?

谢谢!

【问题讨论】:

【参考方案1】:

这里是java类

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.CellInfo;
import android.telephony.CellInfoLte;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.Window;
import android.widget.TextView;
import java.util.List;

public class MainActivity extends AppCompatActivity 

phoneStateListener listener;
TelephonyManager telephonyManager;
TextView tv;

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

    telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    listener = new phoneStateListener();
    telephonyManager.listen(listener,PhoneStateListener.LISTEN_CELL_INFO);
    tv = (TextView) findViewById(R.id.tv);


@Override
protected void onResume() 
    super.onResume();


public class phoneStateListener extends PhoneStateListener
    public phoneStateListener()

    

    @Override
    public void onCellInfoChanged(List<CellInfo> cellInfo) 
        super.onCellInfoChanged(cellInfo);
        for(CellInfo m: cellInfo)
            if (m instanceof CellInfoLte)
                CellInfoLte cellInfoLte=(CellInfoLte) m;
                int pciNum = cellInfoLte.getCellIdentity().getPci();
                Log.d("onCellInfoChanged", "CellInfoLte--" + m);
                tv.setText("PCINUMBER: "+pciNum);
            
    


@Override
protected void onStop() 
    super.onStop();
    telephonyManager = null;


别忘了使用权限 android.permission.READ_PHONE_STATE android.permission.ACCESS_COARSE_LOCATION

【讨论】:

给我以下运行时错误:FATAL EXCEPTION: main Process: com.example.me.antennas, PID: 21831 java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object referencefor (CellInfo m : cellInfo)

以上是关于如何在 Android 上获取有关显示设备的 PCI 信息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 adb 将文件复制到可从 PC 访问的 android 目录

如何使用 WIFI 将消息从 android 设备发送到 PC

如何在windows pc和android设备之间建立蓝牙连接

如何在 Android 10 中获取有关手机 IMEI 的信息?

如何在 Android 上获取和修改元数据以支持音频文件?

如何在 Javascript 中获取 PC 中的操作系统版本