English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

مثال على تنفيذ تحديد الموقع وتوجيه إلى الوجهة في Android

今天无意中看到技术大神利用百度地图定位并实现目的地导航的Demo。觉得很不错,就转载过来一起分享,下面我们看实现效果:

       

进入后首先会得到当前位置,在地图上显示出来,在输入框中输入目的地后,就会在地图上出现最佳线路,我这里设置的是距离最小的驾车线路,另外还有公交线路、步行线路,在代码中都有详细注释。另外,在控制台还输出了线路上每一个节�点的信息以及起始位置和目的地的距离,信息显示的是在当前节点的导航信息。如下图:

 

接下来就看如何实现了,首先,注册百度开发者账号,并进入百度地图API查看相关资料百度地图API,然后就是为需要加入地图的应用注册APP KEY,注册完后,下载百度地图jar文件,新建工程,并导入即可,下面看实现具体代码,在代码中有详细注释:

public class NavigationDemoActivity extends MapActivity { 
  private String mMapKey = "注册自己的key"; 
  private EditText destinationEditText = null; 
  private Button startNaviButton = null; 
  private MapView mapView = null; 
  private BMapManager mMapManager = null; 
  private MyLocationOverlay myLocationOverlay = null; 
  //onResume时注册此listener,onPause时需要Remove,注意此listener不是Android自带的,是百度API中的 
  private LocationListener locationListener; 
  private MKSearch searchModel; 
  GeoPoint pt; 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.main); 
    destinationEditText = (EditText) this.findViewById(R.id.et_destination); 
    startNaviButton = (Button) this.findViewById(R.id.btn_navi); 
    mMapManager = new BMapManager(getApplication()); 
    mMapManager.init(mMapKey, new MyGeneralListener()); 
    super.initMapActivity(mMapManager); 
    mapView = (MapView) this.findViewById(R.id.bmapsView); 
    //إعداد تشغيل التحكم في التكبير والتكبير المدمج 
    mapView.setBuiltInZoomControls(true);  
    //إعداد عرض overlay أثناء عملية التكبير والتكبير، الافتراض هو عدم الرسم 
//    mapView.setDrawOverlayWhenZooming(true); 
    //الحصول على طبقة الموقع الحالي 
    myLocationOverlay = new MyLocationOverlay(this, mapView); 
    //إضافة طبقة الموقع الحالي إلى الطبقة الأساسية في الخريطة 
    mapView.getOverlays().add(myLocationOverlay); 
    // تسجيل حادثة التغيير في الموقع 
    locationListener = new LocationListener(){ 
      @Override 
      public void onLocationChanged(Location الموقع) { 
        if (الموقع != null){ 
          //إنشاء نوع GEO لـ الموقع الجغرافي ووضع العلامة الموجودة في هذا الموقع على الخريطة 
           pt = new GeoPoint((int)(الموقع.getlatitude() * 1e6), 
              (int)(الموقع.getlongitude() * 1e6)); 
//         System.out.println("---"+location.getLatitude() +":"+location.getLongitude()); 
          mapView.getController().animateTo(pt); 
        } 
      } 
    }; 
    // يتم تحديد وحدة البحث 
    searchModel = new MKSearch(); 
    // يتم تعيين سياسة المسار على أقصر مسافة 
    searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); 
    searchModel.init(mMapManager, new MKSearchListener() { 
      // طريقة التفاعل للحصول على مسار القيادة 
      @Override 
      public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { 
        // يمكن الإشارة إلى الرقم التعريفي في MKEvent 
        if (error != 0 || res == null) { 
          Toast.makeText(NavigationDemoActivity.this, "المعذرة، لم يتم العثور على النتيجة", Toast.LENGTH_SHORT).show(); 
          return; 
        } 
        RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView); 
        // هنا يتم عرض خطة واحدة كنموذج فقط 
        MKRoute route = res.getPlan(0).getRoute(0); 
        int distanceM = route.getDistance(); 
        String distanceKm = String.valueOf(distanceM / 1000) +"."+String.valueOf(distanceM % 1000); 
        System.out.println("المسافة:"+distanceKm+"كيلومتر---عدد العقدات:"+route.getNumSteps()); 
        للحصول على جميع الخطوات في route، أجري الحلقة for (int i = 0; i < route.getNumSteps(); i++) { 
          MKStep step = route.getStep(i); 
          System.out.println("节点信息:"+step.getContent()); 
        } 
        routeOverlay.setData(route); 
        mapView.getOverlays().clear(); 
        mapView.getOverlays().add(routeOverlay); 
        mapView.invalidate(); 
        mapView.getController().animateTo(res.getStart().pt); 
      } 
      //以下两种方式和上面的驾车方案实现方法一样 
      @Override 
      public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { 
        //获取步行路线 
      } 
      @Override 
      public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { 
        //获取公交线路 
      } 
      @Override 
      public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) { 
      } 
      @Override 
      public void onGetAddrResult(MKAddrInfo arg0, int arg1) { 
      } 
      @Override 
      public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) { 
      } 
      @Override 
      public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) { 
      } 
    }); 
    startNaviButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        String destination = destinationEditText.getText().toString(); 
        //设置起始地(当前位置) 
        MKPlanNode startNode = new MKPlanNode(); 
        startNode.pt = pt; 
        //设置目的地 
        MKPlanNode endNode = new MKPlanNode();  
        endNode.name = destination; 
        // توسيع المدن التي يتم البحث فيها 
        String city = getResources().getString(R.string.beijing); 
