2013年5月16日

【Android】讀取我的位置定位並藉由經緯度座標計算距離以及List物件以距離遠近排序

各位Android安卓開發者大家好 ^^

今天小黑人要跟大家分享的是"我的位置(WiFi定位&GPS定位)"與"經緯度計算距離"以及"物件排序"。原因就是如果大家有使用到Google Map的話,除了只是單純的看地圖例外,通常都會使用到定位這個功能也就是我的位置,然後定位完畢後可能又會想要知道跟某一景點店家或地標的距離遠近,最後知道了每一個景點店家的距離後又會想要以最近的店家到最遠的店家進行排序(由近至遠排列或由遠至近排列),這一連串的需求將會因一個定位功能會慢慢延伸下去,所以小黑人今天將會用簡單的範例程式達成"定位"、"距離"、"排序"這一連串的實作,那就...讓我們繼續看下去吧! 哈哈~

首先,讀取我的位置及計算距離皆不需要動到Layout的版面設計,那小黑人就不做Layout的設計囉,但是我的位置功能需要權限的開啟,所以首先我們先到AndroidManifest.xml做權限的設定。
AndroidManifest.xml :
//加入下方兩項權限,第一項為開啟網路連線權限,第二項為開啟定位權限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

接下來我們就直接進入程式 (.java) 進行定位及距離的撰寫吧。

首先在程式 (.java) 的部分小黑人大概分為兩個部分 :
(1).建立物件 - 其中物件屬性包含景點名稱景點緯度景點經度距離
(2).主程式 - 包含讀取我的座標距離判斷物件遠近排序依距離呈現公尺or公里

1.建立物件 : 可以創建一個(.java)或直接寫在主程式裡。
//物件類別class,名稱為Poi
public class Poi
{
       private String Name;         //景點店家名稱
       private double Latitude;    //景點店家緯度
       private double Longitude;   //景點店家經度
       private double Distance;    //景點店家距離

       //建立物件時需帶入景點店家名稱、景點店家緯度、景點店家經度
       public Poi(String name , double latitude , double longitude)
       {
         //將資訊帶入類別屬性
          Name = name ;
          Latitude = latitude ;
          Longitude = longitude ;
       }
      
      //取得店家名稱
       public String getName()
       {
          return Name;
       }

      //取得店家緯度
       public double getLatitude()
       {
          return Latitude;
       }

      //取得店家經度
       public double getLongitude()
       {
          return Longitude;
       }

      //寫入店家距離
       public void setDistance(double distance)
       {
          Distance = distance;
       }
      
      //取的店家距離
       public double getDistance()
       {
          return Distance;
       }
}

2.主程式部分 : 定位、距離、排序等主要功能撰寫。
private LocationManager mLocationManager;               //宣告定位管理控制
private ArrayList<Poi> Pois = new ArrayList<Poi>();   //建立List,屬性為Poi物件
@Override
public void onCreate(Bundle savedInstanceState)
{
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

       //建立物件,並放入List裡 (建立物件需帶入名稱、緯度、經度)
       Pois.add(new Poi("台北車站" , 25.04661 , 121.5168 ));
       Pois.add(new Poi("台中車站" , 24.13682 , 120.6850 ));
       Pois.add(new Poi("台北101" , 25.03362 , 121.56500 ));
       Pois.add(new Poi("高雄85大樓" , 22.61177 , 120.30031 ));
       Pois.add(new Poi("九份老街" , 25.10988 , 121.84519 ));
       
      //取得定位權限
      mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

       //取得在Layout建立的Button元件
       Button btn = (Button) findViewById(R.id.btn);

      //Button按下觸發Listener
       btn.setOnClickListener(new OnClickListener()
       {
         @Override
         public void onClick(View v)
         {
             //按下按鈕後讀取我的位置,定位抓取方式為網路讀取
             //(若欲以GPS為定位抓取方式則更改成LocationManager.GPS_PROVIDER)
             // 最後則帶入定位更新Listener。
             mLocationManager.requestLocationUpdates
             (LocationManager.NETWORK_PROVIDER,0,10000.0f,LocationChange);
         }
       });
}

//更新定位Listener
public LocationListener LocationChange = new LocationListener()
{
     public void onLocationChanged(Location mLocation)
     {
      for(Poi mPoi : Pois)  
      {
          //for迴圈將距離帶入,判斷距離為Distance function
          //需帶入使用者取得定位後的緯度、經度、景點店家緯度、經度。
        mPoi.setDistance(Distance(mLocation.getLatitude(),
                                  mLocation.getLongitude(),
                                  mPoi.getLatitude(),
                                  mPoi.getLongitude()));
        }
          
      //依照距離遠近進行List重新排列
        DistanceSort(Pois);

      //印出我的座標-經度緯度
      Log.d("TAG", "我的座標 - 經度 : " + mLocation.getLongitude() + "  , 緯度 : " + mLocation.getLatitude() );

      //for迴圈,印出景點店家名稱及距離,並依照距離由近至遠排列
      //第一筆為最近的景點店家,最後一筆為最遠的景點店家
       for(int i = 0 ; i < Pois.size() ; i++ )
        {
          Log.d("TAG", "地點 : " + Pois.get(i).getName() + "  , 距離為 : " + DistanceText(Pois.get(i).getDistance()) );
        }
    }

    public void onProviderDisabled(String provider)
    {
    }
        
    public void onProviderEnabled(String provider)
    {
    }
        
    public void onStatusChanged(String provider, int status,Bundle extras)
    {
    }
};

@Override
protected void onDestroy()
{
   super.onDestroy();
   mLocationManager.removeUpdates(LocationChange);  //程式結束時停止定位更新
}

//帶入距離回傳字串 (距離小於一公里以公尺呈現,距離大於一公里以公里呈現並取小數點兩位)
private String DistanceText(double distance)
{
   if(distance < 1000 ) return String.valueOf((int)distance) + "m" ;
   else return new DecimalFormat("#.00").format(distance/1000) + "km" ;
}

//List排序,依照距離由近開始排列,第一筆為最近,最後一筆為最遠
private void DistanceSort(ArrayList<Poi> poi)
{
   Collections.sort(poi, new Comparator<Poi>()
   {
      @Override
      public int compare(Poi poi1, Poi poi2)
      {
          return poi1.getDistance() < poi2.getDistance() ? -1 : 1 ;
      }
   });
}

//帶入使用者及景點店家經緯度可計算出距離
public double Distance(double longitude1, double latitude1, double longitude2,double latitude2)
{
   double radLatitude1 = latitude1 * Math.PI / 180;
   double radLatitude2 = latitude2 * Math.PI / 180;
   double l = radLatitude1 - radLatitude2;
   double p = longitude1 * Math.PI / 180 - longitude2 * Math.PI / 180;
   double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(l / 2), 2)
                    + Math.cos(radLatitude1) * Math.cos(radLatitude2)
                    * Math.pow(Math.sin(p / 2), 2)));
   distance = distance * 6378137.0;
   distance = Math.round(distance * 10000) / 10000;

   return distance ;
}

/*** 印出的結果為 :
      *
      * 我的座標 - 經度 : 121.56024  , 緯度 : 25.03935
      * 地點 : 台北101  , 距離為 : 626m
      * 地點 : 台北車站  , 距離為 : 4.85km
      * 地點 : 九份老街  , 距離為 : 31.99km
      * 地點 : 台中車站  , 距離為 : 110.40km
      * 地點 : 高雄85大樓  , 距離為 : 197.37km
      *
*/
以上就是讀取我的位置定位、距離判斷、List排序、建立物件等等程式碼,各位請享用~ XDD
定位功能可以運用在很多地方,包含結合地圖、距離、方向等等很多有趣的地方,這些有趣的結合運用小黑人會慢慢跟大家分享~哈。
最後如有任何問題可以跟小黑人討論唷,希望大家可以互相交流~~~謝謝大家!!! ^^

