Konuyu Oyla:
  • Derecelendirme: 5/5 - 3 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Mobil platformlarda (Android, iOS) internet bağlantısı kontrolü yapmak
#1
Merhaba;
Android ve iOS (Mobil) platformları için daha önce Dave Nottage (Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.) tarafından Delphi XE5 ile bir örnek uygulama (Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.) yapılmış. 
Küçük değişikliklerle bu örneği Delphi 10.1 Berlin sürümünde derledim.

Örnekte isterseniz yalnızca bağlantı durumunu kontrol edebilirsiniz.

 if NS.IsConnected then
  Label1.Text := 'Bağlantı Var' 
   else
    Label1.Text := 'Bağlantı Yok';
 

İsterseniz bağlantı türü ile birlikte bağlantı kaynağını da tespit edebilirsiniz.

var
  NS: TNetworkState;
begin
  NS := TNetworkState.Create;
  try
    if not NS.IsConnected then
      Label1.Text := 'Bağlantı Yok'
    else if NS.IsWifiConnected then
      Label1.Text := 'Bağlantı Yöntemi: WiFi'
    else if NS.IsMobileConnected then
      Label1.Text := 'Bağlantı Yöntemi: WWAN (Mobil)';
    Label2.Text := NS.CurrentSSID;
  finally
    NS.Free;
  end;
end;

Kullanmadan önce Android Platformu için Project > Options > Uses Permissions kısmından Access network state ve Access wifi state izinlerini true yapın.

x9lzc.jpg

Uygulama Ekran Görüntüsü:
13zyj4x.jpg

Uygulama Linki: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

İyi çalışmalar...
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#2
Teşekkürler
Cevapla
#3
Teşekkürler. Xe8 de TNetworkState tanımıyor. Bunun için Library ve ya uses kısmına ne eklemeliyiz.?
Cevapla
#4
(07-12-2016, Saat: 15:06)apachi2006 Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Teşekkürler. Xe8 de TNetworkState tanımıyor. Bunun için Library ve ya uses kısmına ne eklemeliyiz.?

Merhaba,
Mesajımda, Uygulama linki kısmında örmek bir proje ve TNetworkState tipini barındıran Unit ektedir.
Uses ölümü;

uses
 NetworkState;
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#5
Networkstate kütüphanesi var sanırım xe8 de. Uses kısmına eklesemde görmüyor.
Cevapla
#6
(07-12-2016, Saat: 19:04)apachi2006 Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Networkstate kütüphanesi var sanırım xe8 de. Uses kısmına eklesemde görmüyor.

Networkstate, Delphi XE8'e ait değil, örnek proje klasöründe yer alıyor.
Bu unit'i projenize ekledikten (Project > Add) sonra, ayrıca Uses bölümüne de ekleyin.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#7
Merhaba Fesih Hocam;
IOS için test etmişmiydiniz acaba.

Aşağıdaki hatayı alıyorum. ilgili dosya klasörde yok.

[DCC Fatal Error] NetworkState.iOS.pas(21): F2613 Unit 'SCNetworkReachability' not found.
Cevapla
#8
Benzer yöntemle iOS ve Android hedef platformlarında İnternet Bağlantı Kontrolü ve Bağlantı Yöntemini alabileceğiniz bir referansı paylaşıyorum.
Android Platformunda test sorunsuz çalışıyor.
 
unit NetworkState;

interface

uses classes
{$IFDEF IOS}
   , Macapi.ObjectiveC, Macapi.CoreFoundation, Macapi.Dispatch,
 iOSApi.CocoaTypes, iOSApi.Foundation, Posix.SysSocket, Androidapi.Jni.App
{$ENDIF}
{$IFDEF ANDROID}
   , System.SysUtils, FMX.Helpers.Android, Androidapi.JNIBridge, Androidapi.JNI.GraphicsContentViewText,
 Androidapi.JNI.JavaTypes, Androidapi.Helpers
{$ENDIF}
   ;
{$IFDEF IOS}

