AndroidマップとGPS機能の実現
25280 ワード
地図とGPSは比較的よく使われる機能で、ネット上ではかなりの例を見つけることができ、同時にいくつかの地図エンジンの会社も地図SDKを開放し、利用することができます.今回はRexseeに基づいて地図ルート制御を実現する機能を重点的に検討し,共有した.同時にRexseeが書いたGPS機能のソースも全部貼ってあるので、ちょっと多いです.見えない自分がRexseeのコミュニティに行く:Rexseeは拡張の中で直接高徳のSDKを使って、協力関係でしょう.高徳地図オブジェクト内の関数で、グーグルマップのようなナビゲーションソフトを簡単に作ることができます.地図プラグインが開いた後、データがプラグインボックスにロードされない前にプラグインを閉じたり、次の戻るキーを押したりすると、プログラムがクラッシュしやすくなります.そのため、プラグインを開くときはキャンセル不可に設定したほうがいいです.RexseeはWebベースの開発であるため,プログラムを全機種自動適合にすることができ,ウィンドウの位置を調整する際に位置に一定の論理を記述する必要がある.もちろん、画面画素の取得方法は異なり、値も異なります.また,平板上には通知欄がないものや,通知欄が下にあるもの,通知欄の高さを減算する必要があるもの,不要なものがある.これはすべて判断する必要がある.もちろんテストの時はこれらを置いて、勝手に1つ設定すればいいです.rexseeMapAbc.start('window-cancelable:false;window-moveable:false;border-width:10px;border-(2*rexseeScreen.getScreenDensityScale()))+';window-modeless:true;window-dim-amount:0;');基本操作には、中心点の設定、位置決め、道路状況も含まれています.道路状況は現在開いていて解消できません..なぜか分からない.高徳地図におけるデータ操作,ナビゲーション操作,興味点操作の戻り値は,いずれも既に配列された形式(EVAL過を前提とする)で出現している,すなわち,ナビゲーション時に複数ある.ナビゲーションには2地の緯度を提供する必要があるので、データ変換中の地名に合わせて目的地情報を取得する関数の方法を使用してください.もちろん緯度範囲を制限したほうがいいです.そうしないと、XX省XX市XX地名などの詳細をスペルしなければなりません.要求されたのは数回のジャンプ回線で、必要に応じてその中の1つを取るか、選択メニューを生成してください.function getRoute(){rexseeMapAbc.hideRoute();var placess=eval('('+prompt('prompt','title=ナビゲーション入力ボックス;message=開始地と目的地を入力してください:;options=開始地:|目的地:|目的地:;defaultValue=北京市北京西駅|北京市北京南駅;inputType=text|text;')+');var startplace=places[ 0];var endplace=places[ 1];var endPlace=places[ 1];var teter tetetetetetetetetes[1];var ter tetetetetetetetetempsp=eval('('+rexseeMapAbc.getAddressFromLocationName(startPlace,1)+')');rexseeMapAbc.requestRoute('routeRequest01',splong,splat,eplong,eplat,role);} function onRouteReady(id){//alert(rexseeMapAbc.getRequesedRoute(id));var temps=rexseeMapAbc.getRequestedRoute(id);//temps = temps.replace(/\r","");//alert(temps);rexseeMapAbc.showRoute(id,0)}興味点の制御とルート制御は同じで、興味点を閉じると地図上のナビゲーション線も一緒に消えます.高徳地図はGPSに合わせて使用する場合、国の基準に従ってオフセットする必要がありますので、オフセットしてから(対象に対応する関数がある)位置決めしてください.そうしないと偏差があります.また、パラメータとして緯度を指定する場合は、文字列に変換してください.そうしないと、偏差が大きくなります.最後にRexseeが書いたオリジナルGPSソースですが、オリジナルを作るにはこれを直接見ることができます.
Java code
Java code
/*
* Copyright (C) 2011 The Rexsee Open Source Project * * You may obtain a copy of the License at * * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * limitations under the License.
*/
package
rexsee.location;
import
java.util.List;
import
rexsee.core.browser.JavascriptInterface;
import
rexsee.core.browser.RexseeBrowser;
import
rexsee.core.browser.ActivityResult.ActivityResultListener; mport android.os.Bundle;
import
android.provider.Settings;
public
class
RexseeGps
implements
JavascriptInterface {
private
static
final
String INTERFACE_NAME
=
"
Gps
"
; @Override
public
String getInterfaceName() {
return
mBrowser.application.resources.prefix
+
INTERFACE_NAME; } @Override
public
static
final
String EVENT_ONGPSLOCATIONCHANGED
=
"
onGpsLocationChanged
"
;
public
static
String address2Json(Address address) {
if
(address
==
null
)
return
"
{}
"
; String rtn
=
""
; rtn
+=
"
{
"
; rtn
+=
"
\"Premises\":\"
"
+
address.getPremises()
+
"
\"
"
;
//
Type of the location. Cross, road or POI.
//
rtn += ",\"SubLocality\":\"" + address.getSubLocality() + "\"";Not support SDK3
rtn
+=
"
,\"Thoroughfare\":\"
"
+
address.getThoroughfare()
+
"
\"
"
; rtn
+=
"
}
"
;
return
rtn; }
public
static
String addresses2Json(List
<
Address
>
addresses) { String rtn
=
"
[
"
;
for
(
int
i
=
0
; i
<
addresses.size(); i
++
) {
if
(i
!=
0
) rtn
+=
"
,
"
; }
private
int
minUpdateDuration
=
60
;
public
RexseeGps(
final
RexseeBrowser browser) { mContext
=
browser.getContext(); mBrowser
=
browser; browser.eventList.add(EVENT_ONGPSSETTINGSUCCESSED);
public
void
run() { stop(); } }); mListener
=
new
LocationListener() { @Override
public
void
onLocationChanged(Location location) {
if
(browser
!=
null
) { browser.eventList.run(EVENT_ONGPSLOCATIONCHANGED,
new
String[]{ } @Override
public
void
onProviderDisabled(String provider) { } @Override
public
void
onStatusChanged(String provider,
int
status, Bundle extras) { } } }; }
//
JavaScript Interface
public
boolean
isReady() {
return
(((LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE)).isProviderEnabled(LocationManager.GPS_PROVIDER))
?
true
:
false
; } locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, minUpdateDuration
*
1000
, minUpdateDistance, mListener); }
else
{ mBrowser.exception(getInterfaceName(),
"
GPS is not available.
"
); } }
public
void
stop() { }
public
void
setMinimumUpdateDuration(
int
seconds) { minUpdateDuration
=
seconds; }
public
void
setMinimumUpdateDistance(
int
meter) { minUpdateDistance
=
meter; } }
public
String getLastKnownLocation() {
if
(
!
isReady())
return
"
{}
"
;
try
{ Location location
=
((LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE)).getLastKnownLocation(LocationManager.GPS_PROVIDER);
if
(location
==
null
)
return
""
;
return
rtn; }
catch
(Exception e) { mBrowser.exception(getInterfaceName(), e);
return
"
{}
"
; } }
public
String getLastKnownGeo(
int
maxNumber) {
if
(
!
isReady())
return
"
[]
"
;
try
{ Location location
=
((LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE)).getLastKnownLocation(LocationManager.GPS_PROVIDER); (), location.getLongitude(), maxNumber);
return
addresses2Json(addresses); }
catch
(IOException e) { mBrowser.exception(getInterfaceName(), e);
return
"
[]
"
; } }
public
float
getDistanceBetween(String startLongitude, String startLatitude, String endLongitude, String endLatitude) { Location.distanceBetween(sLatitude, sLongitude, eLatitude, eLongitude, results);
return
results[
0
]; } }