delphiXE7关于android API的使用和检测WIFI状态的问题

在大富翁论坛上有一篇介绍delphi xe5下获取网络状态的文章并附带了一个Androidapi.JNI.Network.pas单元,我使用到XE7下,编译后点击按钮就出来一个错误对话框什么10027什么的,开始我以为是不通用那,我就利用 爱吃猪头肉 QQ: 1444386932 提供的jar转换工具转换了安卓jar包中的文件,正常运行后还是提示错误,后来发现是原来delphi编译器没有设置安卓的权限,可是这也让我稍微学习到一点,只要将安卓的jar文件转换下能让delphi调用,应该是所有的api都可以实现调用了吧,稍微参考下网上其他编程工具写的代码就可以转换为delphi的代码,挺兴奋的,终于近了一步,大富翁论坛上看到官方也提供了一个转换工具,只能提供给正式版用户使用,暂时下载不到,以后学习的时候再说吧,顺便附上我转换的几个文件,再次感谢 爱吃猪头肉 QQ: 1444386932 提供的这么好的工具,膜拜下...

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
  FMX.Memo, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    mmo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure print(str:string) ;
  public
    { Public declarations }
    /// <summary>
    ///   检测安卓WIFI状态
    /// </summary>
    /// <returns>
    ///   返回WIFI状态
    /// </returns>
    function IsWiFiConnected: Boolean;
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

uses Androidapi.JNI.android.net.ConnectivityManager,
  Androidapi.JNI.android.net.NetworkInfo,
  Androidapi.JNI.android.net.NetworkInfo_DetailedState,
  Androidapi.JNI.android.net.NetworkInfo_State, FMX.Helpers.Android,
Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText,
FMX.Platform.Android, Androidapi.JNIBridge, Androidapi.JNI.Provider,
Androidapi.Helpers, AndroidAPI.jni.OS;

{ TForm1 }
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;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if IsWiFiConnected then
 begin
   print('wifi正常');
 end
 else
 begin
   print('wifi断开');
 end;
end;

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

procedure TForm1.print(str: string);
begin
 mmo1.Lines.Add(str)
end;

end.
//====================================================
//
//  转换来自JavaClassToDelphiUnit
//  原始作者:ying32
//  QQ: 1444386932
//      396506155
//  Email:yuanfen3287@vip.qq.com
//
//  修改 By:Flying Wang & 爱吃猪头肉
//  请不要移除以上的任何信息。
//  请不要将本版本发到城通网盘,否则死全家。
//
//  Email:1765535979@qq.com
//
//  生成时间:2014/12/18 星期四 18:19:34
//  工具版本:1.0.2014.12.12
//
//====================================================
unit Androidapi.JNI.android.net.ConnectivityManager;

interface

uses
  Androidapi.JNI.android.net.NetworkInfo,
  Androidapi.JNIBridge,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.Net;


type
// ===== Forward declarations =====

  JConnectivityManager = interface; //android.net.ConnectivityManager