const
 libSystemConfiguration = '/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration';
 kSCNetworkFlagsConnectionAutomatic = 8;
 kSCNetworkFlagsConnectionRequired = 4;
 kSCNetworkFlagsInterventionRequired = 16;
 kSCNetworkFlagsIsDirect = 131072;
 kSCNetworkFlagsIsLocalAddress = 65536;
 kSCNetworkFlagsReachable = 2;
 kSCNetworkFlagsTransientConnection = 1;
 kSCNetworkReachabilityFlagsConnectionAutomatic = 8;
 kSCNetworkReachabilityFlagsConnectionOnDemand = 32;
 kSCNetworkReachabilityFlagsConnectionOnTraffic = 8;
 kSCNetworkReachabilityFlagsConnectionRequired = 4;
 kSCNetworkReachabilityFlagsInterventionRequired = 16;
 kSCNetworkReachabilityFlagsIsDirect = 131072;
 kSCNetworkReachabilityFlagsIsLocalAddress = 65536;
 kSCNetworkReachabilityFlagsReachable = 2;
 kSCNetworkReachabilityFlagsTransientConnection = 1;
 kSCNetworkReachabilityFlagsIsWWAN = $40000;
{$ENDIF}
{$IFDEF IOS}

type
 SCNetworkReachabilityFlags = UInt32;
 SCNetworkReachabilityRef = ^__SCNetworkReachability;

 __SCNetworkReachability = record
 end;

 SCNetworkReachabilityContext = record
   version: CFIndex;
   info: Pointer;
   retain: function(info: Pointer): Pointer;
   release: procedure(info: Pointer);
   copyDescription: function(info: Pointer): CFStringRef;
 end;

 SCNetworkReachabilityContextPtr = ^SCNetworkReachabilityContext;

 SCNetworkReachabilityCallback = procedure(target: SCNetworkReachabilityRef; flags: SCNetworkReachabilityFlags;
   info: Pointer);

 TReachability = class;

 Reachability = interface(NSObject)
   ['{B405394F-57B1-4FF1-83D9-8FBFA38FFD7B}']
   function startNotifier: LongBool; cdecl;
   procedure stopNotifier; cdecl;
   function isReachable: LongBool; cdecl;
   function isReachableViaWWAN: LongBool; cdecl;
   function isReachableViaWiFi: LongBool; cdecl;
   function isConnectionRequired: LongBool; cdecl;
   function connectionRequired: LongBool; cdecl;
   function isConnectionOnDemand: LongBool; cdecl;
   function isInterventionRequired: LongBool; cdecl;
   function currentReachabilityStatus: NSInteger; cdecl;
   function reachabilityFlags: SCNetworkReachabilityFlags; cdecl;
   function currentReachabilityString: NSString; cdecl;
   function currentReachabilityFlags: NSString; cdecl;
 end;

 ReachabilityClass = interface(NSObjectClass)
   ['{39EC0490-2787-4BB9-95EA-77BB885BFD01}']
   function reachabilityWithHostname(hostname: NSString): Pointer; cdecl;
   function reachabilityForInternetConnection: Pointer; cdecl;
   function reachabilityWithAddress: Pointer; cdecl;
   function reachabilityForLocalWiFi: Pointer; cdecl;
 end;

 TReachability = class(TOCGenericImport<ReachabilityClass, Reachability>)
 end;

function SCNetworkReachabilityCreateWithAddress(allocator: CFAllocatorRef; address: psockaddr)
 : SCNetworkReachabilityRef; cdecl;
 external libSystemConfiguration name _PU + 'SCNetworkReachabilityCreateWithAddress';

function SCNetworkReachabilityCreateWithAddressPair(allocator: CFAllocatorRef; localAddress: psockaddr;
 remoteAddress: psockaddr): SCNetworkReachabilityRef; cdecl;
 external libSystemConfiguration name _PU + 'SCNetworkReachabilityCreateWithAddressPair';

function SCNetworkReachabilityCreateWithName(allocator: CFAllocatorRef; nodename: PChar): SCNetworkReachabilityRef;
 cdecl; external libSystemConfiguration name _PU + 'SCNetworkReachabilityCreateWithName';

