EasyDelphi Q&A

.تم الانتقال للموقع الجديد . وسيبقى الموقع القديم هذا متاح للقراءة فقط حتى الانتهاء من نقل كل الاسئلة إلى الموقع الجديد

يمكنك طرح الاسئلة والنقاشات في الموقع الجديد. الذهاب للموقع الجديد


0 تصويتات
171 مشاهدات
السلام عليكم اخواني الدلفاويين عندي سؤال في  كيفية عمل كوناكتيفتي في الدلفي اَي عندما ينقطع الاتصال يخبرني التطبيق بذلك و العكس ايضا و. حتي اذا. تغيرة حالة الاتصال من wifi الي 3g او 4g لبدان اضهر رسالة. شكرًا.  طبعا علي الكروس بلاتفورم
سُئل في تصنيف fmx بواسطة (120 نقاط) | 171 مشاهدات

2 إجابة

+1 تصويت

في نسخ الدلفي الجديدة اعتقد ما تريد موجود في   Androidapi.JNI.Net.pas

بكل الاحوال . جرب هذا . يجب يعمل في القديم والجديد : ( لا تنسى منح صلحية للوصول للانترنت ) 

unit Network;

interface

function IsConnected: Boolean;

function IsWiFiConnected: Boolean;

function IsMobileConnected: Boolean;

implementation

uses
  System.SysUtils,
  Androidapi.JNIBridge,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.JavaTypes,
  FMX.Helpers.Android, Androidapi.Helpers, Misc;

type
  JConnectivityManager = interface;
  JNetworkInfo = interface;

  JNetworkInfoClass = interface(JObjectClass)
  ['{E92E86E8-0BDE-4D5F-B44E-3148BD63A14C}']
  end;

  [JavaSignature('android/net/NetworkInfo')]
  JNetworkInfo = interface(JObject)
  ['{6DF61A40-8D17-4E51-8EF2-32CDC81AC372}']
    {Methods}
    function isAvailable: Boolean; cdecl;
    function isConnected: Boolean; cdecl;
    function isConnectedOrConnecting: Boolean; cdecl;
  end;
  TJNetworkInfo = class(TJavaGenericImport<JNetworkInfoClass, JNetworkInfo>) end;

  JConnectivityManagerClass = interface(JObjectClass)
  ['{E03A261F-59A4-4236-8CDF-0068FC6C5FA1}']
    {Property methods}
    function _GetTYPE_WIFI: Integer; cdecl;
    function _GetTYPE_WIMAX: Integer; cdecl;
    function _GetTYPE_MOBILE: Integer; cdecl;
    {Properties}
    property TYPE_WIFI: Integer read _GetTYPE_WIFI;
    property TYPE_WIMAX: Integer read _GetTYPE_WIMAX;
    property TYPE_MOBILE: Integer read _GetTYPE_MOBILE;
  end;

  [JavaSignature('android/net/ConnectivityManager')]
  JConnectivityManager = interface(JObject)
  ['{1C4C1873-65AE-4722-8EEF-36BBF423C9C5}']
    {Methods}
    function getActiveNetworkInfo: JNetworkInfo; cdecl;
    function getNetworkInfo(networkType: Integer): JNetworkInfo; cdecl;
  end;
  TJConnectivityManager = class(TJavaGenericImport<JConnectivityManagerClass, JConnectivityManager>) end;

function GetConnectivityManager: JConnectivityManager;
var
  ConnectivityServiceNative: JObject;
begin
  ConnectivityServiceNative := SharedActivityContext.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE);
  if not Assigned(ConnectivityServiceNative) then
    raise Exception.Create('Could not locate Connectivity Service');
  Result := TJConnectivityManager.Wrap(
    (ConnectivityServiceNative as ILocalObject).GetObjectID);
  if not Assigned(Result) then
    raise Exception.Create('Could not access Connectivity Manager');
end;

function IsConnected: Boolean;
var
  ConnectivityManager: JConnectivityManager;
  ActiveNetwork: JNetworkInfo;