// ===== Interface declarations =====

  JConnectivityManagerClass = interface(JObjectClass)
  ['{713DEEDA-A465-4951-9D56-271FB50EBEBE}']
    { static Property Methods }
    {class} function _GetCONNECTIVITY_ACTION: JString;
    {class} function _GetEXTRA_NETWORK_INFO: JString;
    {class} function _GetEXTRA_IS_FAILOVER: JString;
    {class} function _GetEXTRA_OTHER_NETWORK_INFO: JString;
    {class} function _GetEXTRA_NO_CONNECTIVITY: JString;
    {class} function _GetEXTRA_REASON: JString;
    {class} function _GetEXTRA_EXTRA_INFO: JString;
    {class} function _GetACTION_BACKGROUND_DATA_SETTING_CHANGED: JString;
    {class} function _GetTYPE_MOBILE: Integer;
    {class} function _GetTYPE_WIFI: Integer;
    {class} function _GetTYPE_MOBILE_MMS: Integer;
    {class} function _GetTYPE_MOBILE_SUPL: Integer;
    {class} function _GetTYPE_MOBILE_DUN: Integer;
    {class} function _GetTYPE_MOBILE_HIPRI: Integer;
    {class} function _GetTYPE_WIMAX: Integer;
    {class} function _GetTYPE_BLUETOOTH: Integer;
    {class} function _GetTYPE_DUMMY: Integer;
    {class} function _GetTYPE_ETHERNET: Integer;
    {class} function _GetDEFAULT_NETWORK_PREFERENCE: Integer;

    { static Methods }
    {class} function isNetworkTypeValid(P1: Integer): Boolean; cdecl;

    { static Property }
    {class} property CONNECTIVITY_ACTION: JString read _GetCONNECTIVITY_ACTION;
    {class} property EXTRA_NETWORK_INFO: JString read _GetEXTRA_NETWORK_INFO;
    {class} property EXTRA_IS_FAILOVER: JString read _GetEXTRA_IS_FAILOVER;
    {class} property EXTRA_OTHER_NETWORK_INFO: JString read _GetEXTRA_OTHER_NETWORK_INFO;
    {class} property EXTRA_NO_CONNECTIVITY: JString read _GetEXTRA_NO_CONNECTIVITY;
    {class} property EXTRA_REASON: JString read _GetEXTRA_REASON;
    {class} property EXTRA_EXTRA_INFO: JString read _GetEXTRA_EXTRA_INFO;
    {class} property ACTION_BACKGROUND_DATA_SETTING_CHANGED: JString read _GetACTION_BACKGROUND_DATA_SETTING_CHANGED;
    {class} property TYPE_MOBILE: Integer read _GetTYPE_MOBILE;
    {class} property TYPE_WIFI: Integer read _GetTYPE_WIFI;
    {class} property TYPE_MOBILE_MMS: Integer read _GetTYPE_MOBILE_MMS;
    {class} property TYPE_MOBILE_SUPL: Integer read _GetTYPE_MOBILE_SUPL;
    {class} property TYPE_MOBILE_DUN: Integer read _GetTYPE_MOBILE_DUN;
    {class} property TYPE_MOBILE_HIPRI: Integer read _GetTYPE_MOBILE_HIPRI;
    {class} property TYPE_WIMAX: Integer read _GetTYPE_WIMAX;
    {class} property TYPE_BLUETOOTH: Integer read _GetTYPE_BLUETOOTH;
    {class} property TYPE_DUMMY: Integer read _GetTYPE_DUMMY;
    {class} property TYPE_ETHERNET: Integer read _GetTYPE_ETHERNET;
    {class} property DEFAULT_NETWORK_PREFERENCE: Integer read _GetDEFAULT_NETWORK_PREFERENCE;
  end;

  [JavaSignature('android/net/ConnectivityManager')]
  JConnectivityManager = interface(JObject)
  ['{0DF48060-8B57-4DEF-8BC1-1D9D2DBF9D5D}']
    { Property Methods }

    { methods }
    procedure setNetworkPreference(preference: Integer); cdecl;
    function getNetworkPreference: Integer; cdecl;
    function getActiveNetworkInfo: JNetworkInfo; cdecl;
    function getNetworkInfo(networkType: Integer): JNetworkInfo; cdecl;
    function getAllNetworkInfo: TJavaObjectArray<JNetworkInfo>; cdecl;
    function startUsingNetworkFeature(networkType: Integer; feature: JString): Integer; cdecl;
    function stopUsingNetworkFeature(networkType: Integer; feature: JString): Integer; cdecl;
    function requestRouteToHost(networkType: Integer; hostAddress: Integer): Boolean; cdecl;
    function getBackgroundDataSetting: Boolean; cdecl;

    { Property }
  end;

  TJConnectivityManager = class(TJavaGenericImport<JConnectivityManagerClass, JConnectivityManager>) end;

implementation


procedure RegisterTypes;
begin
  TRegTypes.RegisterType('Androidapi.JNI.android.net.ConnectivityManager.JConnectivityManager', 
    TypeInfo(Androidapi.JNI.android.net.ConnectivityManager.JConnectivityManager));
end;


initialization
  RegisterTypes;
end.
//====================================================
//
//  转换来自JavaClassToDelphiUnit
//  原始作者:ying32
//  QQ: 1444386932
//      396506155
//  Email:yuanfen3287@vip.qq.com
//
//  修改 By:Flying Wang & 爱吃猪头肉
//  请不要移除以上的任何信息。
//  请不要将本版本发到城通网盘,否则死全家。
//
//  Email:1765535979@qq.com
//
//  生成时间:2014/12/18 星期四 18:24:32
//  工具版本:1.0.2014.12.12
//
//====================================================
unit Androidapi.JNI.android.net.NetworkInfo;

interface

uses
  Androidapi.JNI.android.net.NetworkInfo_DetailedState,
  Androidapi.JNI.android.net.NetworkInfo_State,
  Androidapi.JNIBridge, 
  Androidapi.JNI.JavaTypes, 
  Androidapi.JNI.Net, 
  Androidapi.JNI.os;