function SCNetworkReachabilityGetTypeID: CFTypeID; cdecl;
 external libSystemConfiguration name _PU + 'SCNetworkReachabilityGetTypeID';

function SCNetworkReachabilityGetFlags(target: SCNetworkReachabilityRef; var flags: SCNetworkReachabilityFlags)
 : Boolean; cdecl; external libSystemConfiguration name _PU + 'SCNetworkReachabilityGetFlags';

function SCNetworkReachabilitySetCallback(target: SCNetworkReachabilityRef; callout: SCNetworkReachabilityCallback;
 var context: SCNetworkReachabilityContext): Boolean; cdecl;
 external libSystemConfiguration name _PU + 'SCNetworkReachabilitySetCallback';

function SCNetworkReachabilityScheduleWithRunLoop(target: SCNetworkReachabilityRef; runLoop: CFRunLoopRef;
 runLoopMode: CFStringRef): Boolean; cdecl;
 external libSystemConfiguration name _PU + 'SCNetworkReachabilityScheduleWithRunLoop';

function SCNetworkReachabilityUnscheduleFromRunLoop(target: SCNetworkReachabilityRef; runLoop: CFRunLoopRef;
 runLoopMode: CFStringRef): Boolean; cdecl;
 external libSystemConfiguration name _PU + 'SCNetworkReachabilityUnscheduleFromRunLoop';

function SCNetworkReachabilitySetDispatchQueue(target: SCNetworkReachabilityRef; queue: dispatch_queue_t): Boolean;
 cdecl; external libSystemConfiguration name _PU + 'SCNetworkReachabilitySetDispatchQueue';

{$IFDEF CPUARM}
function FakeLoader: Reachability; cdecl; external 'libReachability.a' name 'OBJC_CLASS_$_Reachability';
{$ENDIF}
{$ENDIF}
{$IFDEF ANDROID}

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;
{$ENDIF}

type
 TMobileNetworkStatus = class(TObject)
 public
   constructor Create;
   destructor Destroy; override;
   function isConnected: Boolean;
   function IsWiFiConnected: Boolean;
   function IsMobileConnected: Boolean;
 end;

implementation

{$IFDEF ANDROID}

function 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;

{$ENDIF}
{$IFDEF IOS}

function GetInternetReachability: Reachability;
begin
 Result := TReachability.Wrap(TReachability.OCClass.reachabilityForInternetConnection);
end;
{$ENDIF}

constructor TMobileNetworkStatus.Create;
begin
end;

destructor TMobileNetworkStatus.Destroy;
begin
 inherited;
end;

function TMobileNetworkStatus.isConnected: Boolean;
{$IFDEF ANDROID}
var
 ConnectivityManager: JConnectivityManager;
 ActiveNetwork: JNetworkInfo;
{$ENDIF}
begin
{$IFDEF IOS}
 Result := GetInternetReachability.isReachable;
{$ENDIF}
{$IFDEF ANDROID}
 ConnectivityManager := GetConnectivityManager;
 ActiveNetwork := ConnectivityManager.getActiveNetworkInfo;
 Result := Assigned(ActiveNetwork) and ActiveNetwork.isConnected;
{$ENDIF}
end;

function TMobileNetworkStatus.IsMobileConnected: Boolean;
{$IFDEF ANDROID}
var
 ConnectivityManager: JConnectivityManager;
 MobileNetwork: JNetworkInfo;
{$ENDIF}
begin
{$IFDEF IOS}
 Result := GetInternetReachability.isReachableViaWWAN;
{$ENDIF}
{$IFDEF ANDROID}
 ConnectivityManager := GetConnectivityManager;
 MobileNetwork := ConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_MOBILE);
 Result := MobileNetwork.isConnected;
{$ENDIF}
end;

