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

标签 java android c++ c pci

大家早上好!

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

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

我更愿意从 native 代码以编程方式执行此操作,但 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 分发,因此我绝对无法对这些设备进行 Root。

有什么想法吗?

谢谢!

最佳答案

这是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

关于java - 如何在 Android 上获取有关显示设备的 PCI 信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28588212/

相关文章:

java - 使用注释帮助第一个 spring MVC 页面

java - Set<String> 不保存所有数据?

android - 在 Android 中读取联系人

Android HTTP POST 文件上传不适用于 HttpUrlConnection

android - 从相机捕获图像并上传到 Firebase

c++ - 将位图转换为 HBITMAP

java - 数组的排列

java - 在android设备和pc(同一网络)之间使用套接字

c++ - 为什么我编辑的 WtWithQt 示例会崩溃?

c++ - 重载的 Operator 无法正常工作?