type
// ===== Forward declarations =====

  JNetworkInfo = interface; //android.net.NetworkInfo

// ===== Interface declarations =====

  JNetworkInfoClass = interface(JObjectClass)
  ['{9C1E2D18-F7E9-4D0C-8844-F238B372540E}']
    { static Property Methods }

    { static Methods }

    { static Property }
  end;

  [JavaSignature('android/net/NetworkInfo')]
  JNetworkInfo = interface(JObject)
  ['{C5EE947D-2A5A-47AA-A24D-3A7DAFFEF54F}']
    { Property Methods }

    { methods }
    function getType: Integer; cdecl;
    function getSubtype: Integer; cdecl;
    function getTypeName: JString; cdecl;
    function getSubtypeName: JString; cdecl;
    function isConnectedOrConnecting: Boolean; cdecl;
    function isConnected: Boolean; cdecl;
    function isAvailable: Boolean; cdecl;
    function isFailover: Boolean; cdecl;
    function isRoaming: Boolean; cdecl;
    function getState: JNetworkInfo_State; cdecl;
    function getDetailedState: JNetworkInfo_DetailedState; cdecl;
    function getReason: JString; cdecl;
    function getExtraInfo: JString; cdecl;
    function toString: JString; cdecl;
    function describeContents: Integer; cdecl;
    procedure writeToParcel(dest: JParcel; flags: Integer); cdecl;

    { Property }
  end;

  TJNetworkInfo = class(TJavaGenericImport<JNetworkInfoClass, JNetworkInfo>) end;

implementation

procedure RegisterTypes;
begin
  TRegTypes.RegisterType('Androidapi.JNI.android.net.NetworkInfo.JNetworkInfo', 
    TypeInfo(Androidapi.JNI.android.net.NetworkInfo.JNetworkInfo));
end;


initialization
  RegisterTypes;
end.
//====================================================
//
//  转换来自JavaClassToDelphiUnit
//  原始作者:ying32
//  QQ: 1444386932
//      396506155
//  Email:yuanfen3287@vip.qq.com
//
//  修改 By:Flying Wang & 爱吃猪头肉
//  请不要移除以上的任何信息。
//  请不要将本版本发到城通网盘,否则死全家。
//
//  Email:1765535979@qq.com
//
//  生成时间:2014/12/18 星期四 18:36:59
//  工具版本:1.0.2014.12.12
//
//====================================================
unit Androidapi.JNI.android.net.NetworkInfo_DetailedState;

interface

uses
  Androidapi.JNIBridge, 
  Androidapi.JNI.JavaTypes, 
  Androidapi.JNI.Net;


type
// ===== Forward declarations =====

  JNetworkInfo_DetailedState = interface; //android.net.NetworkInfo$DetailedState

// ===== Interface declarations =====

  JNetworkInfo_DetailedStateClass = interface(JObjectClass)
  ['{3E279658-127E-48B4-A265-DCA4F6D19729}']
    { static Property Methods }
    {class} function _GetAUTHENTICATING: JNetworkInfo_DetailedState;
    {class} function _GetBLOCKED: JNetworkInfo_DetailedState;
    {class} function _GetCONNECTED: JNetworkInfo_DetailedState;
    {class} function _GetCONNECTING: JNetworkInfo_DetailedState;
    {class} function _GetDISCONNECTED: JNetworkInfo_DetailedState;
    {class} function _GetDISCONNECTING: JNetworkInfo_DetailedState;
    {class} function _GetFAILED: JNetworkInfo_DetailedState;
    {class} function _GetIDLE: JNetworkInfo_DetailedState;
    {class} function _GetOBTAINING_IPADDR: JNetworkInfo_DetailedState;
    {class} function _GetSCANNING: JNetworkInfo_DetailedState;
    {class} function _GetSUSPENDED: JNetworkInfo_DetailedState;

    { static Methods }
    {class} function values: TJavaObjectArray<JNetworkInfo_DetailedState>; cdecl;
    {class} function valueOf(P1: JString): JNetworkInfo_DetailedState; cdecl;

    { static Property }
    {class} property AUTHENTICATING: JNetworkInfo_DetailedState read _GetAUTHENTICATING;
    {class} property BLOCKED: JNetworkInfo_DetailedState read _GetBLOCKED;
    {class} property CONNECTED: JNetworkInfo_DetailedState read _GetCONNECTED;
    {class} property CONNECTING: JNetworkInfo_DetailedState read _GetCONNECTING;
    {class} property DISCONNECTED: JNetworkInfo_DetailedState read _GetDISCONNECTED;
    {class} property DISCONNECTING: JNetworkInfo_DetailedState read _GetDISCONNECTING;
    {class} property FAILED: JNetworkInfo_DetailedState read _GetFAILED;
    {class} property IDLE: JNetworkInfo_DetailedState read _GetIDLE;
    {class} property OBTAINING_IPADDR: JNetworkInfo_DetailedState read _GetOBTAINING_IPADDR;
    {class} property SCANNING: JNetworkInfo_DetailedState read _GetSCANNING;
    {class} property SUSPENDED: JNetworkInfo_DetailedState read _GetSUSPENDED;
  end;

  [JavaSignature('android/net/NetworkInfo$DetailedState')]
  JNetworkInfo_DetailedState = interface(JObject)
  ['{B310D74B-786C-460B-A6E5-CEA0BFDF8986}']
    { Property Methods }

    { methods }

    { Property }
  end;

  TJNetworkInfo_DetailedState = class(TJavaGenericImport<JNetworkInfo_DetailedStateClass, JNetworkInfo_DetailedState>) end;