140 則留言:

  1. 我是好幾次還是有錯誤,
    請問可以給我正確的sourcr code嗎? 感謝你~~

    回覆刪除
  2. 哈囉~抱歉這麼晚才回覆你!
    有錯誤嗎!?可以請問是程式哪裡出現錯誤呢?? (LogCat的錯誤位置)
    這篇有五個重點要注意,
    第一是權限要開啟,
    第二是物件的建立,
    第三是我的位置的取得,
    第四是距離的計算,
    第五是距離的排序。

    文章內小黑人都是放完整的程式囉! ^^
    要再請您試試看或提醒小黑人錯誤的地方~
    小黑人會依照您提供錯誤的地方進行測試與解決!!

    回覆刪除
  3. 小黑人您好 小弟我利用您的Code撰寫 為什麼距離顯示出9465824.0而不是跟您一樣的是多少km,請問哪裡出錯了呢?
    謝謝您的分享

    回覆刪除
    回覆
    1. Hi~~~您好啊 ^^
      關於您的問題"9465824.0"這個是印出距離嗎?
      首先小黑人先判斷您程式是否有進入到計算距離的地方,
      所以在印出距離後面有加上"m"or"km"嗎?
      再來是否可以先請您確認"我的位置"的經緯度是否有取得,
      最後在取得我的位置後Poi class的setDistance帶入參數要正確喔,
      Distance("我的位置的緯度","我的位置的經度","景點的緯度","景點的經度")
      這樣距離是可以被計算出來的,然後再判斷公里與公尺也是沒問題的,
      再請您測試看看囉!
      謝謝您的提問~ ^^

      刪除
  4. Hi~~~您好啊 ^^
    關於您的問題"9465824.0"這個是印出距離嗎?
    首先小黑人先判斷您程式是否有進入到計算距離的地方,
    所以在印出距離後面有加上"m"or"km"嗎?
    再來是否可以先請您確認"我的位置"的經緯度是否有取得,
    最後在取得我的位置後Poi class的setDistance帶入參數要正確喔,
    Distance("我的位置的緯度","我的位置的經度","景點的緯度","景點的經度")
    這樣距離是可以被計算出來的,然後再判斷公里與公尺也是沒問題的,
    再請您測試看看囉!
    謝謝您的提問~ ^^

    回覆刪除
  5. 謝謝小黑人解答,已解決,有地方沒注意到所以打錯了。XD
    能冒昧請問小黑人您一下
    有辦法將我的位置與景點位置的經緯度畫出線這樣嗎?
    謝謝您的分享從中學到很多^^

    回覆刪除
    回覆
    1. 不好意思喔,小黑人最近在研究開發一些新技術元件,
      ...現在才看到留言!!! 抱歉~~~ >"<
      哈~~針對您的問題,我的位置與景點兩點進行畫線,
      答案是可以的,在Overlay類別內進行繪製即可,
      這主題小黑人會在之後分享: 如何自行繪製圖形線條至Google Map上,
      感謝您的提問! ^^

      刪除
  6. 老師你好 請問一下 若我在地圖上 有標示5個地點
    分別距離我位置是 100 200 500 1000 10000
    然後我該如何 讓他在我收尋600公尺以內有哪些座標
    讓他顯示有 100 200 500 其他2個座標不會顯示出來

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人向您說明,
      其實方法也是一樣的,您在畫五個座標點應該會給與座標的經緯度位置(Overlay類別),
      只要在繪製座標點前加入if距離判斷就可以囉,只要小於600公尺內才准繪製座標點!
      在您給予點的座標時就可以進行距離判斷,再將距離帶入進行即可符合您的需求!
      您可以測試看看喔 ^^

      感謝您的提問!

      刪除
    2. 老師您好
      是否可以寫一下 範例程式碼 給我 學習嗎?
      我不知道要如何寫 if 判斷
      是否可以簡單寫1.2行告知 謝謝

      刪除
    3. 您好,小黑人已經把此範例程式放入網路上,
      下載連結為:
      https://dl.dropboxusercontent.com/u/73681725/Example/SourceCode/DemoLocation.zip

      您可以再試試看喔!!! ^^
      另外小黑人還有把範圍距離判斷加入程式內~

      感謝您!

      刪除
  7. 請問小黑人大大

    是否能給我 main.xml的layout排版 程式碼

    或是能否把整個資料檔寄到我信箱

    u0051034@nkfust.edu.tw

    回覆刪除
    回覆
    1. 您好,小黑人已經把此範例程式放入網路上,
      下載連結為:
      https://dl.dropboxusercontent.com/u/73681725/Example/SourceCode/DemoLocation.zip

      您可以再試試看喔!!! ^^
      另外小黑人還有把範圍距離判斷加入程式內~

      感謝您!

      刪除
  8. 作者已經移除這則留言。

    回覆刪除
  9. 老師您好,
    我照你上面1.2點的程式碼 寫道主程式理 還是有錯誤的地方
    我想跟您索取 此程式專案檔,不知道老師您是否願意給我 參考學習 謝謝
    我信箱是 g24063041@gmail.com

    回覆刪除
    回覆
    1. 您好,小黑人已經把此範例程式放入網路上,
      下載連結為:
      https://dl.dropboxusercontent.com/u/73681725/Example/SourceCode/DemoLocation.zip

      您可以再試試看喔!!! ^^
      另外小黑人還有把範圍距離判斷加入程式內~

      感謝您!

      刪除
  10. 老師您好
    我開1個新專案後
    修改您提供的
    1.建立物件
    2.主程式部分
    AndroidManifest.xml
    這3個程式碼打上去後
    還是不能執行 會有錯誤在2.主程式部分
    是還有其他 要設定嗎?
    我試了1個晚上都沒有是出來
    在麻煩老師看看能不能給我您做好的 專案檔 謝謝

    回覆刪除
    回覆
    1. 您好,小黑人已經把此範例程式放入網路上,
      下載連結為:
      https://dl.dropboxusercontent.com/u/73681725/Example/SourceCode/DemoLocation.zip

      您可以再試試看喔!!! ^^
      另外小黑人還有把範圍距離判斷加入程式內~

      感謝您!

      刪除
  11. //取得在Layout建立的Button元件
    Button btn = (Button) findViewById(R.id.btn);

    在(R.id.btn) btn我有出現紅線錯誤訊息 btn cannot be resolved or is not a field

    回覆刪除
    回覆
    1. 您好,出現此錯誤代表您在layout檔上尚未做Button的命名喔!

      小黑人已經把此範例程式放入網路上,
      下載連結為:
      https://dl.dropboxusercontent.com/u/73681725/Example/SourceCode/DemoLocation.zip

      您可以再試試看喔!!! ^^
      另外小黑人還有把範圍距離判斷加入程式內~

      感謝您!

      刪除
  12. 老師您好 剛剛我有測試了範例
    我看您好像有設定顯示50km內的功能
    但是我拿您的範例測試時
    超過50km他還是會把地標顯示出來

    是我自己本身問題.還是程式碼 有需要自己修改?

    回覆刪除
    回覆
    1. 您好,小黑人範例裡印出的距離位置是抓取自己的所在位置進行距離判斷,
      所以您在測試時距離一定會不一樣,至於如果範圍設定50km後距離超過
      50km還是有顯示的話,可能要請您先檢查五個點距離個別是多少,然後在
      設定好if的範圍設定值if(Pois.get(i).getDistance() < 20000 ),
      這樣應該是可以達到距離篩選判斷的功能,再請您測試看看。

      感謝您的提問!!! ^^

      刪除
  13. 我測試時 就指印出
    *** 印出的結果為 :
    *
    * (未設定範圍距離)
    * 我的座標 - 經度 : 121.56024 , 緯度 : 25.03935
    * 地點 : 台北101 , 距離為 : 626m
    * 地點 : 台北車站 , 距離為 : 4.85km
    * 地點 : 九份老街 , 距離為 : 31.99km
    * 地點 : 台中車站 , 距離為 : 110.40km
    * 地點 : 高雄85大樓 , 距離為 : 197.37km

    這下面沒有印出 是因為我手機螢幕太小 下面沒有看到嗎?
    * (設定範圍距離為50000則顯示為:)
    * 我的座標 - 經度 : 121.56024 , 緯度 : 25.03935
    * 地點 : 台北101 , 距離為 : 626m
    * 地點 : 台北車站 , 距離為 : 4.85km
    * 地點 : 九份老街 , 距離為 : 31.99km
    *
    */

    回覆刪除
    回覆
    1. 您好,這兩個部分只會顯示一個喔,
      上面的部分為沒有做距離範圍設定,所以五個點位置距離都會顯示出來,
      下面的部分為有做範圍設定,50km內的座標位置才會顯示出來,
      所以只看到一個部分是正常的。

      感謝您的提問 ^^

      刪除
  14. 老師您好
    * 地點 : 台北101 , 距離為 : 626m
    * 地點 : 台北車站 , 距離為 : 4.85km
    * 地點 : 九份老街 , 距離為 : 31.99km
    * 地點 : 台中車站 , 距離為 : 110.40km
    * 地點 : 高雄85大樓 , 距離為 : 197.37km
    如果我有200個點 按查詢後 發現他沒辦法往下拉 我要在哪部分修改?

    回覆刪除
    回覆
    1. 作者已經移除這則留言。

      刪除
    2. 您好,因為小黑人範例只使用一層TextView來顯示文字,
      只有TextView是無法進行拖拉的,
      所以如果要進行拖拉的動作就必須在layout(xml)裡的TextView外層加上一個ScrollView,
      範例如:
      < ScrollView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_above="@id/btn"
      >

      < TextView
      android:id="@+id/text"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:gravity="center_vertical|left"
      / >

      < / ScrollView >

      加入以上即可進行拖拉動作,
      感謝您的提問!!! ^^

      刪除
    3. 小黑人你好,我也是個新手>"<
      拜讀妳很多文章,剛好看到這個問題,我在學習過程中有接觸到過
      Q:如果我有200個點 按查詢後 發現他沒辦法往下拉 我要在哪部分修改?

      這個問題主要就是項目拉太長並且呈現在TextView上,所以才無法拖拉,除了黑人大哥的方法,也可以考慮用ListView 搭Adapter來做,
      不過有一個最簡單快速的方法~~~~~~直接對你的TextView做以下程式碼↓↓↓

      .setMovementMethod(ScrollingMovementMethod.getInstance());

      加上這行在.java即可以做到類似ScrollView的功能,對過長的TextView進行拖拉^_^

      刪除
  15. 小黑人您好:
    如果要讓顯示結果利用 listview 來製作,
    該如何下手? 是否可以稍微指點一下謝謝

    回覆刪除
    回覆
    1. 您好,如果要以ListView方式呈現的話,
      第一步需要先更改layout(xml),把TextView更改成ListView,
      第二步就是在程式裡(.java)ListView的設定,
      首先ListView要setAdapter(放入您設定的Adapter),
      在Adapter裡的設定:
      getCount的return為Pois.size();
      getView的return為TextView(要自己新增,ex: TextView text = new TextView(MainActivity.this)),此TextView要setText(Pois.get(position).getDistance())把距離放入。

      以上就可以把每個點的距離以ListView方式呈現,
      您可以試試看喔,感謝您的提問!!! ^^

      刪除
  16. 小黑人老師 我有參考網路上的資料 這篇
    http://stackoverflow.com/questions/8073018/how-do-i-add-items-to-listview-dynamically-in-android
    not using XML

    我有把它添加進去...但是有錯誤...不知道小黑人老師 可以指點一下嗎?

    回覆刪除
    回覆
    1. 您好,您貼的網路參考資料也是一種呈現ListView的方法,
      如果以這種方式顯示ListView的話,共分為幾個步驟:
      1.首先取得ListView元件
      mList = (ListView) findViewById(R.id.list);
      2.新增ArrayAdapter並放入List Adapter內
      ArrayAdapter arrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1);
      mList.setAdapter(arrayAdapter);
      3.在印出景點距離的迴圈內放入arrayAdapter景點距離文字
      arrayAdapter.add("地點 : " + Pois.get(i).getName() + " , 距離為 : " + DistanceText(Pois.get(i).getDistance()));

      以上就可以呈現出List的方式,您可以試試看,
      感謝您的提問!!! ^^

      刪除
  17. 老師您好
    我有在 layout(xml)
    放入


    然後程式裡(.java)ListView的設定

    我是要在你的範例 哪1段 去設定?
    是在這裏面設定嗎?

    public LocationListener LocationChange = new LocationListener()
    {
    public void onLocationChanged(Location mLocation)
    {
    for(Poi mPoi : Pois)
    {

    回覆刪除
    回覆
    1. 您好,範例如下:
      mList = (ListView) findViewById(R.id.list);

      //在整理Poi排序DistanceSort(Pois)下方放入:
      mList.setAdapter(new PoiListAdapter());

      //Adapter Class內容為:
      public class PoiListAdapter extends BaseAdapter
      {
      @Override
      public int getCount()
      {
      return Pois.size();
      }

      @Override
      public Object getItem(int position)
      {
      return null;
      }

      @Override
      public long getItemId(int position)
      {
      return 0;
      }

      @Override
      public View getView(int position, View convertView, ViewGroup parent)
      {
      TextView mText = new TextView(MainActivity.this);
      mText.setText("地點 : " + Pois.get(position).getName() + " , 距離為 : " + DistanceText(Pois.get(position).getDistance()));
      return mText;
      }
      }

      以上也是呈現ListView的方式,您再試試看!!!
      感謝您的提問 ^^

      刪除
  18. 老師您好:
    可以再次麻煩您再讓費一下寶貴時間嗎?
    可以利用ListView 方式製作的程式碼給參考,與學習
    我目前是學生,專題需要用到老師您的這種GPS範例,在學校哩,到目前
    我是都還沒有耶觸過Listview
    我是android初學者,您給我的珍貴提示,我還是有點不太懂要整麼放進範例裡,讓此例子可以使用Listview
    所以在此想請老師是否可以製作一下範例給我參考與學習
    謝謝老師

    回覆刪除
    回覆
    1. 您好,簡單的向您說明ListView的使用方法,
      簡單的說法是ListView算是列表呈現的大框架,
      其中每一格列表內容其實是要藉由Adapter來運用,
      所以一開始要先mList = (ListView) findViewById(R.id.list);
      然後在Poi排序DistanceSort(Pois)完的時候再把ListView加入Adapter(mList.setAdapter(new PoiListAdapter());),
      然後這個Adapter其實是一個Class,所以要在外層加入這個Class,
      public class PoiListAdapter extends BaseAdapter
      {
      @Override
      public int getCount()
      {
      return Pois.size();
      }

      @Override
      public Object getItem(int position)
      {
      return null;
      }

      @Override
      public long getItemId(int position)
      {
      return 0;
      }

      @Override
      public View getView(int position, View convertView, ViewGroup parent)
      {
      TextView mText = new TextView(MainActivity.this);
      mText.setText("地點 : " + Pois.get(position).getName() + " , 距離為 : " + DistanceText(Pois.get(position).getDistance()));
      return mText;
      }
      }

      這樣就可以呈現ListView囉,您可以試試看,
      如果有不懂或疑問可以提出,大家互相交流,
      感謝您!!! ^^

      刪除
  19. 那老師 我在 layout xml

    裡原本的



    要刪除掉嗎?

    裡面是要新增以下這個嗎?

    回覆刪除
    回覆
    1. 原本的
      android:id="@+id/text"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_above="@id/btn"
      android:gravity="center_vertical|left"
      需要刪除嗎?

      刪除
    2. 那老師 我在 layout xml
      裡面是要新增以下這個嗎?

      android:id="@+id/android:list"

      android:orientation="vertical"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      刪除
    3. 目前我是加入這行 Adapter(mList.setAdapter(new PoiListAdapter());)
      有錯誤訊息
      Syntax error on token(s), misplaced construct(s)

      刪除
    4. 哈囉~好久不見...小黑人之前比較忙一點,真的很抱歉!
      首先根據您的問題小黑人向您解釋,
      如果您要用list方式呈現就要在加入layout.xml加入ListView元件喔,
      如果是要用Text呈現就要加入TextView元件,
      所以如果用ListView的話,在程式裡就要針對ListView加入Adapter,
      PoiListAdapter是需要自行放入的class,上方有提供程式碼唷,
      所以放入Adapter後就會以list方式呈現位置距離囉!

      感謝您的提問 ^^

      刪除
  20. 老師您好:
    再次打擾
    我看您一上說明得很詳細,
    是否可以請您把它加到您的範例後,分享想壓縮檔給我參考學習嗎?
    我現在的問題可能很難用文字表達
    入我參考你完整的範例後,
    我應該就知道我的問題在哪邊出錯
    再次謝謝老師

    回覆刪除
    回覆
    1. 哈囉~好久不見...小黑人之前比較忙一點,真的很抱歉!
      小黑人在下方有看到留言說已經成功了吧。
      不知道是您嗎? 哈~因為大家的留言名稱都是用匿名方式,小黑人有點混亂,
      如果可以用list方式呈現了就恭喜您囉 ^^

      感謝您的提問!

      刪除
  21. public class MainActivity extends Activity
    {
    //宣告定位管理控制
    private LocationManager mLocationManager;
    //建立List,屬性為Poi物件
    private ArrayList Pois = new ArrayList();
    //TextView元件
    private TextView mText;

    private ListView mList;
    //String字串
    private String TEXT;
    //設定距離範圍
    private int DISTANCE = 50000;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //建立物件,並放入List裡 (建立物件需帶入名稱、緯度、經度)
    Pois.add(new Poi("O1 西子灣-海之冰" , 22.61997, 120.27108 ));
    Pois.add(new Poi("阿木的店" ,22.6272, 120.2708 ));
    120.271210 ));


    //取得定位權限
    mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    //取得在Layout建立的Button元件
    Button btn = (Button) findViewById(R.id.btn);
    //取得在Layout建立的TextView元件
    //mText = (TextView) findViewById(R.id.text);
    mList = (ListView) findViewById(R.id.list);

    //Button按下觸發Listener
    btn.setOnClickListener(new OnClickListener()
    {
    @Override
    public void onClick(View v)
    {
    //按下按鈕後讀取我的位置,定位抓取方式為網路讀取(若欲以GPS為定位抓取方式則更改成LocationManager.GPS_PROVIDER),最後則帶入定位更新Listener。
    mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,10000.0f,LocationChange);
    }
    });
    }

    //更新定位Listener
    public LocationListener LocationChange = new LocationListener()
    {
    public void onLocationChanged(Location mLocation)
    {
    for(Poi mPoi : Pois)
    {
    //for迴圈將距離帶入,判斷距離為Distance function,需帶入使用者取得定位後的緯度、經度、景點店家緯度、經度。
    mPoi.setDistance(Distance(mLocation.getLatitude(),mLocation.getLongitude(),mPoi.getLatitude(),mPoi.getLongitude()));
    }

    //依照距離遠近進行List重新排列
    DistanceSort(Pois);
    mList.setAdapter(new PoiListAdapter());

    //印出我的座標-經度緯度
    TEXT = "我的座標 - 經度 : " + mLocation.getLongitude() + " , 緯度 : " + mLocation.getLatitude() ;

    //for迴圈,印出景點店家名稱及距離,並依照距離由近至遠排列,第一筆為最近的景點店家,最後一筆為最遠的景點店家
    for(int i = 0 ; i < Pois.size() ; i++ )
    {
    //範圍距離篩選,小於範圍內的才可以顯示
    if(Pois.get(i).getDistance() < DISTANCE)
    {
    TEXT = TEXT + "\n" + "地點 : " + Pois.get(i).getName() + " , 距離為 : " + DistanceText(Pois.get(i).getDistance()) ;
    }
    }

    mText.setText(TEXT);
    }

    public void onProviderDisabled(String provider)
    {
    }

    public void onProviderEnabled(String provider)
    {
    }

    public void onStatusChanged(String provider, int status,Bundle extras)
    {
    }
    };

    @Override
    protected void onDestroy()
    {
    super.onDestroy();
    mLocationManager.removeUpdates(LocationChange); //程式結束時停止定位更新
    }

    //帶入距離回傳字串 (距離小於一公里以公尺呈現,距離大於一公里以公里呈現並取小數點兩位)
    private String DistanceText(double distance)
    {
    if(distance < 1000 ) return String.valueOf((int)distance) + "m" ;
    else return new DecimalFormat("#.00").format(distance/1000) + "km" ;
    }

    //List排序,依照距離由近開始排列,第一筆為最近,最後一筆為最遠
    private void DistanceSort(ArrayList poi)
    {
    Collections.sort(poi, new Comparator()
    {
    @Override
    public int compare(Poi poi1, Poi poi2)
    {
    return poi1.getDistance() < poi2.getDistance() ? -1 : 1 ;
    }
    });
    }

    回覆刪除
    回覆
    1. //帶入使用者及景點店家經緯度可計算出距離
      public double Distance(double longitude1, double latitude1, double longitude2,double latitude2)
      {
      double radLatitude1 = latitude1 * Math.PI / 180;
      double radLatitude2 = latitude2 * Math.PI / 180;
      double l = radLatitude1 - radLatitude2;
      double p = longitude1 * Math.PI / 180 - longitude2 * Math.PI / 180;
      double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(l / 2), 2)
      + Math.cos(radLatitude1) * Math.cos(radLatitude2)
      * Math.pow(Math.sin(p / 2), 2)));
      distance = distance * 6378137.0;
      distance = Math.round(distance * 10000) / 10000;

      return distance ;
      }

      public class PoiListAdapter extends BaseAdapter
      {
      @Override
      public int getCount()
      {
      return Pois.size();
      }

      @Override
      public Object getItem(int position)
      {
      return null;
      }

      @Override
      public long getItemId(int position)
      {
      return 0;
      }

      @Override
      public View getView(int position, View convertView, ViewGroup parent)
      {
      TextView mText = new TextView(MainActivity.this);
      mText.setText("地點 : " + Pois.get(position).getName() + " , 距離為 : " + DistanceText(Pois.get(position).getDistance()));
      return mText;
      }
      }
      }

      刪除
    2. 感謝您幫忙轉貼範例程式碼,這樣大家會比較清楚程式的寫法! ^^
      如果有疑問的話可以與小黑人討論唷!

      刪除




  22. 我有把玩本 textview 刪除
    然後 我執行程式後 發現 按查詢 甚麼東西都沒有出現 不知道哪邊出錯了 請老師指點一下 謝謝

    回覆刪除
    回覆
    1. 哈囉~好久不見...小黑人之前比較忙一點,真的很抱歉!
      首先根據您的問題小黑人向您解釋,
      小黑人推測您應該只有帶入ListView但沒有為ListView加入Adapter喔,
      要加入Adapter ListView才會有畫面產生唷,
      您可以試試看,如有問題小黑人在與您討論。

      感謝您的提問 ^^

      刪除
  23. 老師您好, 您上的教學我有跟著做,程式碼是沒有紅線錯誤,但是我做完後 按查詢他都空白,是否可以請老師做一次給我參考學習,謝謝
    我研究了2天都還是弄不出來,不知道哪裡錯誤

    回覆刪除
    回覆
    1. 希望老師可以 上傳listview 做好的檔案上來給我 參考學習 謝謝

      刪除
    2. 哈囉~好久不見...小黑人之前比較忙一點,真的很抱歉!
      首先根據您的問題小黑人向您解釋,
      小黑人推測您應該只有帶入ListView但沒有為ListView加入Adapter喔,
      要加入Adapter ListView才會有畫面產生唷,
      您可以試試看,如有問題小黑人在與您討論。

      感謝您的提問 ^^

      刪除
  24. 老師您好listview 方面我已經完成了 謝謝您的指導

    回覆刪除
    回覆
    1. 恭喜您 ^^
      大家一起研究才會更進步唷!!

      刪除
  25. 老師您好 目前是只有1個 按鈕 查詢距離

    如何再立用3個按鈕

    按鈕1 顯示500公尺內商家
    按鈕2 顯示1000公尺內商家
    按鈕3 顯示1500公尺內商家

    回覆刪除
    回覆
    1. 哈囉~好久不見...小黑人之前比較忙一點,真的很抱歉!
      首先根據您的問題小黑人向您解釋,
      其實作法是一樣的,只要個別在距離篩選的函式內加入不同的範圍距離即可,
      如:
      500公尺內 -> if(Pois.get(i).getDistance() < 500)
      1000公尺內 -> if(Pois.get(i).getDistance() < 1000)
      1500公尺內 -> if(Pois.get(i).getDistance() < 1500)
      這樣就可以囉,請您再試試看唷!

      感謝您的提問 ^^

      刪除
  26. 老師您好:
    我想請問 java上如何使用 google 裡的內容去計算地圖上兩點 (有兩點的經緯度)
    的最短路徑距離嗎?不是兩點直線距離喔! 是依照google規劃出的地圖路線去計算兩點實際地圖距離。我可以從這篇下去改嗎? 我改了好久但是還是不行,可以請老師指導我一下嗎?我的開發環境是eclipse

    回覆刪除
    回覆
    1. 哈囉~好久不見...小黑人之前比較忙一點,真的很抱歉!
      首先根據您的問題小黑人向您解釋,
      如果要計算實際路程距離的話,老實說這一篇是沒有辦法的計算的...
      哈~如果要實際計算的話必須引用Google 路線規劃的api來查詢距離,
      這樣就可以達到您的需求,您可以試試看唷!

      感謝您的提問 ^^

      刪除
  27. 老師你好:
    我也是想做listview呈現,我有參考上方的留言
    poi檔跟老師設定一樣
    我想做2顆按鈕讀取10km 和20km 範圍內的地標
    但是我做出來的結果是 按下 Button 10km 和 Button 20km 再listview裡顯示的結果都是
    20km不知道哪裡錯誤 請老師教導一下謝謝

    回覆刪除
    回覆
    1. 哈囉~同學您好啊 ^^
      小黑人有看一下您下方貼的程式碼,
      有看到一個地方怪怪的喔 ->
      mList = (ListView) findViewById(R.id.list);
      mList1 = (ListView) findViewById(R.id.list);
      這兩個ListView都是findViewById(R.id.list) ??
      還是一個是R.id.list一個是R.id.list1,
      如果兩個都是findViewById同一個就會都顯示一樣的喔。
      mList = (ListView) findViewById(R.id.list);
      mList1 = (ListView) findViewById(R.id.list1);

      您可以確認看看喔^^
      感謝您的提問!

      刪除
  28. 作者已經移除這則留言。

    回覆刪除
    回覆
    1. 作者已經移除這則留言。

      刪除
    2. public class MainActivity extends Activity
      {
      //宣告定位管理控制
      private LocationManager mLocationManager;
      //建立List,屬性為Poi物件
      private ArrayList Pois = new ArrayList();
      //ListView元件
      private ListView mList;
      private ListView mList1;
      //設定距離範圍
      private int DISTANCE = 10000;
      private int DISTANCE1 = 20000;

      @Override
      public void onCreate(Bundle savedInstanceState)
      {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      //建立物件,並放入List裡 (建立物件需帶入名稱、緯度、經度)
      Pois.add(new Poi("O1 西子灣-海之冰" , 22.61997, 120.27108 ));
      Pois.add(new Poi("O1 西子灣-阿木的店" ,22.6272, 120.2708 ));


      //取得定位權限
      mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

      //取得在Layout建立的Button元件
      Button btn = (Button) findViewById(R.id.btn);
      Button btn1 = (Button) findViewById(R.id.btn1);

      mList = (ListView) findViewById(R.id.list);
      mList1 = (ListView) findViewById(R.id.list);

      //Button按下觸發Listener
      btn.setOnClickListener(new OnClickListener()

      {
      @Override
      public void onClick(View v)
      {
      //按下按鈕後讀取我的位置,定位抓取方式為網路讀取(若欲以GPS為定位抓取方式則更改成LocationManager.GPS_PROVIDER),最後則帶入定位更新Listener。
      mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,10000.0f,LocationChange);
      }
      }
      );

      btn1.setOnClickListener(new OnClickListener()

      {
      @Override
      public void onClick(View v)
      {
      //按下按鈕後讀取我的位置,定位抓取方式為網路讀取(若欲以GPS為定位抓取方式則更改成LocationManager.GPS_PROVIDER),最後則帶入定位更新Listener。
      mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,10000.0f,LocationChange);
      }
      }


      );
      }

      //更新定位Listener
      public LocationListener LocationChange = new LocationListener()
      {
      public void onLocationChanged(Location mLocation)
      {
      for(Poi mPoi : Pois)
      {
      //for迴圈將距離帶入,判斷距離為Distance function,需帶入使用者取得定位後的緯度、經度、景點店家緯度、經度。
      mPoi.setDistance(Distance(mLocation.getLatitude(),mLocation.getLongitude(),mPoi.getLatitude(),mPoi.getLongitude()));
      }

      //依照距離遠近進行List重新排列
      DistanceSort(Pois);
      mList.setAdapter(new PoiListAdapter());
      mList1.setAdapter(new PoiListAdapter1());


      }



      public void onProviderDisabled(String provider)
      {
      }

      public void onProviderEnabled(String provider)
      {
      }

      public void onStatusChanged(String provider, int status,Bundle extras)
      {
      }
      };

      @Override
      protected void onDestroy()
      {
      super.onDestroy();
      mLocationManager.removeUpdates(LocationChange); //程式結束時停止定位更新
      }

      //帶入距離回傳字串 (距離小於一公里以公尺呈現,距離大於一公里以公里呈現並取小數點兩位)
      private String DistanceText(double distance)
      {
      if(distance < 1000 ) return String.valueOf((int)distance) + "m" ;
      else return new DecimalFormat("#.00").format(distance/1000) + "km" ;
      }

      //List排序,依照距離由近開始排列,第一筆為最近,最後一筆為最遠
      private void DistanceSort(ArrayList poi)
      {
      Collections.sort(poi, new Comparator()
      {
      @Override
      public int compare(Poi poi1, Poi poi2)
      {
      return poi1.getDistance() < poi2.getDistance() ? -1 : 1 ;
      }
      });
      }

      刪除
    3. //帶入使用者及景點店家經緯度可計算出距離
      public double Distance(double longitude1, double latitude1, double longitude2,double latitude2)
      {
      double radLatitude1 = latitude1 * Math.PI / 180;
      double radLatitude2 = latitude2 * Math.PI / 180;
      double l = radLatitude1 - radLatitude2;
      double p = longitude1 * Math.PI / 180 - longitude2 * Math.PI / 180;
      double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(l / 2), 2)
      + Math.cos(radLatitude1) * Math.cos(radLatitude2)
      * Math.pow(Math.sin(p / 2), 2)));
      distance = distance * 6378137.0;
      distance = Math.round(distance * 10000) / 10000;

      return distance ;
      }

      public class PoiListAdapter extends BaseAdapter
      {
      @Override
      public int getCount()
      {
      return Pois.size();
      }

      @Override
      public Object getItem(int position)
      {
      return null;
      }

      @Override
      public long getItemId(int position)
      {
      return 0;
      }

      @Override
      public View getView(int position, View convertView, ViewGroup parent)

      {

      TextView mText = new TextView(MainActivity.this);
      if(Pois.get(position).getDistance() < DISTANCE)
      mText.setText("地點 : " + Pois.get(position).getName() + " , 距離為 : " + DistanceText(Pois.get(position).getDistance()));
      return mText;

      }



      }
      public class PoiListAdapter1 extends BaseAdapter
      {
      @Override
      public int getCount()
      {
      return Pois.size();
      }

      @Override
      public Object getItem(int position)
      {
      return null;
      }

      @Override
      public long getItemId(int position)
      {
      return 0;
      }

      @Override
      public View getView(int position, View convertView, ViewGroup parent)

      {

      TextView mText = new TextView(MainActivity.this);
      if(Pois.get(position).getDistance() < DISTANCE1)
      mText.setText("地點 : " + Pois.get(position).getName() + " , 距離為 : " + DistanceText(Pois.get(position).getDistance()));
      return mText;

      }
      }
      }

      刪除
    4. 老師你好:我還有2個地方不太懂
      1.mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,10000.0f,LocationChange); 裡面的 requestLocationUpdates 意思是?
      2.public View getView(int position, View convertView, ViewGroup parent) 裡面的getView 是神麼意思

      刪除
    5. 哈囉~阿凱同學您好 ^^
      針對您的問題小黑人向您解說,
      1.requestLocationUpdates函式是更新取的使用者目前的位置(我的位置),
      裡面帶的參數是利用何種方式抓取"網路"或"GPS"還有多久更新一次還有抓到位置後觸發的funtion。
      2.getView是Adapter內的一個funtion,它的目的是顯示ListView裡面的內容畫面,也就是藉由getView來呈現List裡面一格一格內的畫面,list.setAdaptet就是將畫面帶入list內。

      以上這兩個意思不知您還有不懂嗎,
      感謝您的提問 ^^

      刪除
  29. 老師你好:這是我目前製作的
    https://docs.google.com/file/d/0B9tCj2CNf492cENQNXB2bWpxdlk/edit?usp=sharing
    不過 做10km  跟20km 內的店家 是乎有錯誤 不知道哪裡錯誤了
    按下去後 都是顯示20km裡店家地標

    回覆刪除
    回覆
    1. 哈囉~阿凱您好,
      都顯示一樣的問題是否是跟小黑人上方的留言一樣呢,
      mList = (ListView) findViewById(R.id.list);
      mList1 = (ListView) findViewById(R.id.list);
      這兩個ListView都是findViewById(R.id.list) ??
      還是一個是R.id.list一個是R.id.list1,
      如果兩個都是findViewById同一個就會都顯示一樣的喔。
      mList = (ListView) findViewById(R.id.list);
      mList1 = (ListView) findViewById(R.id.list1);

      您可以確認看看喔,如有問題小黑人和您再一起解決 ^^
      感謝您的提問!

      刪除
  30. 作者已經移除這則留言。

    回覆刪除
  31. 老師 你好~環境目標是4.3的環境

    我正在試ArrayAdapter的部分,但我只是單純使用下列語法
    private ListView scan_list_1;
    private ArrayAdapter mArrayAdapter;

    在OnCreate裡面
    scan_list_1 = (ListView)findViewById(R.id.scan_list_1);
    mArrayAdapter = new ArrayAdapter(this, R.layout.main);
    scan_list_1.setAdapter(mArrayAdapter);
    mArrayAdapter.add("132");

    當我還沒加上mArrayAdapter.add("132");時,可執行APP
    但加上mArrayAdapter.add("132");後,就會停止回應。

    請問這是甚麼錯誤呢?

    麻煩老師了

    回覆刪除
    回覆
    1. 哈囉~同學您好!
      小黑人先向您說明一下ArrayAdapter的用法喔,
      首先在建立ArrayAdapter時必須要先給Array的型態(如ArrayAdapter),
      再來是ArrayAdapter要新增內容時不是用add的方法喔,
      是在建立ArrayAdapter時就要帶入list的內容了,
      最後給ArrayAdapter的layout時不是用現在Activity的R.layout.main,
      是要帶入您要放在list內的layout畫面,
      小黑人示範個範例給您:
      ListView mListView = (ListView) findViewById(R.id.list);
      ArrayAdapter mArrayAdapter = new ArrayAdapter(this,android.R.layout.simple_expandable_list_item_1,new String[] {"小黑人","Android","教室"});
      mListView.setAdapter(mArrayAdapter);

      您可以試試看喔!(小黑人範例裡的layout是用android內提供的內建layout)
      感謝您的提問 ^^

      刪除
    2. 哎呀~有地方被網頁語法吃掉了,小黑人重貼一次!

      哈囉~同學您好!
      小黑人先向您說明一下ArrayAdapter的用法喔,
      首先在建立ArrayAdapter時必須要先給Array的型態(如ArrayAdapter< String >),
      再來是ArrayAdapter要新增內容時不是用add的方法喔,
      是在建立ArrayAdapter時就要帶入list的內容了,
      最後給ArrayAdapter的layout時不是用現在Activity的R.layout.main,
      是要帶入您要放在list內的layout畫面,
      小黑人示範個範例給您:
      ListView mListView = (ListView) findViewById(R.id.list);
      ArrayAdapter< String > mArrayAdapter = new ArrayAdapter< String >(this,android.R.layout.simple_expandable_list_item_1,new String[] {"小黑人","Android","教室"});
      mListView.setAdapter(mArrayAdapter);

      您可以試試看喔!(小黑人範例裡的layout是用android內提供的內建layout)
      感謝您的提問 ^^

      刪除
    3. 恩恩~我目前正在試藍芽連線的程式,這邊主要是將搜尋到的藍芽加入列表
      後來程式改為
      private ArrayAdapter newDevicelistArrayAdapter;
      private ListView new_devices_list;


      newDevicelistArrayAdapter = new ArrayAdapter(this, R.layout.device_name);
      new_devices_list = (ListView)findViewById(R.id.new_devices_list);
      new_devices_list.setAdapter(newDevicelistArrayAdapter);

      pairDevicelistArrayAdapter.add(裝置名稱資訊);

      主要差異在於老師說的layout不是用現在Activity的R.layout.main,
      而是我新增了一個純TextView的layout,名字為device_name。
      所以newDevicelistArrayAdapter = new ArrayAdapter(this, R.layout.device_name);是將device_name中TextView的內容加入list嗎?

      可是我新增內容的方式主要還是用add
      是正常運作的

      刪除
    4. 哈囉~溫同學您好 ^^
      其實小黑人要做顯示裝置名稱資訊的列表時,小黑人不會選擇用ArrayAdapter放入List內,而是會選擇使用BaseAdapter,
      但如果還是要使用ArrayAdapter您可以試試這種方式看看喔,
      String[] mTexts = new String[] {"小黑人裝置一","小黑人裝置二","小黑人裝置三"};
      ArrayAdapter< String > mArrayAdapter = new ArrayAdapter< String >(this,android.R.layout.simple_expandable_list_item_1,mTexts);
      mListView.setAdapter(mArrayAdapter);

      Layout這部分是List內裡的每一個畫面,也就是您說的將device_name中TextView的內容加入list,
      add方式如果您是可以執行,那就可以用add方式新增內容,
      如果不行可能就要照小黑人所說的寫法去建立List囉。

      感謝您的提問!

      刪除
  32. 老師你好:
    我之前有嘗試過用
    mList = (ListView) findViewById(R.id.list);
    mList1 = (ListView) findViewById(R.id.list1);

    然後設2顆按鈕 假設1顆是10km 1顆是20km 按下第1顆後會顯示出來,然後按下第2顆
    顯示內容會重疊,不知道要如何修改!
    目前小弟我,想學習的是做2顆按鈕 限定不同的範圍,例如第1顆是顯示10km內的地標
    第2顆按鈕是顯示20km的地標不知道如何修改,請老師指點一下 謝謝!!

    回覆刪除
    回覆
    1. 哈囉~阿凱同學您好啊 ^^
      小黑人有看過您寫的程式囉,
      首先10km和20km畫面會重疊是因為Layout的部分沒有調整好,
      小黑人有幫您修改一下:




      < Button
      android:id="@+id/btn"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="10Km"
      android:layout_weight="1"
      / >

      < Button
      android:id="@+id/btn1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="20Km"
      android:layout_weight="1"
      / >

      < / LinearLayout >





      < / RelativeLayout >

      然後在src(.java)裡,小黑人有修正一些地方,
      1.只用一個Adapter Class就好,帶入欲顯示距離即可。
      2.當我按下20公里按鈕時隱藏10公里的畫面,按10公里按鈕隱藏20公里畫面。
      範例如下:

      //設定距離範圍
      private int DISTANCE = 10000;
      private int DISTANCE1 = 20000;

      //取得在Layout建立的Button元件
      Button btn = (Button) findViewById(R.id.btn);
      Button btn1 = (Button) findViewById(R.id.btn1);

      mList = (ListView) findViewById(R.id.list);
      mList1 = (ListView) findViewById(R.id.list1);

      //Button按下觸發Listener
      btn.setOnClickListener(new OnClickListener()
      {
      @Override
      public void onClick(View v)
      {
      mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,10000.0f,LocationChange);

      mList.setVisibility(View.VISIBLE);
      mList1.setVisibility(View.GONE);
      }});

      btn1.setOnClickListener(new OnClickListener()
      {
      @Override
      public void onClick(View v)
      {
      mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,10000.0f,LocationChange);
      mList.setVisibility(View.GONE);
      mList1.setVisibility(View.VISIBLE);
      }});
      }

      //更新定位Listener
      public LocationListener LocationChange = new LocationListener()
      {
      public void onLocationChanged(Location mLocation)
      {
      for(Poi mPoi : Pois)
      {
      mPoi.setDistance(Distance(mLocation.getLatitude(),mLocation.getLongitude(),mPoi.getLatitude(),mPoi.getLongitude()));
      }

      //依照距離遠近進行List重新排列
      DistanceSort(Pois);
      mList.setAdapter(new PoiListAdapter(DISTANCE));
      mList1.setAdapter(new PoiListAdapter(DISTANCE1));
      }

      public void onProviderDisabled(String provider)
      {
      }

      public void onProviderEnabled(String provider)
      {
      }

      public void onStatusChanged(String provider, int status,Bundle extras)
      {
      }
      };

      public class PoiListAdapter extends BaseAdapter
      {
      private int mPoiSize;
      private int mDistance;

      public PoiListAdapter(int distance)
      {
      mDistance = distance;
      for(int i = 0 ; i < Pois.size() ; i++)
      {
      if(Pois.get(i).getDistance() < mDistance) mPoiSize++;
      }
      }

      @Override
      public int getCount()
      {
      return mPoiSize;
      }

      @Override
      public Object getItem(int position)
      {
      return null;
      }

      @Override
      public long getItemId(int position)
      {
      return 0;
      }

      @Override
      public View getView(int position, View convertView, ViewGroup parent)
      {
      TextView mText = new TextView(MainActivity.this);
      if(Pois.get(position).getDistance() < mDistance)
      mText.setText("地點 : " + Pois.get(position).getName() + " , 距離為 : " + DistanceText(Pois.get(position).getDistance()));
      return mText;
      }
      }
      }

      以上為小黑人有修正的部分,執行結果可以顯不同距離的內容,再請您試試囉!
      感謝您的提問~

      刪除
    2. 抱歉~前面Layout部分被網頁語法覆蓋了,
      重新補上:
      < RelativeLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      >

      < LinearLayout
      android:id="@+id/btns"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:orientation="horizontal"
      android:layout_alignParentBottom="true"
      >

      < Button
      android:id="@+id/btn"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="10Km"
      android:layout_weight="1"
      / >

      < Button
      android:id="@+id/btn1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="20Km"
      android:layout_weight="1"
      / >

      < / LinearLayout>

      < ListView
      android:id="@+id/list"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_above="@id/btns"
      / >

      < ListView
      android:id="@+id/list1"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:layout_above="@id/btns"
      / >

      < / RelativeLayout >

      刪除
    3. 作者已經移除這則留言。

      刪除
  33. 謝謝老師指導
    最後想請教老師這2航程式碼意思!
    我不太確定 正確意思 是否跟我想的一樣
    mPoi.setDistance(Distance(mLocation.getLatitude(),mLocation.getLongitude(),mPoi.getLatitude(),mPoi.getLongitude()));


    public void onStatusChanged(String provider, int status,Bundle extras)

    回覆刪除
    回覆
    1. 老師你好 最後1個問題
      //印出我的座標-經度緯度
      Log.d("TAG", "我的座標 - 經度 : " + mLocation.getLongitude() + " , 緯度 : " + mLocation.getLatitude() );

      我現在把他加入到DistanceSort(Pois);
      mList.setAdapter(new PoiListAdapter(DISTANCE));
      mList1.setAdapter(new PoiListAdapter(DISTANCE1));
      下方 為甚麼 我的位置 不會顯示出來

      刪除
    2. 您好,很抱歉這麼久才回覆您!
      哈哈,小黑人這段時間忙著處理專題研究,真不好意思...
      根據您的提問小黑人向您解釋,
      Distance是距離,是將我的位置經緯度與目標位置經緯度做計算。
      mPoi.setDistance是將距離放進Poi裡。
      onStatusChanged是我的位置狀態改變時觸發的一個方法,
      這兩個是沒有什麼關係的喔!

      然後上方說沒有顯示我的座標這個疑問是:
      印出我的座標的位置必須要在onLocationChanged方法內喔,
      不然mLocation會找不到我的位置。

      感謝您的提問!

      刪除
  34. 老師您好 我想要把印出的結果以textview的方式用一個button顯示出來

    這個方式可以用什麼語法寫嗎,這塊剛接觸比較不熟,還請老師提點一下

    回覆刪除
    回覆
    1. textview 用 button 顯示出來?
      這個範例就是阿

      刪除
    2. 您好,很抱歉這麼久才回覆您!
      哈哈,小黑人這段時間忙著處理專題研究,真不好意思...
      根據您的提問小黑人向您解釋,
      您是說在TextView裡顯示距離還是在Button上顯示距離呢?
      這兩個元件只要把最後運算結果的字串放入是都可以的喔→ setText("距離:xxx");
      小黑人這個範例的動作為: 按下Button → 讀取我的位置 → 計算距離 → TextView顯示距離

      感謝您的提問!

      刪除
  35. 你好 我有幾個問題
    但是需要給老師看檔案
    可否提供老師的信箱或者請老師用emil聯絡我 a200460714@gmail.com

    回覆刪除
    回覆
    1. 您好,很抱歉這麼久才回覆您!
      哈哈,小黑人這段時間忙著處理專題研究,真不好意思...
      小黑人的信箱是: deanpubby@gmail.com
      有疑問或問題都可以一起解決喔 ^^

      感謝您的提問!

      刪除
  36. 你好~請教一下
    我目前也在做類似功能
    但你的算法是二點的直線距離沒錯吧?
    如果像我新竹到武陵農場
    和新竹到中正紀念堂
    新竹到武陵農場的距離算出來會比較近
    但實際開車是會比較遠的
    不知道這樣的話該怎麼辦?
    感謝!

    回覆刪除
    回覆
    1. 您好,很抱歉這麼久才回覆您!
      哈哈,小黑人這段時間忙著處理專題研究,真不好意思...
      根據您的提問小黑人向您解釋,
      沒錯,小黑人這個範例是查詢兩點的直線距離喔,
      如果要計算實際路程距離的話就不能用這個範例方法,
      必須引用Google Map API的開車路程距離,
      簡單來說必須藉由Google的API來計算實際路程。

      感謝您的提問!

      刪除
  37. 老師你好,我想要請問一下要怎麼做才會完全正確
    因為我將Layout授權了
    java的程式碼也貼上了
    但poi卻是紅字 好像尚未定義....
    因為我只會寫一點點手機程式 目前要研究gps功能
    但一直碰壁 希望老師可以指點迷津 ... 謝謝

    回覆刪除
    回覆
    1. 您好,很抱歉這麼久才回覆您!
      哈哈,小黑人這段時間忙著處理專題研究,真不好意思...
      根據您的提問小黑人向您解釋,
      首先要先確認Poi的Class的名字有沒有一樣,包含大小寫不然系統會找不到喔,
      再來就是在MainActivity裡引用Poi時要進行import喔,
      這樣就可以找到Poi的Class了。

      感謝您的提問!

      刪除
  38. @小黑人 您好請問我的TextView裡沒有資料顯示要如何改?謝謝你的回覆

    回覆刪除
    回覆
    1. 您好!
      根據您的提問小黑人向您解釋,
      針對TextView沒有資料顯示這範圍有點廣,
      可能需要麻煩您再一次確認是 :
      1.沒抓到我的位置.
      2.沒計算到距離.
      3.TextView沒有引用進來或沒有把String字串裝入TextView裡.
      這三點可能需要您檢查看看! ^^

      還有問題或疑問可以再跟小黑人討論~
      感謝您的提問!

      刪除
  39. garcinia cambogia reviews First off I want to say
    fantastic blog! I had a quick question in which I’d
    like to ask if you don’t mind. I was curious to
    find out howw you center yourself and clear your thoughts before writing.
    I’ve had trouble clearing my mind in getting my idas out.
    I do take pleasure in writing however it just seems like
    the first 10 to 15 minutes tend to be lost simply just trying to figure out
    how to begin. Any recommendations or tips?

    Appreciate it! garcinia cambogia reviews

    回覆刪除
    回覆
    1. Hi, thanks a lot for your comments. According to my personal experience, it is essential to break down your thought and analyze each step one by one prior to writing. It may seem time consuming in the beginning, but it will eventually pay off and make the writing process more efficient and logical. Feel free to send me any ideas or feedback. It is really rewarding to exchange ideas with someone who is also enthusiastic in coding. Your ongoing support is much appreciated!!

      刪除
  40. 不知道抓取其他地方的經緯度有沒有更快的方法

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人向您解釋,
      如果要抓取其他地方的經緯度可以嘗試使用Google Map的API,
      算是一個很方便強大的溝通間接模式,
      感謝您的提問!

      刪除
  41. 老師您好:

    我現在是想把資料從我網路上的資料庫抓下來並進行距離測量與排序,
    目前程式碼大概像這樣

    for(int i=0; i<ja.length(); i++) { 網路資料有3百多筆所以用迴圈去抓

    jo = ja.getJSONObject(i);
    double MyLongitude = myLocation.getLatitude(); 自己的經度
    double MyLatitude = myLocation.getLongitude(); 自己的偉度
    double MoLongitude =jo.getInt("Longitude") ; 資料的經度
    double MoLatitude =jo.getInt("Latitude") ; 資料的偉度

    float[] results = new float[1];
    // 計算自己位置與使用者輸入地點,此2點間的距離(公尺),結果會存入results[0]
    Location.distanceBetween(MyLongitude, |這幾行是我從別的網頁找到的方法
    MyLatitude, MoLongitude, |好像把自己的經緯度跟目標的經緯度
    MoLatitude, results); |都放進去好像就能測量了
    String distance = NumberFormat.getInstance().format(results[0]);

    list1[i] = jo.getString("Motel_ID");
    list2[i] = jo.getString("Motel_Name");
    list3[i] = distance; 最後用list讀出
    不過我最後算出來的距離都超怪的
    像是我人在120.2194151 22.9951308 (台南)
    他顯示我到120.28561 22.629572 (高雄)的距離是112,493.57公尺
    我是一次讀取多個縣市的座標
    他每距離顯示都是一樣的數值
    但是換個縣市它距離就會變
    像離高雄是112,493.57公尺
    離新北就會變成 235,822.562公尺

    能請老師幫忙看看麼??

    文有點多 不好意思

    回覆刪除
    回覆
    1. 前面這邊抓取自身經緯度
      double MyLongitude = myLocation.getLatitude(); 自己的經度
      double MyLatitude = myLocation.getLongitude(); 自己的偉度
      我好像打相反了
      但是改回來之後一樣會出現相同的問題

      刪除
    2. 您好,小黑人看了一下您貼的程式碼有發現到幾個疑問,
      1.第一個是取資料經緯度的部分:
      double MoLongitude =jo.getInt("Longitude") ;
      double MoLatitude =jo.getInt("Latitude") ;
      這個在形態的轉換就不一樣囉,應該更改成
      double MoLongitude =jo.getDouble("Longitude") ;
      double MoLatitude =jo.getDouble("Latitude") ;
      如果形態為int的話,例如經度為121.123456789就會變成121而已.

      然後兩個點經緯度都有了就可以照小黑人這篇文章所寫的算出兩點距離囉.
      您可以在測試看看.

      感謝您的提問!

      刪除
    3. 謝謝老師 成功了

      還想請教老師一下 照距離遠近排序有辦法將網路抓到得的資料來做距離排序麼??
      距離排序的原理是什麼??
      現在想做一下距離排序不知道該怎麼做0.0
      可否麻煩老師指點一下

      刪除
    4. 作者已經移除這則留言。

      刪除
    5. 我List的用法是照網路上別人的教法
      在onCreate裡
      setListAdapter(new ListViewAct(this, list1, list2, list3));

      連進資料庫

      然後定義 JSONArray 格式
      JSONArray ja = new JSONArray(result);
      JSONObject jo = null;

      list1 = new String[ja.length()];
      list2 = new String[ja.length()];
      list3 = new String[ja.length()];
      再用For迴圈將資料抓進來
      for(int i=0; i {

      jo = ja.getJSONObject(i);
      list1[i] = jo.getString("Motel_ID");
      list2[i] = jo.getString("Motel_Name");
      list3[i] = distance2;
      }
      接著到另一個Activity 裡
      private final Context context;
      private final String[] values1;
      private final String[] values2;
      private final String[] values3;

      public ListViewAct(Context context, String[] object1, String[] object2 ,String[] object3) {
      super(context, R.layout.activity_main, object1);
      this.context = context;
      this.values1 = object1;
      this.values2 = object2;
      this.values3 = object3;
      }

      @Override
      public View getView(int position, View convertView, ViewGroup parent) {

      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

      View rowView = inflater.inflate(R.layout.search, parent, false);

      TextView textView1 = (TextView) rowView.findViewById(R.id.list1);
      TextView textView2 = (TextView) rowView.findViewById(R.id.list2);
      TextView textView3 = (TextView) rowView.findViewById(R.id.list3);
      textView1.setText(values1[position]);
      textView2.setText(values2[position]);
      textView3.setText("距離:" + values3[position]);

      return rowView;
      }
      }

      刪除
    6. 您好,很抱歉這麼久才回覆您,
      根據您的提問小黑人與您解釋,
      其實距離排序可以分成兩個部分,就是"距離"與"排序",
      簡單的說就是把每一個距離都先算出來,然後再由近至遠或遠至近排列,
      原理就是這兩個,至於怎麼做方法有很多,小黑人範例也有寫到,
      然後您貼的程式碼,小黑人看了看好像只是在做List顯示的部分...

      感謝您的留言!

      刪除
  42. 小黑人老師您好
    我最近也在研究這塊
    我看到您和黃愈凱同學的留言
    發現是我在找的問題
    該怎麼實現 假如有10個座標 其中5個座標是在我目前位置的範圍內
    google map 地圖上只標記這5個座標和自己的位置呢
    有範例能指點我一下嗎,先謝謝老師了

    回覆刪除
    回覆
    1. 補充:
      我大概知道是
      用if去判斷距離
      如果在指定的範圍內再標記

      我卡在一直沒辦法用Wifi網路定位到目前位置

      刪除
    2. 您好,很抱歉這麼久才回覆您,
      根據您的提問小黑人與您解釋,
      1.您說的第一個問題是只顯示範圍內的標記,方法就是您說的用if來判斷,
      但前提是已經算出兩點的距離(我的位置與目標位置距離),這樣就可以做距離篩選.
      2.WiFi定位,其實WiFi定位跟GPS定位的寫法一樣,只要更改一個數值即可,就是上方範例的這一段:
      mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,10000.0f,LocationChange);
      這個LocationManager.GPS_PROVIDER是GPS定位,
      這個LocationManager.NETWORK_PROVIDER是網路定位.

      感謝您的提問.

      刪除
    3. 作者已經移除這則留言。

      刪除
    4. 謝謝老師的指點

      刪除
  43. 小黑老師您好:
    我目前在 使用者接近自己設的多個點 ,如果使用者接近多少距離內 在地圖上(Webview)顯示 訊息與音效

    我有在網路上 看了 Android Webview javascript與Java 互動傳參數
    但不知要傳 幾個參數 (傳與接收)
    請問有相關 動態網頁的範例嗎
    謝謝老師

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人與您解釋,
      這一部份目前小黑人還沒有實作範例,
      但小黑人自己覺得只要是傳送端與接收端的合作溝通時,
      首先變數的欄位Key一定要一樣,然後就看您想要傳送什麼資訊,
      例如經緯度之類的,這些傳送內容沒有一定,是看您的需求.

      感謝您的提問!

      刪除
  44. 小黑人你好
    我想問問看你有做好的GPS追蹤可以參考嗎??
    因為專題需要,要做運動距離計算、追蹤
    不知道小黑人老師是否教學

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人與您解釋,
      如果要追蹤動態的話,換句話說其實就是每隔一段時間判斷我的位置,
      這樣把我的位置串來起來的話就是動態追蹤囉,
      小黑人範例為讀取我的位置,然後再加上Timer循環讀取我的位置就可成為動態追蹤.

      感謝您的提問!

      刪除
  45. 小黑人老師你好
    因為我點你上面的https://dl.dropboxusercontent.com/u/73681725/Example/SourceCode/DemoLocation.zip
    他畫面顯示錯誤
    請問可以提供這篇的範例程式碼參考嗎 謝謝

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人與您解釋.
      很抱歉,小黑人日前在整理空間時不小心移除掉檔案了,
      小黑人會盡快放上範例程式碼!

      感謝您的留言!

      刪除
  46. 不好意思我想請問一下
    我照小黑人的程式碼打完後
    我模擬器模擬上沒有顯示任何東西
    請問我是哪裡做錯了
    還有如果要把GPS定位資料取出要怎麼做

    回覆刪除
    回覆
    1. 補充一下
      按下按鈕後沒有任何結果顯示出來
      還有就是小黑人老師的空間都無法使用
      無法觀看此程式的範例

      刪除
    2. 您好,很抱歉這麼晚才回覆您,
      根據您的提問小黑人與您解釋,
      因為此範例是抓取目前當下位置進行距離判斷,
      用模擬器執行應該沒有辦法讀取我的位置,
      建議您改用實機測試再進行看看.

      感謝您的提問!

      刪除
  47. 小黑人老師你好
    我要做兩個按鈕 就像上面阿凱同學那樣 10KM、20KM顯示由近到遠的店家
    我有參考阿凱同學的程式碼
    但是我按10KM還是會跑出12KM的店家(?)
    還有列表顯示出來 格式很奇怪 移動捲軸會有浮字(?)

    回覆刪除
    回覆
    1. 不好意思小黑人老師
      如果我是要跳頁顯示 要怎麼改呢(?)

      刪除
    2. 老師
      我10KM和20KM顯示出來的資訊一樣
      上面你有提到說要改成下面那樣
      mList = (ListView) findViewById(R.id.list);
      mList1 = (ListView) findViewById(R.id.list1);
      我有改了還是顯示一樣的資訊><

      刪除
    3. 您好,很抱歉這麼晚才回覆您,
      根據您的提問小黑人與您解釋,
      第一個問題:
      10km裡包含12km的店家,原因是沒有使用到if方法進行距離篩選,
      再加這段判斷的話就可以分開10km與12km的店家.
      第二個問題:
      如果需要跳頁顯示內容的話,只要在切換頁面時,將店家資訊的陣列或List一併帶入到下一個頁面顯示即可.
      第三個問題:
      如果兩個ListView顯示的內容一樣,那就代表兩個ListView是用一樣的Adapter,
      所以才會有顯示內容一樣的狀況,Adapter也要分兩個使用,這樣才可以分辨兩個不同距離的顯示列表.

      感謝您的提問!

      刪除
  48. qwe813014/1/15 22:18

    您好 我看了做後幾篇的文 看是最後一個dropbox的連結有問題
    想請 黑老師再放上 原始碼 借我們看看

    回覆刪除
    回覆
    1. 您好,小黑人根據本篇範例有新放原始碼上去囉,
      路徑一樣是https://dl.dropboxusercontent.com/u/73681725/Example/SourceCode/DemoLocation.zip

      感謝您的留言!

      刪除
    2. 不好意思 我還有一個小問題 就是 我 import完DemoLocation之後
      裡面的註解都是 亂碼 是編碼問題嗎 要從哪裡才可以改回正常的中文

      刪除
    3. 剛剛已執行 連程式執行完畫面都是 亂碼
      https://drive.google.com/file/d/0B6DhbolqK1JLdDFDdGFtWTBwODg/view?usp=sharing
      手機螢幕截圖是那連結
      請黑老師求解

      刪除
    4. 您好,根據您的提問小黑人與您解釋,
      如果是亂碼的話,那就是eclipse編碼的問題,
      您必須把編碼更改成UTF-8就可以囉。
      更換編碼的步驟為 :
      上方工具列選擇Window -> Preferences ->左方欄選擇General -> 展開點選Workspace -> 右方Text File encoding -> 選擇Other : UTF-8
      這樣就可以把編碼更改成UTF-8囉!

      感謝您的留言。

      刪除
    5. 謝謝你的教學 感謝 ^_^

      刪除
  49. 謝謝小黑人的教學, 我已成功修改成 listview 方式顯示。但照您的方式
    TextView mText = new TextView(MainActivity.this);
    mText.setText(Pois.get(position).getName() + " , 距離為 : " + DistanceText(Pois.get(position).getDistance()));
    return mText;
    這樣秀出來只有一行字,我想要改成 名稱一行,地址一行,距離一行,這樣要怎麼改? 已另外寫了listview.xml , 但 java 部份不知如何下手,煩請小黑人老師指導,感謝。

    回覆刪除
    回覆
    1. 您好,很抱歉這麼久才回覆您,
      根據您的提問小黑人與您解釋!
      如果您要顯示多行字的話有兩種解決方法,
      第一種是全部資訊都裝進一個TextView裡,這個方法比較不好,但是如果只要單純顯示文字的話這個方法會比較快速,就是同樣也是一個字串,然後名稱地址距離藉由\n來切換下一行,簡單舉例來說就是:
      String text = "名稱是" + Pois.get(position).getName() + "\n地址是" + Pois.get(position).getAddress() + "\n距離為" + DistanceText(Pois.get(position).getDistance()) ;
      mText.setText(text);
      這樣就會顯示三行文字資訊。

      第二種方法是導入Layout畫面來進行編輯與顯示,這種是比較正確的用法也適用於較複雜的List畫面,步驟方法如下:
      首先在上面先建立一個變數: private LayoutInflater inflater;
      然後在onCreate裡取得方法: inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      接下來要更改Adapter裡的getView方法,
      @Override
      public View getView(int position, View convertView, ViewGroup parent)
      {
      View mView = inflater.inflate(R.layout.另外建立針對List裡顯示的Layout畫面, null);

      //取得Layout裡的TextView元件
      TextView mName = (TextView) mView.findViewById(R.id.name);
      TextView mAddress = (TextView) mView.findViewById(R.id.address);
      TextView mDistance = (TextView) mView.findViewById(R.id.distance);

      //將資訊裝入TextView裡
      mName.setText(Pois.get(position).getName());
      mAddress.setText(Pois.get(position).getAddress());
      mDistance.setText(DistanceText(Pois.get(position).getDistance());

      return mView;
      }

      以上這兩種方法都可以達到您的需求,第二種方法導入Layout來編輯畫面的作法可以運用在很多地方,你可以試試實作看看。

      感謝您的提問!

      刪除
  50. 感謝小黑人老師的回應,老師提供的第一種方式已經成功了,在嘗試使用第二種方式後,inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    這裡的 context 出現紅字,提示:Cannot resolve symbol 'context',參考網路上LayoutInflater的用法修修改改還是一直出錯,又要請教小黑人老師了,謝謝。

    回覆刪除
    回覆
    1. 報告小黑人老師,參考了 context 的用法,修修改改,雖然不知是否正確,但程式可以執行了,謝謝小黑人老師。下次應該自已再摸索久一點再提問的。

      刪除
    2. 很好喔,一起努力,加油!
      其實context可以拿掉,直接getSystem......就可以,哈!

      感謝您的留言與支持!^^

      刪除
  51. 您好,這邊傳入的順序似乎有誤~
    Distance(mLocation.getLatitude(),mLocation.getLongitude(),
    mPoi.getLatitude(), mPoi.getLongitude()));


    public double Distance(double longitude1, double latitude1, double longitude2,double latitude2)

    最後謝謝老師的分享^^

    回覆刪除
  52. 小黑人你好! 請問我想要讀取照片的地理位置(經緯度) 要怎麼匯入呢?麻煩你了 謝謝

    回覆刪除
  53. 請問一下 我使用小黑人老師的code 可是 按了按鈕之後 沒有顯示任何東西 請問為什麼

    回覆刪除
  54. 小黑人你好!我想請問我想再listview的後面都加上距離剛怎麼做?類似底下那張圖 http://static.oschina.net/uploads/space/2011/0706/143714_Kvcf_159643.png

    回覆刪除
  55. 請教一下....在取得目前位置後,該如何寫進資料庫裡面呢?

    回覆刪除
  56. 老師範例檔案網址,幾乎都是錯誤的,
    不知道能不能再傳一下新的檔案位置,
    或是提供Layout.xml以及Adapter的程式碼。
    另外如果只能在模擬器上測試,
    請問要修改哪裡可以自己輸入位置測試?

    回覆刪除
  57. 老師您好
    可以再傳一次專案的位置嗎
    之前您傳的網址看不了
    謝謝~~

    回覆刪除
  58. 老師如果我想知道我目前的定位附近有什麼商店的話要怎麼寫

    回覆刪除

謝謝大家支持,有任何問題都可以和小黑人一起討論!