Перейти к содержанию
Fire Monkey от А до Я
  • 0

Получить уровень сигнала GSM/LTE


Pavel M

Вопрос

Как получить уровень приема сотовой сети?

 

Google пользоваться умею, а вот отсутствие опыта дает о себе знать.

Буду благодарен за ссылки, что почитать для общего понятия написания по android c учетом специфики Delphi.

 

 

Нашел:

TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
int dbm = 0;
if ( tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_LTE){
dbm = Integer.parseInt(parts[8])*2-113;
}
else{
if (signalStrength.getGsmSignalStrength() != 99) {
int intdbm = -113 + 2
* signalStrength.getGsmSignalStrength();
dbm = Integer.toString(intdbm);
}
}
public static final int LISTEN_SIGNAL_STRENGTH
Added in API level 1

 

This constant was deprecated in API level 7.
by LISTEN_SIGNAL_STRENGTHS

Listen for changes to the network signal strength (cellular).

Requires Permission: READ_PHONE_STATE

Constant Value: 2 (0x00000002)

 

 

 

 

Вот что пытаюсь сделать:

function  GetLevel: string;
var
  TelephonyObj: JObject;
  TelephonyManager: JTelephonyManager;
  Listner: JPhoneStateListener;
begin
  TelephonyObj := SharedActivityContext.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
  TelephonyManager := TJTelephonyManager.Wrap((TelephonyObj as ILocalObject).GetObjectID);
 Listner :=  TelephonyManager.listen(Listner, 2);

  result := JStringToString(Listner.toString); //ПОЛАГАЮ ПОЛУЧУ НАЗВАНИЕ КОМПОНЕНТА ВМЕСТО РЕЗУЛЬТАТА??? ))
end;

Пытаюсь и вот так

function  GetSim1Level: integer;
var
  TelephonyObj: JObject;
  TelephonyManager: JTelephonyManager;
  cellinfogsm: JCellInfoGsm;
  CellSignalStrengthGsm:  jcellSignalStrengthGsm;
  Level: integer;
begin
  TelephonyObj := SharedActivityContext.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);

  TelephonyManager := TJTelephonyManager.Wrap((TelephonyObj as ILocalObject).GetObjectID);
 cellinfogsm:= (TelephonyManager.getAllCellInfo.get(0) as JCellInfoGsm);


CellSignalStrengthGsm := cellinfogsm.getCellSignalStrength();
Result := cellSignalStrengthGsm.getLevel;

end;

В на выходе конечно же получаю ошибку...

 

Как я понимаю тут надо создать какой то ресивер?

Он используется постоянно и вызываетя при событии описываемой в Delphi процедурой?

Или к нему разовый доступ и получение текущей информации при обращении к его свойствам?

Прошу больше помочь не готовым кодом, а что почитать. Поскольку есть желание понять.

Изменено пользователем pvmmpv
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Код:

function TfMain.CheckMobileInternetSpeed: String;
var
  mTelephonyManagerObj: JObject;
  mTelephonyManager: JTelephonyManager;
  mNetworkType: Integer;
  ReturnValue: string;
begin
  mTelephonyManagerObj := SharedActivityContext.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
  mTelephonyManager := TJTelephonyManager.Wrap((mTelephonyManagerObj as ILocalObject).GetObjectID);

  mNetworkType := mTelephonyManager.getNetworkType();
  with TJTelephonyManager.JavaClass do
  begin
    if mNetworkType = NETWORK_TYPE_UMTS then ReturnValue := 'GPRS'
    else if mNetworkType = NETWORK_TYPE_UMTS then ReturnValue := 'EDGE'
    else if mNetworkType = NETWORK_TYPE_UMTS then ReturnValue := 'CDMA'
    else if mNetworkType = NETWORK_TYPE_UMTS then ReturnValue := '1xRTT'
    else if mNetworkType = NETWORK_TYPE_UMTS then ReturnValue := 'IDEN'
    else if mNetworkType = NETWORK_TYPE_UMTS then ReturnValue := 'UMTS'
    else if mNetworkType = NETWORK_TYPE_EVDO_0 then ReturnValue := 'EVDO_0'
    else if mNetworkType = NETWORK_TYPE_EVDO_A then ReturnValue := 'EVDO_A'
    else if mNetworkType = NETWORK_TYPE_HSDPA then ReturnValue := 'HSDPA'
    else if mNetworkType = NETWORK_TYPE_HSUPA then ReturnValue := 'HSUPA'
    else if mNetworkType = NETWORK_TYPE_HSPA then ReturnValue := 'HSPA'
    else if mNetworkType = NETWORK_TYPE_EVDO_B then ReturnValue := 'EVDO_B'
    else if mNetworkType = NETWORK_TYPE_EHRPD then ReturnValue := 'EHRPD'
    else if mNetworkType = NETWORK_TYPE_HSPAP then ReturnValue := 'HSPAP'
    else if mNetworkType = NETWORK_TYPE_LTE then ReturnValue := 'LTE';
