2011-11-07 9 views
8

Firemonkeyでiphoneコンパスにアクセスするにはどうすればよいですか?iOSのコンパスにアクセスするにはどうすればよいですか?

+0

わかりませんが、これは次のようなものです:私は答えますか? – RBA

+0

@RBA、ブックマークを共有するだけです。それが役に立つと願っています。それは可能ですが、FAQを参照してください。 – Johan

+0

確かにあなたは完全に正しいです、これがあなたに+1を与える理由でした。 IMHO、これはまた、iOS開発の良い質問であるので、wikiに載せる必要があります。 – RBA

答えて

8

はここハウツービデオだ:http://blogs.embarcadero.com/ao/2011/10/13/39171
完全なソースコード:http://cc.embarcadero.com/item/28536
そして(ショート)の記事:http://edn.embarcadero.com/article/41715

そして、ここでは、コンパス・コンポーネントのソースコードです。
まだ試したことはありませんが、うまくいくはずです。

unit Compass; 

{Based on Anders Ohlsson Firemonkey Compass example} 

{$IFDEF FPC} 
{$mode objfpc}{$H+} 
{$modeswitch objectivec1} 
{$ENDIF} 

interface 

uses 
    SysUtils, Classes, FMX_Types 
{$IFDEF FPC} 
    , iPhoneAll 
{$ENDIF} 
    ; 

type 
    TUpdateEvent = TNotifyEvent; 

    TiOSGPSCompass = class(TFmxObject) 
    private 
    FLatitude: Double; 
    FLongitude: Double; 
    FAltitude: Double; 
    FHeading: Double; 
    FOnUpdate: TUpdateEvent; 
    UpdateNeeded: Boolean; 
    protected 
    procedure SetLatitude(value: Double); 
    procedure SetLongitude(value: Double); 
    procedure SetAltitude(value: Double); 
    procedure SetHeading(value: Double); 
    procedure Update; 
    public 
    constructor Create(AOwner: Classes.TComponent); override; 
    destructor Destroy; override; 
    published 
    property Latitude: Double read FLatitude; 
    property Longitude: Double read FLongitude; 
    property Altitude: Double read FAltitude; 
    property Heading: Double read FHeading; 
    property OnUpdate: TUpdateEvent read FOnUpdate write FOnUpdate; 
    end; 

var 
    MyGPSCompass: TiOSGPSCompass = nil; 

procedure Register; 

implementation 

{$IFDEF FPC} 
uses 
    CoreLocation; 
{$ENDIF} 

{$IFDEF FPC} 
type 
    MyCLController = objcclass(NSObject) 
    locationManager : CLLocationManager; 
    procedure locationManager_didUpdateToLocation_fromLocation(manager: CLLocationManager; newLocation, oldLocation: CLLocation); message 'locationManager:didUpdateToLocation:fromLocation:'; 
    procedure locationManager_didUpdateHeading(manager: CLLocationManager; newHeading: CLHeading); message 'locationManager:didUpdateHeading:'; 
    end; 

var 
    Controller : MyCLController; 
{$ENDIF} 


{$IFDEF FPC} 
procedure MyCLController.locationManager_didUpdateToLocation_fromLocation(manager: CLLocationManager; newLocation, oldLocation: CLLocation); 
begin 
    if Assigned(MyGPSCompass) then begin 
    MyGPSCompass.SetLatitude(newLocation.coordinate.latitude); 
    MyGPSCompass.SetLongitude(newLocation.coordinate.longitude); 
    MyGPSCompass.SetAltitude(newLocation.altitude); 
    MyGPSCompass.Update; 
    end; 
end; 
{$ENDIF} 

{$IFDEF FPC} 
procedure MyCLController.locationManager_didUpdateHeading(manager: CLLocationManager; newHeading: CLHeading); 
begin 
    if Assigned(MyGPSCompass) then begin 
    MyGPSCompass.FCompassHeading:= newHeading.magneticheading; 
    MyGPSCompass.Update; 
    end; 
end; 
{$ENDIF} 

constructor TiOSGPSCompass.Create(AOwner: TComponent); 
begin 
    inherited; 
    {$IFDEF FPC} 
    Controller := MyCLController.alloc.init; 
    Controller.locationManager := CLLocationManager.alloc.init; 
    Controller.locationManager.setDelegate(Controller); 
    Controller.locationManager.setDesiredAccuracy(kCLLocationAccuracyBestForNavigation); 
    Controller.locationManager.startUpdatingLocation; 
    Controller.locationManager.startUpdatingHeading; 
    {$ENDIF} 
    MyGPSCompass:= Self; 
end; 

destructor TiOSGPSCompass.Destroy; 
begin 
    {$IFDEF FPC} 
    Controller.locationManager.release; 
    Controller.release; 
    {$ENDIF} 
    inherited; 
end; 

procedure TiOSGPSCompass.SetLatitude(value: Double); 
begin 
    if (FLatitude <> value) then begin 
    FLatitude:= value; 
    UpdateNeeded:= True; 
    end; 
end; 

procedure TiOSGPSCompass.SetLongitude(value: Double); 
begin 
    if (FLongitude <> value) then begin 
    FLongitude:= value; 
    UpdateNeeded:= True; 
    end; 
end; 

procedure TiOSGPSCompass.SetAltitude(value: Double); 
begin 
    if (FAltitude <> value) then begin 
    FAltitude:= value; 
    UpdateNeeded:= True; 
    end; 
end; 

procedure TiOSGPSCompass.SetHeading(value: Double); 
begin 
    if (FHeading <> value) then begin 
    FHeading:= value; 
    UpdateNeeded:= True; 
    end; 
end; 

procedure TiOSGPSCompass.Update; 
begin 
    if (UpdateNeeded and Assigned(OnUpdate)) then OnUpdate(Self); 
    UpdateNeeded:= False; 
end; 

procedure Register; 
begin 
    RegisterComponents('iOS', [TiOSGPSCompass]); 
end; 

end. 
+0

+1これはすべて可能であれば、あなたの答えに関連する部分を含めることは良いでしょう。 – jpfollenius

+0

@ Smasher、私は何ができるかを見ていきます。 – Johan

+0

@Smasher、コンパスコンポーネントのソースコードを追加しました – Johan

関連する問題