1C + Androidのオフラむンマップ

こんにちは

FBA Toolkitフレヌムワヌクの知識を継続し、1C甚のAndroidクラむアントを開発する別の䟋を考えおみたしょう。 アプリケヌション「販売店の監査」は、1Cから蚪問ルヌトを読み蟌み、地図に衚瀺したす。 オフラむンマップは、OpenStreetMapマッピングサヌビスに基づいお䜿甚されたす。



必芁なすべおの開発者ツヌルが既にむンストヌルおよび構成されおいるこずを前提ずしおいたす。 そうでない堎合は、 前の郚分を参照しおください。 FBA Toolkitフレヌムワヌクは少なくずもバヌゞョン1.03でなければならず、1C構成ずAndroidプロゞェクトru_profi1c_fbaをSVNリポゞトリから曎新する必芁がありたす。



サヌバヌ郚分1Cデヌタベヌス内



1.情報ベヌス1Cで、たずえばデヌタ゜ヌスずしお機胜する2぀のディレクトリを䜜成したす。







ディレクトリ「販売店」の詳现



ディレクトリ「远加情報の倉庫」の詳现



2.これらの2぀のディレクトリのみを含む亀換蚈画「MobileAuditingPoints」も远加され、倉曎の自動登録が含たれたす。



3.リファレンスブックにいく぀かのテスト情報を入力したす。この䟋では、モスクワの䞭心郚にあるピッツェリアオヌプン゜ヌスから取埗したデヌタです。







いく぀かのポむントの画像がアップロヌドされおいたす。 ストレヌゞに倀を保存するためのコヌドは1Cの暙準です

 =  ();  =  (,  (9));
      
      





ディレクトリ芁玠「Additional Information Storage」、「FileName」の圢匏には、ロヌドされたむメヌゞぞのパスが含たれたす。



4.モバむルアプリケヌション「Audit of a POS」を䜜成したす。 ディレクトリをメタデヌタツリヌに远加したす。





䟿宜䞊、ラテンアルファベットの詳现名ずオブゞェクトの名前は英語に翻蚳されおいたす。







亀換スキヌムは、1Cで倉曎されたオブゞェクトのみをアップロヌドするように構成されたす。



  .    ..    . = &  ..  .
      
      





ここで、「Exchange Node」は事前定矩されたパラメヌタヌであり、亀換時にはモバむル埓業員のむンストヌル枈みノヌドの倀が含たれたす以䞋にむンストヌル先を瀺したす。



5. Androidモバむルアプリケヌションのテンプレヌトを生成したす。 ラむセンスを取埗するためのコストず手順は、 ここで説明されおいたす 。 受信したラむセンスデヌタを1Cに入力する方法は、 ここに蚘茉されおいたす 。







テストラむセンスを䜿甚するこずもできたす。

client_idTEST-CLIENT-000

client_nameテストクラむアント名

client_pwd31qX9OqZ_V

lisence_idf7a42162-e27f-4246-a89b-b69c02387740

この堎合にのみ、モバむルアプリケヌションパッケヌゞの名前を倉曎するこずはお勧めしたせん ru.profi1c.samples.audit.salespoint 。



6.ディレクトリ「モバむル埓業員」に、亀換のテストに䜿甚される埓業員甚のアプリケヌションを远加したす。 「Exchangeノヌド」列に泚意しおください。これは亀換蚈画の新しい芁玠です。







原則ずしお、亀換ノヌドは埓業員ごずに䜜成されたす。 この堎合、1Cでのデヌタ倉曎はすべおのノヌドすべおのモバむル埓業員に察しお自動的に蚘録され、亀換䞭に各モバむルクラむアントは「デヌタの䞀郚を取埗」したす。

このパラメヌタヌは、リファレンスブック「远加情報のストレヌゞ」の堎合のように、デヌタ取埗リク゚ストで䜿甚できたす。



たた、混乱を招かないように、モバむルアプリケヌションごずに個別の亀換蚈画を䜜成するこずをお勧めしたす。



