全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1371
推到 Plurk!
推到 Facebook!

跨平台的 IP取得

答題得分者是:P.D.
boy330077
一般會員


發表:39
回覆:59
積分:19
註冊:2009-10-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-06-12 00:41:19 IP:59.127.xxx.xxx 訂閱
參考這邊
http://www.cnblogs.com/onechen/p/3627942.html
這邊寫的是 跨平台的 版本取得
事情是這樣的,某天我在網路上找到 已IDIPWATCH取得IPadress 的資料
WINDOWS下沒問題
RUN到手機上 就取不到IP了,找了很久都沒有 android 跟 idipwatch 的訊息
於是乎嘗試 網路上教的 JWifiManager 在手機上也成功取得 正確的IP位置
我開始想嘗試 像上方連結處,想要把它整合在一起 就變成以下


[code delphi]
unit MyInternet;

interface

uses
{$IFDEF ANDROID}
Androidapi.JNI.JavaTypes, Androidapi.Jni.Net.Wifi, Androidapi.Helpers,
Androidapi.JNI.GraphicsContentViewText, Androidapi.JNIBridge,
{$ENDIF}
{$IFDEF MSWINDOWS}
IdIPWatch,
{$ENDIF}
System.SysUtils;

function GetLocalIP: String;

implementation

function GetLocalIP: String;
{$IFDEF ANDROID}
var
WifiManagerObj: JObject;
WifiManager: JWifiManager;
WifiInfo: JWifiInfo;
ip:integer;
{$ENDIF}
begin
Result := '127.0.0.1';
{$IFDEF ANDROID}
try
WifiManagerObj := SharedActivityContext.getSystemService(TJContext.JavaClass.WIFI_SERVICE);
WifiManager := TJWifiManager.Wrap((WifiManagerObj as ILocalObject).GetObjectID);
WifiInfo := WifiManager.getConnectionInfo();
ip:=WifiInfo.getIpAddress;
Result:=Format('%d.%d.%d.%d', [ip and $FF, (ip shr 8) and $FF, (ip shr 16)and $FF, (ip shr 24)and $FF]);
finally

end;
{$ENDIF}
{$IFDEF MSWINDOWS}
with TIdIPWatch.Create(nil) do begin
try
HistoryEnabled := FALSE;
Active := TRUE;
if ForceCheck then
begin
Result := LocalIP;
end;
Active := FALSE;
finally
Free;
end;
end;
{$ENDIF}
end;

end.

[/code]


但是 手機上沒有問題
選擇 WIN 時 就一直跳出錯誤 說 JNIBrdge.dcu 找不到
我以為 我這樣寫 他因該不會需要這個檔案才對,
是不是我哪裡誤會了????
或著 有更簡單的 跨平台取IP方式(原生 or 人家寫好的)
Q2,中間 {$IFDEF ANDROID} 裡面 我用了個 try 中間取得的這些 WifiManagerObj 、WifiManager 不知道算不算 create? 我在 finally 的地方 不知道是不是該 free 或是其他的???
編輯記錄
boy330077 重新編輯於 2015-06-12 08:32:52, 註解 無‧
boy330077 重新編輯於 2015-06-12 08:35:15, 註解 無‧
boy330077 重新編輯於 2015-06-12 08:36:21, 註解 無‧
boy330077 重新編輯於 2015-06-12 08:37:17, 註解 無‧
boy330077 重新編輯於 2015-06-12 08:38:37, 註解 無‧
boy330077 重新編輯於 2015-06-12 08:40:45, 註解 無‧
P.D.
版主


發表:571
回覆:3888
積分:3677
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-06-12 09:05:16 IP:118.169.xxx.xxx 未訂閱
你po阿卍的網址, 與後面要討論的, 前言不對後語, 不知用意為何
1. 除錯的方式, 你先把 相關 android 的都先移除掉, 只保留window的部份, 然後刪除所有dcu 再看會不會
2. 下了 ifdef , 我懷疑你編譯前並沒有把 platform由 andorid 切換到 windows, 導致它仍然以andoird 處理, 因為我按你的內容以 Multi Device Application 方式來做
在windows 下並沒有你提的問題

另外, 如果你想避免錯誤引發中斷, 應該使用 try except end , 而不是 finally
而 IdIpWatch 有支援 windows, andorid ios , 其實並不需要用 ifdef 來定義 windows, 我用的是xe8
這是我實作的內容
unit Unit3;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls, IdBaseComponent, IdComponent,
IdIPWatch
{$IFDEF ANDROID}
Androidapi.JNI.JavaTypes, Androidapi.Jni.Net.Wifi, Androidapi.Helpers,
Androidapi.JNI.GraphicsContentViewText, Androidapi.JNIBridge
{$ENDIF}
;
type
TForm3 = class(TForm)
Button1: TButton;
IdIPWatch1: TIdIPWatch;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.fmx}
procedure TForm3.Button1Click(Sender: TObject);
{$IFDEF ANDROID}
var
WifiManagerObj: JObject;
WifiManager: JWifiManager;
WifiInfo: JWifiInfo;
ip:integer;
{$ENDIF}
begin
{$IFDEF ANDROID}
try
WifiManagerObj := SharedActivityContext.getSystemService(TJContext.JavaClass.WIFI_SERVICE);
WifiManager := TJWifiManager.Wrap((WifiManagerObj as ILocalObject).GetObjectID);
WifiInfo := WifiManager.getConnectionInfo();
ip:=WifiInfo.getIpAddress;
Label1.Text:=Format('%d.%d.%d.%d', [ip and $FF, (ip shr 8) and $FF, (ip shr 16)and $FF, (ip shr 24)and $FF]);
except
end;
{$ENDIF}
{$IFDEF MSWINDOWS}
with TIdIPWatch.Create(nil) do begin
try
HistoryEnabled := FALSE;
Active := TRUE;
if ForceCheck then
begin
Label1.Text := LocalIP;
end;
Active := FALSE;
finally
Free;
end;
end;
{$ENDIF}
end;
end.
編輯記錄
P.D. 重新編輯於 2015-06-12 09:10:14, 註解 無‧
boy330077
一般會員


發表:39
回覆:59
積分:19
註冊:2009-10-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2015-06-12 10:12:26 IP:211.20.xxx.xxx 訂閱
抱歉

網址的用意,只是想說 我再學這用 "{$ IFDEF ANDROID}" <<類似這樣的東西 確實沒有太大意義 抱歉


至於 所謂的 platform 因該是 IDE 右方 什麼Target Plaforms 從我的手機 改成 在 WIN32點兩下 讓WIN32 變粗體 我有做到 但是您指的是不是這個我不清楚


try 的部分 我不是要抓例外,我只是想做到類似

A.Create
try
.....
finally
A.Free
end

之類的效果, 但是我不知道 WifiManagerObj 、WifiManager 這種東西 是不是需要 Free Close 或是 release 之類的
boy330077
一般會員


發表:39
回覆:59
積分:19
註冊:2009-10-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2015-06-12 20:37:45 IP:59.127.xxx.xxx 訂閱
抱歉  搞烏龍  找到原因了

我把 android用的 wifi pas 加到專案裡,

移除掉 編譯就沒錯誤了

搞烏龍不好意思
系統時間:2017-12-18 9:13:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!