function TMobileNetworkStatus.IsWiFiConnected: Boolean;
{$IFDEF ANDROID}
var
 ConnectivityManager: JConnectivityManager;
 WiFiNetwork: JNetworkInfo;
{$ENDIF}
begin
{$IFDEF IOS}
 Result := GetInternetReachability.isReachableViaWiFi;
{$ENDIF}
{$IFDEF ANDROID}
 ConnectivityManager := GetConnectivityManager;
 WiFiNetwork := ConnectivityManager.getNetworkInfo(TJConnectivityManager.JavaClass.TYPE_WIFI);
 Result := WiFiNetwork.isConnected;
{$ENDIF}
end;

initialization

{$IFDEF IOS}
{$IFDEF CPUARM}
if False then
 FakeLoader;
{$ENDIF}
{$ENDIF}
end.

Kaynak: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Kullanımı
  
private
   FNetWorkState: TMobileNetworkStatus;

var
 FNetWorkState: TMobileNetworkStatus;
begin
 FNetWorkState:= TMobileNetworkStatus.Create;
 try
   if not FNetWorkState.IsConnected then
     Memo1.Lines.Add('Bağlantı Yok')
   else if FNetWorkState.IsWifiConnected then
     Memo1.Lines.Add( 'Bağlantı Yöntemi: WiFi')
   else if FNetWorkState.IsMobileConnected then
     Memo1.Lines.Add('Bağlantı Yöntemi: WWAN (Mobil)');
 finally
   FNetWorkState.DisposeOf;
 end;
end;
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#9
Merhaba,

TNetworkState sınıfını kullanmadan, mevcut bilgilerle çözüm arayanlar için aklıma gelen en hızlı yöntemi paylaşmak istiyorum.

Eğer geliştirme yaptığınız uygulamada internet ihtiyacınız varsa ve veritabanı bağlantıları kullanıyorsanız çoğunlukla web servis yada api kullanımına ihtiyaç duyarsınız. Kullandığınız servisleri try-catch kod bloğu içine alarak basit bir exception ile denetleme yapabilirsiniz.

Şayet belirli periyotlarla bu işlemi tekrarlamak ve aplikasyon çalışırken arkaplanda veri gönderimi yapmak isterseniz TTimer kullanarak bu bahsettiğim kod bloğunu kontrol edersiniz Exception'a düşmediğinde internet bağlantısı var anlamına gelir ve işini yapar.

Umarım kısayol çözümü olarak birisinin ihtiyacını karşılayabilir.

Dipnot: Eğer exception yönetimleri için güzel bir sınıf yazarsanız, bu tarz hataları ayıklamak ve kontrol altına almak için özelleştirmeler yapabilirsiniz. Oldukça sağlıklı bir yöntemdir. Kullanıyor ve tavsiye ediyorum.

Tabi iş FMX'in Java kütüphanelerinden Bridge aracılığı ile Pascal kodlarına çevrilip doğrudan Native çözümler aramaksa, Fesih ARSLAN Hocamızın anlattığı yöntem kesinlikle en ideal çözüm olacaktır.

İyi günler.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla
#10
iyi günler Fesih bey bir sorum olucaktı rad studio 10.2 yi kullanıyorum android telefonda buton ile mobil veriyi açıp kapatmayı nasıl yapabilirim? Mobil verinin açık olup almadığını öğrenmek değil mobil veriyi kapalıysa açmak, açıksa kapatmayı nasıl yapabilirim?
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi 10.3 Android Servis Çalışma Sorunu Halil Han Badem 8 1.112 19-10-2019, Saat: 23:41
Son Yorum: malitutuncu
  Mobil Uygulamada Yazdırma İşlemi Hk. seydigozegir@gmail.com 5 165 16-10-2019, Saat: 16:09
Son Yorum: seydigozegir@gmail.com
  Android SDK Manager Güncellemeleri dnzmobile 11 1.990 29-09-2019, Saat: 20:58
Son Yorum: serdar
  Android 7 - android 9 cihankoca 10 391 26-09-2019, Saat: 11:49
Son Yorum: cihankoca
  Android read_contacts izini sorunu [COZULDU] codder71 3 189 25-09-2019, Saat: 22:32
Son Yorum: codder71



Konuyu Okuyanlar: 1 Ziyaretçi