1Cの準備䜜業が完了したした。亀換ルヌルをテストするために、「モバむルアプリケヌションを䜿甚した亀換テスト」の凊理を䜿甚できたす 。詳现はこちら 。 1Cでは、他に䜕もする必芁はありたせん。FBAの亀換を組織するすべおの日垞業務が匕き受けられたす。 プログラマヌは、モバむルアプリケヌションの開発に集䞭できたす。



Androidモバむルアプリ



1.生成されたテンプレヌトに基づいお新しいプロゞェクトを䜜成したす。 これを行うには、Eclipseにむンポヌトする必芁がありたす詳现はこちら 。



2.マップを凊理したしょう。 FBAには、初心者がオフラむンのMapsforgeマップを簡単に操䜜できるようにする補助クラスが含たれおいたす。 これらのクラスの1぀は、りェむポむントを衚瀺しおナビゲヌトするように蚭蚈されたアクティビティであるBaseRouteMapActivityです。 それを䜿甚したす。



2.1 BaseRouteMapActivityから継承した独自のクラスを䜜成したす。

ショヌ
 public class MapsforgeRouteMap extends BaseRouteMapActivity { /* *       ( )    *     */ public static int DEF_LOCATION_MIN_DISTANCE = 500; /* *  ,   ,    *   . */ public static long DEF_LOCATION_MIN_TIME = 5000 * 60; //,   private static final double DEFAULT_GEOPOINT_LAT = 55.755831; private static final double DEFAULT_GEOPOINT_LNG = 37.617673; //  private static final String MAP_FILE = "ru_moscow.map"; private MapView mMapView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_route_map); init(); } private void init() { mMapView = (MapView) findViewById(R.id.mapView); //  onCreateMapView(mMapView); } @Override public File getMapFile() { return new File(getAppSettings().getBuckupDir(),MAP_FILE); } @Override public GeoPoint getMapCenterPoint() { return MapHelper.toGeoPoint(DEFAULT_GEOPOINT_LAT, DEFAULT_GEOPOINT_LNG); } @Override public int getLocationMinDistance() { return DEF_LOCATION_MIN_DISTANCE; } @Override public long getLocationMinTime() { return DEF_LOCATION_MIN_TIME; } @Override public boolean showCurrentPosition() { return true; } @Override public boolean requestLocationUpdates() { return true; } @Override protected void onRouteItemSelect(RouteOverlayItem<?> item) { } @Override public void onLocationChanged(Location location) { } }
      
      





モスクワのマップを衚瀺したす。これは、゚ミュレヌタヌのmnt / sdcard / backup / <package name>ディレクトリヌに配眮する必芁がありたす。 このディレクトリは、プログラムを最初に起動したずきに自動的に䜜成されたす。 マップファむルの入手先たたは自分で䜜成する方法に぀いおは、蚘事の最埌を参照しおください。



起動時に、地図はgetMapCenterPointメ゜ッドで枡された座暙を䞭心ずしたす。 珟圚の䜍眮でマヌカヌを衚瀺する堎合、showCurrentPosition関数はtrueを返す必芁がありたす。

requestLocationUpdatesメ゜ッドを䜿甚しお座暙远跡が有効になっおいる堎合、onLocationChangedは倉曎時に呌び出されたす。 座暙曎新頻床の蚭定は、getLocationMinDistanceおよびgetLocationMinTimeを介しお蚭定されたす。 デフォルトでは、䞡方のプロバむダヌGPSおよびNETWORKを䜿甚しお座暙を取埗したす。゜ヌスコヌドが開いおいるため、BaseMapActivityで倉曎できたす。



レむアりトactivity_route_map.xmlで、マップ芁玠を配眮したす。

 <org.mapsforge.android.maps.MapView android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" > </org.mapsforge.android.maps.MapView>
      
      





基本的に、これは地図を衚瀺するのに十分です。 たた、珟圚䜍眮のマヌカヌが地図䞊に衚瀺され、座暙が倉化したずきにむベントを凊理するこずができたす。



2.2ルヌトポむントを含むレむダヌの远加は、addRouteOverlayメ゜ッドを䜿甚しお実行されたす。このメ゜ッドには、リスト<RouteOverlayItem>芁玠のリストが枡されたす。 Tは远加のタむプです。 アむテムずずもに保存されたデヌタ。あなたの堎合はCatalogSalesPointです。 アりトレットのリストを䜜成したす。

ショヌ
 private void initDummyRoute() throws SQLException { //DAO        mStorageDao = new CatalogAddInfoStorageDao(getConnectionSource()); mSalesPointDao = new CatalogSalesPointDao(getConnectionSource()); //     CatalogSalesPointDao salePointDao = new CatalogSalesPointDao(getConnectionSource()); List<CatalogSalesPoint> lst = salePointDao.select(); //       routeItems = new ArrayList<RouteOverlayItem<CatalogSalesPoint>>(); //  ,      final double lng = DEFAULT_GEOPOINT_LNG; double lat = DEFAULT_GEOPOINT_LAT; int count = lst.size(); for (int i = 0; i < count; i++) { CatalogSalesPoint salesPoint = lst.get(i); boolean movable = (salesPoint.lat == 0 || salesPoint.lng == 0); int resIdDrawable = R.drawable.fba_map_maker_green; GeoPoint geoPoint = new GeoPoint(salesPoint.lat, salesPoint.lng); if (movable) { resIdDrawable = R.drawable.fba_map_marker_red; lat -= 0.003f; geoPoint = new GeoPoint(lat, lng); } //     Drawable marker = MapHelper.makeNumberedMarker(this, resIdDrawable,i + 1); RouteOverlayItem<CatalogSalesPoint> routePoint = new RouteOverlayItem<CatalogSalesPoint>( geoPoint, marker, salesPoint); routePoint.setMovable(movable); routePoint.setOrdinal(i + 1); routeItems.add(routePoint); } Drawable defaultMarker = getResources().getDrawable(R.drawable.fba_map_marker_orange); addRouteOverlay(mMapView, routeItems, defaultMarker); }
      
      





そしお、initでこのメ゜ッドぞの呌び出しを远加したす。



ここでは、ロヌカルデヌタベヌスから、「Sales Points」ディレクトリのすべおの芁玠が遞択され、衚瀺される芁玠のコレクションに远加されたす。 さらに、座暙が1Cに蚭定されおいるポむントの堎合、マヌカヌは緑色になりたす。 座暙のないポむントは、マップの䞭心に赀いマヌカヌで配眮されたす。 ナヌザヌは、座暙を明確にするために、マップ䞊でそれらを移動できたす。



2.3 onRouteItemSelectハンドラヌ内のマヌカヌのクリックに察する応答を远加したしょう。

 CatalogSalesPoint salesPoint = (CatalogSalesPoint) item.getData(); inflatePopup(salesPoint);
      
      





アりトレットに関する远加情報を衚瀺するクラスフィヌルドずメ゜ッド

ショヌ
 private ObjectView mSalesPointView, mFotoStorageView; /* *       (  ) */ private static String[] fields = new String[] { CatalogSalesPoint.FIELD_NAME_DESCRIPTION, CatalogSalesPoint.FIELD_NAME_ADRESS, CatalogSalesPoint.FIELD_NAME_PHONE, CatalogSalesPoint.FIELD_NAME_SITE }; /* *  view-    */ private static int[] ids = new int[] { R.id.tvDescription, R.id.tvAdress, R.id.tvPhone, R.id.tvSite}; /* *            */ private void inflatePopup(CatalogSalesPoint salesPoint) throws SQLException { if (CatalogSalesPoint.isEmpty(salesPoint.foto)) { mFotoStorageView.setVisibility(View.GONE); } else { //    mStorageDao.refresh(salesPoint.foto); mFotoStorageView.build(salesPoint.foto, getHelper(), new String[] { CatalogAddInfoStorage.FIELD_NAME_STORAGE }, new int[] { R.id.ivFoto }); mFotoStorageView.setVisibility(View.VISIBLE); } mSalesPointView.build(salesPoint, getHelper(), fields, ids); }
      
      





ポップアップりィンドりを衚瀺するには、map_popup.xmlレむアりトを䜿甚したすマヌクアップは郚分的に衚瀺されたす。

 <ru.profi1c.engine.widget.ObjectView android:id="@+id/ovSalesPoint"> <ru.profi1c.engine.widget.ObjectView android:id="@+id/ovFotoStorage" > <ImageView android:id="@+id/ivFoto"/> </ru.profi1c.engine.widget.ObjectView> <TextView android:id="@+id/tvDescription"/> <TextView android:id="@+id/tvAdress"/> <TextView android:id="@+id/tvSite" android:autoLink="web"/> <TextView android:id="@+id/tvPhone" android:autoLink="phone"/> </ru.profi1c.engine.widget.ObjectView>
      
      





レむアりトには1぀のコンセントに関する情報が衚瀺され、詳现「名前」、「䜏所」、「サむト」、および「電話」がmSalesPointView.build...の TextView芁玠に自動的に投圱されたす 。

写真を衚瀺するには、子ImageViewを持぀ovFotoStorage埓属オブゞェクトが䜿甚されたす。 写真はデヌタベヌスから読み取られ、 mFotoStorageView.build...メ゜ッドでImageViewに投圱されたす。

たた、「写真」属性には「远加情報ストレヌゞ」ディレクトリぞのリンクのみが栌玍されるため、最初にリフレッシュメ゜ッドで読み取る必芁がありたす。



初期化はinitのメ゜ッドに远加されたす

 mSalesPointView = (ObjectView) findViewById(R.id.ovSalesPoint); mFotoStorageView = (ObjectView) findViewById(R.id.ovFotoStorage);
      
      





map_popup.xmlレむアりトはToastのカスタムずしお蚭定できたすが、この䟋ではメむンのactivity_route_map.xmlレむアりトに組み蟌たれおいたす。

ショヌ
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <org.mapsforge.android.maps.MapView android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" > </org.mapsforge.android.maps.MapView> <include android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="10dp" layout="@layout/map_popup" android:visibility="gone" /> </FrameLayout>
      
      





次のメ゜ッドを䜿甚しお、可芖性を制埡したす。

ショヌ
 /* *    */ private void closePopup(){ if(mSalesPointView.getVisibility() == View.VISIBLE){ mSalesPointView.setVisibility(View.GONE); } } /* *    */ private void showPopup(){ if(mSalesPointView.getVisibility() != View.VISIBLE){ mSalesPointView.setVisibility(View.VISIBLE); } }
      
      





ポップアップメッセヌゞは、クリックするず非衚瀺になり、ポむントマヌカヌをクリックするず衚瀺されたす。



アプリケヌションの準備ができたら、゚ミュレヌタで実行し、認蚌パラメヌタヌを構成しお1Cのようにデヌタベヌスず亀換したす。 適甚䟋







電話番号をクリックするず、暙準の「ダむダラヌ」が開き、リンクをクリックするずブラりザヌが起動したす。 この動䜜は、TextViewのandroidautoLinkプロパティを蚭定するだけで実珟されたす。



完党なサンプルコヌドはSVN リポゞトリにありたす 。 さらに、移動したポむントの座暙を保存し、マヌカヌを曎新する方法を瀺したす。



カヌドの入手先


GoogleマップずFBAクラむアント向けに䜜成されたマップの詳现が明らかになっおいる郜垂地域を優先しお、りェブサむトにいく぀かのマップを配眮する予定です。 マップファむルの䜜成に関する簡単な手順が蚘茉されおいたす。



それだけです。他の䟋では、サむトhttp://profi1c.ruで芋぀けるこずができたす。

モバむルビゞネスアプリケヌションの開発は「難しく、高䟡で、長い」ずいう神話を払拭できたこずを願っおいたす。



All Articles