end; 
Result := ReturnValue; 
end; 

Советую почитать, насчёт того, какие буквы используются чтоб отобразить уровень сигнала на андроиде (G, E, H, H+ и т.д.) 
П.с. учтите, что это уровень сигнала а не скорость подключения.

Изменено пользователем Alexander616
Ссылка на комментарий
  • 0

Спасибо.

Меня интересует именно уровень приема от вышки (не тип или скорость интернета).

А больше интересует как где рашририть свои знания как пользоваться сайтом android.developer - покупать книжку по программам под студию, изучить и тогда пытаться на родном Delphi?

Изменено пользователем pvmmpv
Ссылка на комментарий
  • 0
  • Модераторы

Кто-то может показать как на Delphi создать, зарегистрировать 

PhoneStateListener

 и заменить функцию

onSignalStrengthsChanged

которая принимает обратные вызовы?

я пробовал прикрутить событие делфовое, пока не получилось.

нужно посидеть чуть дольше, почитать.

 

у Ярослава в компоненте есть такое "присваивание", посмотрите FGX.ActionSheet.Android.pas

  TfgActionSheetListener = class(TJavaLocal, JDialogInterface_OnClickListener)
  private
    FOnButtonClicked: TfgNotifyButtonClicked;
  public
    constructor Create(const AOnButtonClicked: TfgNotifyButtonClicked);
    { JPopupMenu_OnMenuItemClickListener }
    procedure onClick(dialog: JDialogInterface; which: Integer); cdecl;
  end;
Ссылка на комментарий
  • 0
  • Модераторы

Код:

function TfMain.CheckMobileInternetSpeed: String;
var
  mTelephonyManagerObj: JObject;
  mTelephonyManager: JTelephonyManager;
  mNetworkType: Integer;
  ReturnValue: string;
begin
  mTelephonyManagerObj := SharedActivityContext.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
  mTelephonyManager := TJTelephonyManager.Wrap((mTelephonyManagerObj as ILocalObject).GetObjectID);

  mNetworkType := mTelephonyManager.getNetworkType();
  with TJTelephonyManager.JavaClass do
  begin
    if mNetworkType = NETWORK_TYPE_UMTS then ReturnValue := 'GPRS'
    else if mNetworkType = NETWORK_TYPE_UMTS then ReturnValue := 'EDGE'
    else if mNetworkType = NETWORK_TYPE_UMTS then ReturnValue := 'CDMA'
    else if mNetworkType = NETWORK_TYPE_UMTS then ReturnValue := '1xRTT'
    else if mNetworkType = NETWORK_TYPE_UMTS then ReturnValue := 'IDEN'
    else if mNetworkType = NETWORK_TYPE_UMTS then ReturnValue := 'UMTS'
    else if mNetworkType = NETWORK_TYPE_EVDO_0 then ReturnValue := 'EVDO_0'
    else if mNetworkType = NETWORK_TYPE_EVDO_A then ReturnValue := 'EVDO_A'
    else if mNetworkType = NETWORK_TYPE_HSDPA then ReturnValue := 'HSDPA'
    else if mNetworkType = NETWORK_TYPE_HSUPA then ReturnValue := 'HSUPA'
    else if mNetworkType = NETWORK_TYPE_HSPA then ReturnValue := 'HSPA'
    else if mNetworkType = NETWORK_TYPE_EVDO_B then ReturnValue := 'EVDO_B'
    else if mNetworkType = NETWORK_TYPE_EHRPD then ReturnValue := 'EHRPD'
    else if mNetworkType = NETWORK_TYPE_HSPAP then ReturnValue := 'HSPAP'
    else if mNetworkType = NETWORK_TYPE_LTE then ReturnValue := 'LTE';
end; 
Result := ReturnValue; 
end; 
Советую почитать, насчёт того, какие буквы используются чтоб отобразить уровень сигнала на андроиде (G, E, H, H+ и т.д.) 

П.с. учтите, что это уровень сигнала а не скорость подключения.

Посмотрите как сделано у меня в DeviceInfo, это не скорость интернета, а тип сети. У меня там разбито сразу правильно, что к чему относится
Ссылка на комментарий
  • 0
Меня интересует именно уровень приема от вышки (не тип или скорость интернета).

 

Ещё раз Вам спасибо. Я видел Ваш пост.

Ваши значения получаются  mTelephonyManager.getNetworkType и добраться до них легко.

