搜尋此網誌

顯示具有 地圖 標籤的文章。 顯示所有文章
顯示具有 地圖 標籤的文章。 顯示所有文章

2016年4月18日 星期一

Android 6 以上的版本加上GPS地圖定位授權要求

Android 6 以上的版本在要求授權的時候是在使用該權限的當下跳出來詢問的,例如取得GPS時就會在當下需要去檢查是否有經過授權。
如果我們沒有特別提供授權的功能的話,使用者是無法使用的,除非去 Android 的應用程式設定去將定位打開(不是開啟手機的定位功能喔!)是應用程式自己可以使用定位的授權。


早期我們要取得定位服務只需要
lms = (LocationManager) getSystemService(LOCATION_SERVICE);
但是在 android 6 之後,android studio 就會要求我們要做檢查的動作:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            //如果沒有授權使用定位就會跳出來這個
            // TODO: Consider calling

            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.

            requestLocationPermission(); // 詢問使用者開啟權限
            return;
        }
如果權限沒有被開啟就會直接被 return
所以我們必須多做一段這個:
private void requestLocationPermission() {
        // 如果裝置版本是6.0(包含)以上
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 取得授權狀態,參數是請求授權的名稱
            int hasPermission = checkSelfPermission(
                    Manifest.permission.ACCESS_FINE_LOCATION);

            // 如果未授權
            if (hasPermission != PackageManager.PERMISSION_GRANTED) {
                // 請求授權
                //     第一個參數是請求授權的名稱
                //     第二個參數是請求代碼
                requestPermissions(
                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                        REQUEST_FINE_LOCATION_PERMISSION);
            }
            else {
                // 啟動地圖與定位元件

            }
        }
    }
private static final int REQUEST_FINE_LOCATION_PERMISSION = 102;
Android 6 Tutorial 第四堂(3)讀取裝置目前的位置 - Google Services Location

2015年12月11日 星期五

google 地圖搜尋 api 鄰近地點地方資訊搜尋

在之前的
在 Android 上加上搜尋地理位置的功能 Google Places API (地方資訊挑選器 PlacePicker )
這篇我們有提到, PlacesPicker 雖然方便但是有使用上的限制,其實 1,000 次的使用量可是一下子就用完了呢!所以官方也推薦我們直接用 JavaScript 的 API 或是 http 的 API 來使用。

這些也都是有使用限制的,不過 http 的限制額度是算在使用者自己的額度上而不是以我們的 APP 來計算所以相對非常足夠。

API 文件連結

首先我們仍然是要去申請一支api金鑰 (因為和 Android 使用的不同權限所以要另外申請喔)

接著就是重頭戲了:api 輸入和輸出的值就不解釋了,請看官方文件,有超清楚的中文範例。

要注意的有幾點:

  • 這個 API 只有接受 HTTP GET 不接受 POST
  • 經緯度是必填所以在呼叫這支 API 前要搭配 Android 取得經緯度範例 服用
下面是範例:

public class SearchPoi  extends AppCompatActivity {
    AQuery aQuery = new AQuery(this);
    private static final String TAG = "LocationActivity";
    GPSTracker gps;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        // 宣告使用 GPSTracker
        gps = new GPSTracker(this);
        if(gps.canGetLocation()){
            //取得經緯度
            double latitude = gps.getLatitude();
            double longitude = gps.getLongitude();
            //設定API
            String ListApi = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?key="+getString(R.string.web_api_key)+"&radius=500&location=" + latitude +","+ longitude;
            
            // 呼叫 API
            aQuery.ajax(ListApi, null, JSONObject.class, new AjaxCallback() {
                @Override
                public void callback(String url, JSONObject object, AjaxStatus status) {
                    super.callback(url, object, status);
                    System.out.println("===url===" + url);
                    System.out.println("==obj==" + object);
                    System.out.println("=status=" + status);


                    try {
                        //取得地理位置名稱
                        for(int i = 0;i<=object.getJSONArray("results").length();i++){
                            Log.e("results name",object.getJSONArray("results").getJSONObject(i).getString("name"));
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
            });
        }else{
            Toast.makeText(this,"error",Toast.LENGTH_SHORT).show();
        }
        

    }

}

2015年12月8日 星期二

Android 取得經緯度範例

這次寫的東西有點偷懶,是從別人家的範例拿下來呼叫的
Android GPS, Location Manager Tutorial

不過這樣可以很快的取得經緯度,所以我們還是介紹一下吧!

首先我們先到上面的網址下載這個檔案



解壓縮以後去找到 GPSTracker.java 這個檔案放到自己的專案底下。


接著就可以開始實作了,我們需要開啟以下的權限:

  • ACCESS_FINE_LOCATION
  • INTERNET

接著只要在自己的 Code 裡面去呼叫


    GPSTracker gps;
        gps = new GPSTracker(this);
        if(gps.canGetLocation()){

            double latitude = gps.getLatitude();
            double longitude = gps.getLongitude();

            
            Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(this,"error",Toast.LENGTH_SHORT).show();
        }

就可以啦!實在是太偷懶啦~~

2015年12月7日 星期一

在 Android 上加上搜尋地理位置的功能 Google Places API (地方資訊挑選器 PlacePicker )

google 擁有大量的店家資料以及地圖的圖資。如果不拿來運用是不是太可惜了呢?
其實 google 有提供 API 給各個平台來做串接的動作


在使用之前我們仍然需要取得憑證簽署 API 金鑰。這個部分官方寫得很詳盡我們直接看即可。
簽署與 API 金鑰

除此資外我們要在 Google Developers Console 申請 Google Places API for Android 的使用權限。這個 API 是有配額的 一天只能接受 1,000 次的查詢,如果是已經綁定信用卡的話可以增加到 150,000 次查詢。接下來應該就是要付費了吧。

開始進入正題:

這篇我們先來一個超簡單的:PlacePicker 他是經由 Intent 動作就可以呼叫的,連 UI 都不用我們自己建立。當我們呼叫後就會自動進入下面這個畫面:

包含了地圖,現在位置,周邊店家 通通都有了




AndroidManifest.xml

增加 ACCESS_FINE_LOCATION 權限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Activity上建立進入地圖的動作:

private static final int REQUEST_PLACE_PICKER = 1;


PlacePicker.IntentBuilder intentBuilder = new PlacePicker.IntentBuilder();
                Intent intent;
                try {
                    intent = intentBuilder.build(StoreAdd.this);
                    startActivityForResult(intent, REQUEST_PLACE_PICKER);
                } catch (GooglePlayServicesRepairableException | GooglePlayServicesNotAvailableException e) {
                    e.printStackTrace();
                }

Activity上建立回傳資料後的動作:

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_PLACE_PICKER){
            if (resultCode == RESULT_OK){
                Place place = PlacePicker.getPlace(data, this);

                Log.e("place", place.toString());

            }
        }
    }

如此一來當使用者點選地圖頁面上面的地點名稱後,就會回傳該地點的資料到 onActivityResult 的 Log.e 裡面。

雖然這個作法做起來超快速,但是卻不是 google 最推薦的做法。根據 google 文件上面的說法。如果我們只是要取得資料,沒有打算讓使用者在我們的 APP 上面直接建立資料給 google 其實使用 http 的 web-service 就可以摟!不過這樣的話 UI 就要很辛苦的自己做摟。