requestNetworkScan-返回无效的单元格标识-Android P

时间:2018-07-24 13:47:12

标签: android radio modem ril android-9.0-pie

我正在开发特权系统应用程序以扫描网络。执行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());
 }

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

2 个答案:

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

答案 1 :(得分:0)

requestNetworkScan具有与getAvailableNetworks类似的功能。这些功能正在进行高级网络扫描以查找附近的运营商。调制解调器仅在寻找一组唯一的PLMN(即载波标识符),并且没有停留在足够长的小区上以找到更详细的信息(例如小区标识)。

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