begin
  ConnectivityManager := GetConnectivityManager;
  ActiveNetwork := ConnectivityManager.getActiveNetworkInfo;
  Result := Assigned(ActiveNetwork) and ActiveNetwork.isConnected;
end;

function IsWiFiConnected: Boolean;
var
  ConnectivityManager: JConnectivityManager;
  WiFiNetwork: JNetworkInfo;
begin
  ConnectivityManager := GetConnectivityManager;
  WiFiNetwork := ConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_WIFI);
  Result := WiFiNetwork.isConnected;
end;

function IsMobileConnected: Boolean;
var
  ConnectivityManager: JConnectivityManager;
  MobileNetwork: JNetworkInfo;
begin
  ConnectivityManager := GetConnectivityManager;
  MobileNetwork := ConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_MOBILE);
  Result := MobileNetwork.isConnected;
end;

end.

 

تم الرد عليه بواسطة (32,580 نقاط)
0
شكرا استاذ على سرعة الرد لكن هذه الوحدة لا تحتوي على حدث يشتغل اليا مع النضام يعني يجب عليك انت من تطلب الفنكشن او الجراء لتتعرف على معلومات النضام او تجرب هل هناك اتصال او لا و هذا ما قمت به في  الجزء الاول من الدرس في الرابط
 https://www.youtube.com/watch?v=XvsYUT1c3z8&index=32&list=PLfVdvKscEioOgxKhAz_LFBjrQcyXImD_K

اريد ان تشتغل الامور بصفة اطوماتكية في تطبيقي اذا انقصع الاتصال تضهر رسالة و اذا رجع الاتصال تحتفي رسالة التنبيه شكرا
0
لا اعتقد ان يكون هناك شيء جاهز لهذا . انت تتحدث عن CallBack . في الحالتين ان عملت callback او تحققت بنفسك .. النتيجة واحدة. انت بحاجة لفحص الـ state في التطبيق
شخصيا . لا افضل callback او اي شيء اخر في هذه الحالة . لانه بكل الاحوال انت بحاجة لمعرفة الحالة قبل تنفيذ اي شيء مباشرة . فلا ضمانات لتغيرها .
في حال فقط اذا اردت اظهار مؤشر اتصال او اي شيء يدل على حالة الاتصال . فمؤقت بسيط بزمن كبير . يكفي جدا . وحتى هذا لا يغني عن فحص الحالة قبل طلب الاجراءات مباشرة . او داخل الاجراءات نفسه كأول امر فيها ..
+1 تصويت

أولا أعتذر عن الغياب الطويل في الموقع و ذلك لأسباب عديدة و متعددة ... كما أشكر الأستاذ سامر أصيل على سعة صدره و على سهره الدائم لنجاح هذا الموقع المحترم بأعضائه المحترمين و بمحتواه الجدي و العفوي ...

ثانيا: أظن أن الأخ عبد العالي يبحث عن حل يعمل في جميع المنصات و بالخصوص الهاتف مع الرغم من إجابة الأستاذ سامر تبقى فكرة CallBack من دون أمثلة تحتاج دوما إلى حل مثالي أو لجواب نهائي ...( رغم أنها غير مجدية ما دامت تفتقر دوما إلى ضمانات).

      المهم للتعرف أكثر على الحل أدعوك أخي عبد العالي لمراجعة هذا المقال هنا 

  أما الكود مع أمثلة من هنا.

مثال عن  الوحدة المستعملة في نظام الأندرويد :

unit UNetworkState.Android;

interface

{$IFDEF ANDROID}
uses
  System.SysUtils, System.Classes, UNetworkState, UNetworkStateBroadcastReceiver,
  Androidapi.JNIBridge, Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.JavaTypes, FMX.Helpers.Android, Androidapi.JNI.Net,
  Androidapi.Helpers;