Такие же простые запросы (getGsmSignalStrength) есть у JSignalStrength он связан с JPhoneStateListener и как до них добраться из Delphi совсем не понятно.

.

Пробовал и по другому используя 

https://github.com/barisatalay/delphi-android-broadcast-receiver-component

procedure TfrmMain.FormCreate(Sender: TObject);begin
  SignalRcvr := TBroadcastReceiver.Create(self);
  SignalRcvr.onReceive := SignalReceiver;
  SignalRcvr.RegisterReceive;  SignalRcvr.Add('android.intent.action.SIG_STR');
end;

procedure TfrmMain.SignalReceiver(Context: JContext; Intent: JIntent);
var
  Signal: Integer;
begin
 signal := Intent.getIntExtra(StringToJString('asu'), -1);
 Memo1.Text := asu.toString;
end;

Ни чего не вышло, причем с батареей и получением её заряда от компонента всё получаю нормально.

Кстати оч. удобно через него вешать ресиверы по событиям. 

 

Было бы здорово если бы кто-то опытный вообще дал совет какую книгу почитать, пусть и используя google translite ))

Ссылка на комментарий
  • 0
  • Модераторы

Вы смотрели компонент, который я написал? Аналогично нужно сделать, только используя JPhoneStateListener

Ссылка на комментарий
  • 0

Вы смотрели компонент, который я написал? Аналогично нужно сделать, только используя JPhoneStateListener

 

 

Для понимания как это сделать я и написал.

 

вот это компилиться но конечно не работает

 

function TfrmMain.SignalStrength: integer;
var
  mTelephonyManagerObj: JObject;
  mTelephonyManager: JTelephonyManager;
  mListener: JPhoneStateListener;
  mSignal: JSignalStrength;
begin
  mTelephonyManagerObj := SharedActivityContext.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
  mTelephonyManager := TJTelephonyManager.Wrap((mTelephonyManagerObj as ILocalObject).GetObjectID);

  mTelephonyManager.listen(mListener, 256); //LISTEN_SIGNAL_STRENGTHS Constant Value: 256 (0x00000100)
  mListener.onSignalStrengthsChanged(mSignal);

  Result := mSignal.getGsmSignalStrength;
end;

Вот аналогий, в силу отсутствия опыта, я пока и не вижу.

Ссылка на комментарий
  • 0

Посмотрите исходник FMX.PhoneDialer.Android.pas в нем есть пример создания листенера 

Ярослав, спасибо за хороший совет, однако пока ни чего не получается:

 

создал класс:

type
  TPhoneStateListener = class(TJavaGenericImport<JPhoneStateListenerClass, JPhoneStateListener>)
      private
      public
    Constructor Create;
    Destructor Destroy; Override;
    procedure onCallForwardingIndicatorChanged(cfi: Boolean); cdecl;
    procedure onCallStateChanged(state: Integer; incomingNumber: JString); cdecl;
    procedure onCellInfoChanged(cellInfo: JList); cdecl;
    procedure onCellLocationChanged(location: JCellLocation); cdecl;
    procedure onDataActivity(direction: Integer); cdecl;
    procedure onDataConnectionStateChanged(state: Integer);  overload; cdecl;
    procedure onDataConnectionStateChanged(state: Integer; networkType: Integer);overload; cdecl;
    procedure onMessageWaitingIndicatorChanged(mwi: Boolean); cdecl;
    procedure onServiceStateChanged(serviceState: JServiceState); cdecl;
    procedure onSignalStrengthChanged(asu: Integer); cdecl;//Deprecated
    procedure onSignalStrengthsChanged(signalStrength: JSignalStrength); cdecl;
end; 

описал все процедуры пустыми, самую нужную:

procedure TPhoneStateListener.onSignalStrengthsChanged(signalStrength: JSignalStrength);
begin
  frmMain.txtSignal.text := intToStr(signalStrength.getGsmSignalStrength);
end;

попытался получить данные.

  Listner := TPhoneStateListener.Create;

  TelephonyObj := SharedActivityContext.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
  TelephonyManager := TJTelephonyManager.Wrap((TelephonyObj as ILocalObject).GetObjectID);

   TelephonyManager.listen(Listner.JavaClass.init, Listner.JavaClass.LISTEN_SIGNAL_STRENGTHS);

приложение запустилось результата - НЕТ  :unsure:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

присутствуют

Изменено пользователем pvmmpv
Ссылка на комментарий
  • 0
  • Администраторы

Я честно говоря вообще не понимаю вопрос. С одной стороны вы спросили про то, как узнать текущую силу сигнала. Привели код на java. Однако, потом почему-то стали использовать листенеры и тд. Давайте мы определимся, что вы хотите сделать и какие есть требования.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...