//       System.out.println("----"+city+"---"+destination+"---"+pt); 
        searchModel.drivingSearch(city, startNode, city, endNode); 
        // مسار المشي 
//       searchModel.walkingSearch(city, startNode, city, endNode); 
        // مسار المواصلات 
//       searchModel.transitSearch(city, startNode, endNode); 
      } 
    }); 
  } 
  @Override 
  protected void onResume() { 
    mMapManager.getLocationManager().requestLocationUpdates(locationListener); 
    myLocationOverlay.enableMyLocation(); 
    myLocationOverlay.enableCompass(); // فتح البوصلة 
    mMapManager.start(); 
    super.onResume(); 
  } 
  @Override 
  protected void onPause() { 
    mMapManager.getLocationManager().removeUpdates(locationListener); 
    myLocationOverlay.disableMyLocation(); // عرض الموقع الحالي 
    myLocationOverlay.disableCompass(); // إغلاق البوصلة 
    mMapManager.stop(); 
    super.onPause(); 
  } 
  @Override 
  protected boolean isRouteDisplayed() { 
    // TODO طريقة نموذجية مولدة تلقائيًا 
    return false; 
  } 
  // تقديم الاستماع إلى الأحداث الشائعة، لمعالجة الأخطاء الشائعة في الشبكة، أخطاء التحقق من الصلاحيات، إلخ 
  class MyGeneralListener implements MKGeneralListener { 
      @Override 
      public void onGetNetworkState(int iError) {}} 
        Log.d("MyGeneralListener", "خطأ في حالة الحصول على حالة الشبكة هو "+ iError); 
        Toast.makeText(NavigationDemoActivity.this, "هناك خطأ في شبكة الإنترنت الخاصة بك!", 
            Toast.LENGTH_LONG).show(); 
      } 
      @Override 
      public void onGetPermissionState(int iError) { 
        Log.d("MyGeneralListener", "خطأ في حالة الحصول على الإذن هو "+ iError); 
        if (iError == MKEvent.ERROR_PERMISSION_DENIED) { 
          // خطأ في المفتاح المصرح به: 
          Toast.makeText(NavigationDemoActivity.this,  
              "يرجى إدخال المفتاح المصرح به بشكل صحيح في ملف BMapApiDemoApp.java!", 
              Toast.LENGTH_LONG).show(); 
        } 
      } 
    } 
} 

ثم هو ملف التخطيط:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent" 
  android:orientation="vertical" > 
  <LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 
    <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="18sp" 
      android:text="Destination:" /> 
    <EditText 
      android:id="@+id/et_destination" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 
  </LinearLayout> 
  <Button  
    android:id="@+id/btn_navi" 
    android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Start navigate"/> 
  <com.baidu.mapapi.MapView 
    android:id="@+id/bmapsView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:clickable="true" /> 
</LinearLayout> 

AndroidMainifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<منفست xmlns:android="http://schemas.android.com/apk/res/android" 
  package="com.ericssonlabs" 
  android:versionCode="1" 
  android:versionName="1.0" > 
  <استخدام-السماحية android:minSdkVersion="8" /> 
  <استخدام-السماحية android:name="android.permission.ACCESS_NETWORK_STATE"></استخدام-السماحية> 
  <استخدام-السماحية android:name="android.permission.ACCESS_FINE_LOCATION"></استخدام-السماحية> 
  <استخدام-السماحية android:name="android.permission.INTERNET"></استخدام-السماحية> 
  <استخدام-السماحية android:name="android.permission.WRITE_EXTERNAL_STORAGE"></استخدام-السماحية> 
  <استخدام-السماحية android:name="android.permission.ACCESS_WIFI_STATE"></استخدام-السماحية>  
  <استخدام-السماحية android:name="android.permission.CHANGE_WIFI_STATE"></استخدام-السماحية>  
  <استخدام-السماحية android:name="android.permission.READ_PHONE_STATE"></استخدام-السماحية> 
  <supports-screens android:largeScreens="true"} 
    android:normalScreens="true" android:smallScreens="true" 
    android:resizeable="true" android:anyDensity="true"/> 
  <uses-sdk android:minSdkVersion="3"></uses-sdk> 
  <application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
      android:name=".NavigationDemoActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 
        <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
    </activity> 
  </application> 
</manifest> 

هذا هو كود تحديد موقف بaidu و导航 إلى الوجهة كاملًا، هل هذا هو ما تبحثون عنه؟

هذا هو محتوى المقال الكامل، نأمل أن يكون هذا المقال مفيدًا لكم في تعلم، ونأمل أيضًا أن تدعموا وتعطوا دعمًا لمنصة تعليم呐喊.

البيان: محتوى هذا المقال تم جمعه من الإنترنت، يحق للمالك الأصلي الحصول عليه، تم جمع المحتوى من قبل المستخدمين عبر الإنترنت وتم تحميله بشكل مستقل، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل إنساني، ولا يتحمل هذا الموقع أي مسؤولية قانونية متعلقة بذلك. إذا كنت قد وجدت محتوى يشتبه في حقوق النسخ، فنرجو منك إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) لإبلاغنا، وقدم الأدلة ذات الصلة، إذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم فورًا.

سيكون ممتعاً لك