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 (http://delphiworlds.com/about-dave-nottage/) tarafından Delphi XE5 ile bir örnek uygulama (http://delphiworlds.com/2013/11/checking...elphi-xe5/) 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: https://mega.nz/#!DJ0VXKYJ!-Vmk3Tn14byI_...RGQtv5aBH0

İyi çalışmalar...
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ı: 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;
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ı: 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.
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: community.embarcadero.com

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;
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.
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
  Yerli Yapım Mobil Uygulamalar (FMX) TescilsizUzman 60 22.708 2 saat önce
Son Yorum: RAD Coder
  Android’de Dosya Depolama ve Paylaşma-2: And 11 SDK 30 Scoped Storage SAF MediaStore emozgun 12 4.728 19-03-2024, Saat: 22:29
Son Yorum: nguzeller
  Android 33 api sdk güncelleme [ÇÖZÜLDÜ] codder71 4 358 19-02-2024, Saat: 22:38
Son Yorum: codder71
  Mobil Android Emulator Altıner 5 319 22-01-2024, Saat: 18:28
Son Yorum: Altıner
  Firebird Android bağlantı aeyeci 2 258 01-01-2024, Saat: 14:41
Son Yorum: nguzeller



Konuyu Okuyanlar: 1 Ziyaretçi