implementation

procedure RegisterTypes;
begin
  TRegTypes.RegisterType('Androidapi.JNI.android.net.NetworkInfo_DetailedState.JNetworkInfo_DetailedState', 
    TypeInfo(Androidapi.JNI.android.net.NetworkInfo_DetailedState.JNetworkInfo_DetailedState));
end;


initialization
  RegisterTypes;
end.
//====================================================
//
//  转换来自JavaClassToDelphiUnit
//  原始作者:ying32
//  QQ: 1444386932
//      396506155
//  Email:yuanfen3287@vip.qq.com
//
//  修改 By:Flying Wang & 爱吃猪头肉
//  请不要移除以上的任何信息。
//  请不要将本版本发到城通网盘,否则死全家。
//
//  Email:1765535979@qq.com
//
//  生成时间:2014/12/18 星期四 18:35:41
//  工具版本:1.0.2014.12.12
//
//====================================================
unit Androidapi.JNI.android.net.NetworkInfo_State;

interface

uses
  Androidapi.JNIBridge, 
  Androidapi.JNI.JavaTypes, 
  Androidapi.JNI.Net;


type
// ===== Forward declarations =====

  JNetworkInfo_State = interface; //android.net.NetworkInfo$State

// ===== Interface declarations =====

  JNetworkInfo_StateClass = interface(JObjectClass)
  ['{7984D00F-5A1B-4208-9D34-8E474879A636}']
    { static Property Methods }
    {class} function _GetCONNECTED: JNetworkInfo_State;
    {class} function _GetCONNECTING: JNetworkInfo_State;
    {class} function _GetDISCONNECTED: JNetworkInfo_State;
    {class} function _GetDISCONNECTING: JNetworkInfo_State;
    {class} function _GetSUSPENDED: JNetworkInfo_State;
    {class} function _GetUNKNOWN: JNetworkInfo_State;

    { static Methods }
    {class} function values: TJavaObjectArray<JNetworkInfo_State>; cdecl;
    {class} function valueOf(P1: JString): JNetworkInfo_State; cdecl;

    { static Property }
    {class} property CONNECTED: JNetworkInfo_State read _GetCONNECTED;
    {class} property CONNECTING: JNetworkInfo_State read _GetCONNECTING;
    {class} property DISCONNECTED: JNetworkInfo_State read _GetDISCONNECTED;
    {class} property DISCONNECTING: JNetworkInfo_State read _GetDISCONNECTING;
    {class} property SUSPENDED: JNetworkInfo_State read _GetSUSPENDED;
    {class} property UNKNOWN: JNetworkInfo_State read _GetUNKNOWN;
  end;

  [JavaSignature('android/net/NetworkInfo$State')]
  JNetworkInfo_State = interface(JObject)
  ['{D13A31B6-1E02-49B7-A926-DF64671A1814}']
    { Property Methods }

    { methods }

    { Property }
  end;

  TJNetworkInfo_State = class(TJavaGenericImport<JNetworkInfo_StateClass, JNetworkInfo_State>) end;

implementation

procedure RegisterTypes;
begin
  TRegTypes.RegisterType('Androidapi.JNI.android.net.NetworkInfo_State.JNetworkInfo_State', 
    TypeInfo(Androidapi.JNI.android.net.NetworkInfo_State.JNetworkInfo_State));
end;


initialization
  RegisterTypes;
end.
原文地址:https://www.cnblogs.com/peikeke316/p/4172448.html