0

我正在开发一个特权系统应用程序来扫描网络。执行 API 后,结果不包含有效的小区身份信息。所有值都返回为 0、null 或 max int。

授予相关系统特权权限。

代码摘录:

public class ScannerActivity extends Activity implements View.OnClickListener {

     private final int PHONE_STATE_REQUEST = 1;
     private Button scanButton;
     private TextView resultsTextView;

     private class RadioCallback extends TelephonyScanManager.NetworkScanCallback {
     private List<CellInfo> mCellInfoResults;
     private int mScanError;

     @Override
     public void onResults(List<CellInfo> cellInfoResults) {
     mCellInfoResults = cellInfoResults;
     ScannerActivity.this.runOnUiThread(new Runnable() {
           @Override
           public void run() {
               for (CellInfo cellInfo:mCellInfoResults) {
                   resultsTextView.append(" " + cellInfo.toString() + " ");
               }
           }
       });
    }


     @Override
     public void onError(int error) {
          mScanError = error;
          ScannerActivity.this.runOnUiThread(new Runnable() {
               @Override
               public void run() {
                    resultsTextView.append(" Error: " + mScanError);
               }
          });
     }

     @Override
     public void onComplete() {
          ScannerActivity.this.runOnUiThread(new Runnable() {
              @Override
              public void run() {
                  resultsTextView.append(" Scan Completed! ");
             }
         });
     }

   }

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

          scanButton = (Button) findViewById(R.id.scan_button);
          scanButton.setOnClickListener(this);
          resultsTextView = (TextView)  findViewById(R.id.results_text_view);
     }



      public void onClick(View view) {

          NetworkScanRequest networkScanRequest;
          RadioAccessSpecifier radioAccessSpecifiers[];


     TelephonyManager telephonyManager = (TelephonyManager) getApplicationContext()
        .getSystemService(Context.TELEPHONY_SERVICE);

    radioAccessSpecifiers = new RadioAccessSpecifier[1];
    radioAccessSpecifiers[0] = new RadioAccessSpecifier(
        AccessNetworkConstants.AccessNetworkType.UTRAN,
        null,
        null);

         networkScanRequest = new NetworkScanRequest(
             NetworkScanRequest.SCAN_TYPE_ONE_SHOT,
             radioAccessSpecifiers,
             30,
             300,
             true,
             3,
             null);

      telephonyManager.requestNetworkScan(networkScanRequest,     AsyncTask.SERIAL_EXECUTOR,new RadioCallback());
 }

知道为什么会这样吗?在 Pixel 2 上试过。

4

2 回答 2

0

具有requestNetworkScangetAvailableNetworks. 这些功能正在执行高级网络扫描以查找附近的运营商。调制解调器只寻找一组唯一的 PLMN(即运营商标识符),不会在小区上停留足够长的时间来找到更详细的信息,例如小区身份。

RIL 应该能够返回有关小区的一些基本信息,例如频道(GSM 的 ARFCN、UMTS 的 UARFCN 和 LTE 的 EARFCN)和物理小区标识(GSM 的 BSIC、UMTS 的 PSC、LTE 的 PCI)但它目前似乎没有为这些值返回任何有效信息。

于 2019-02-06T13:36:36.883 回答
0

您可以检查无线电层是否响应您的 requestNetworkScan 提供了有效的小区身份信息。通过 cmd "adb logcat -v time -b radio"获取无线电日志并检查此日志中是否出现UNSOL_NETWORK_SCAN_RESULT API。以下是对这种不请自来的响应的描述。

/**
 * RIL_UNSOL_NETWORK_SCAN_RESULT
 *
 * Returns incremental result for the network scan which is started by
 * RIL_REQUEST_START_NETWORK_SCAN, sent to report results, status, or errors.
 *
 * "data" is NULL
 * "response" is a const RIL_NetworkScanResult *
 */
#define RIL_UNSOL_NETWORK_SCAN_RESULT 1049

响应结构 RIL_NetworkScanResult 具有以下字段:

typedef struct {
    RIL_ScanStatus status;              // The status of the scan
    uint32_t network_infos_length;      // Total length of RIL_CellInfo
    RIL_CellInfo_v12* network_infos;    // List of network information
    RIL_Errno error;
} RIL_NetworkScanResult;

如果此 UNSOL_NETWORK_SCAN_RESULT 响应返回 NULL 结构或根本没有 UNSOL_NETWORK_SCAN_RESULT 响应,则无线电 HAL 可能不支持此 API。

于 2018-12-04T12:06:43.987 回答