type
  TAndroidNetworkState = class (TNetworkState)
  private
    FBroadcastReceiver: TNetworkStateBroadcastReceiver;
    FConnectivityManager: JConnectivityManager;

    function GetConnectivityManager: JConnectivityManager;
  protected
    procedure DoOnConnectivityBroadcastAction(Sender: TObject);
    function GetCurrentValue: TNetworkStateValue; override;
  public
    constructor Create(AOwner: TComponent;
      AOnChange: TNetworkStateChangeEvent); reintroduce; override;
  end;
{$ENDIF}

implementation

{$IFDEF ANDROID}

{ TAndroidNetworkState }

constructor TAndroidNetworkState.Create(AOwner: TComponent;
  AOnChange: TNetworkStateChangeEvent);
begin
  self.FConnectivityManager := self.GetConnectivityManager;

  self.FBroadcastReceiver := TNetworkStateBroadcastReceiver.Create(
    self, self.DoOnConnectivityBroadcastAction
  );

  inherited;
end;

function TAndroidNetworkState.GetConnectivityManager: JConnectivityManager;
var
  ConnectivityServiceNative: JObject;
begin
  ConnectivityServiceNative := TAndroidHelper.Context.getSystemService(
    TJContext.JavaClass.CONNECTIVITY_SERVICE
  );

  if not Assigned(ConnectivityServiceNative) then
    raise Exception.Create('Could not locate Connectivity Service');

  Result := TJConnectivityManager.Wrap((ConnectivityServiceNative as ILocalObject).GetObjectID);

  if not Assigned(Result) then
    raise Exception.Create('Could not access Connectivity Manager');
end;

procedure TAndroidNetworkState.DoOnConnectivityBroadcastAction(Sender: TObject);
begin
  self.DoOnChange;
end;

function TAndroidNetworkState.GetCurrentValue: TNetworkStateValue;
var
  ActiveNetwork: JNetworkInfo;
  Connected: boolean;
begin
  ActiveNetwork := self.FConnectivityManager.getActiveNetworkInfo;

  Connected := Assigned(ActiveNetwork) and ActiveNetwork.isConnectedOrConnecting;

  if Connected then begin
    if ActiveNetwork.getType = TJConnectivityManager.JavaClass.TYPE_WIFI then
      Result := nsConnectedWifi
    else
      Result := nsConnectedMobileData;
  end
  else
    Result := nsDisconnected;
end;

{$ENDIF}

end.

 

و في الأخير حظا طيبا ...

تم الرد عليه بواسطة (21,520 نقاط)
0
و عليكم السلام شكرا على الرابط جاري التجريب

اسئلة متعلقة

+1 تصويت
1 إجابة
سُئل سبتمبر 15، 2019 في تصنيف Delphi بواسطة Amar Gozim (11,220 نقاط) | 53 مشاهدات
+2 تصويتات
1 إجابة
سُئل سبتمبر 19، 2018 في تصنيف SQL Server بواسطة Yamada Fakir (1,810 نقاط) | 101 مشاهدات
+1 تصويت
1 إجابة
سُئل أغسطس 20، 2018 في تصنيف vcl بواسطة Yamada Fakir (1,810 نقاط) | 323 مشاهدات
+3 تصويتات
2 إجابة
0 تصويتات
1 إجابة
سُئل يوليو 2، 2019 في تصنيف fmx بواسطة العالم الاخضر (310 نقاط) | 98 مشاهدات
ادعُ اصدقائك في الفايسبوك لمشاركتك
Comodo SSL

مرحبًا بك إلى EasyDelphi Q&A، حيث يمكنك طرح الأسئلة والحصول على الإجابة عليها من المستخدمين الآخرين.

لا يسمح بطلب او السؤال عن كراك او تفعيل او كسر او فك او اي شيء يخالف اتفاقيات الترخيص  مهما كان السبب ومهما كان البرنامج ونوعه. ولا حتى نشر روابط تحتوي على مثل هذه الاشياء لا في الاسئلة ولا في الاجابات ولا التعليقات . نهائيا

497 سؤال
752 إجابة
1,417 تعليق
271 مستخدم