我正在开发特权系统应用程序以扫描网络。执行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上尝试过。
答案 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),但目前似乎并未针对这些值返回任何有效信息。