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

时间:2015-02-18 16:09:33

标签: java android c++ c pci

早上好,伙计们!

我正在将一个桌面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 个答案:

答案 0 :(得分: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