【问题标题】:How to get PCI info about display device on Android如何在 Android 上获取有关显示设备的 PCI 信息
【发布时间】: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 分发而设计的,所以我绝对不能根这些设备。

有什么想法吗?

谢谢!

【问题讨论】:

    标签: java android c++ c pci


    【解决方案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)
    猜你喜欢
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2014-06-08
    • 2016-07-22
    相关资源
    最近更新 更多