The Android Developer Challenge is back! Submit your idea before December 2.

Mendeteksi lokasi di Wear OS

Faktor bentuk jam tangan yang kecil dan mudah dilihat membuat Wear OS by Google menjadi platform ideal untuk aplikasi yang merekam, melaporkan, dan merespons lokasi pengguna. Contohnya, Anda dapat membuat aplikasi yang memberi info real-time kepada pengguna mengenai jarak, kecepatan, dan arah, atau memberikan informasi yang mudah dilihat mengenai area di sekitar pengguna.

Beberapa jam tangan dilengkapi sensor GPS internal yang dapat mengambil data lokasi tanpa perlu ponsel yang tertambat. Namun, saat Anda meminta data lokasi di aplikasi jam tangan, Anda tidak perlu khawatir dari mana data lokasi berasal; sistem mendapatkan data melalui metode yang paling hemat daya. Namun, seperti yang dijelaskan dalam bagian di bawah ini, aplikasi Anda memang perlu menangani hilangnya data lokasi.

Metode yang disarankan untuk memperoleh data lokasi pada jam tangan adalah menggunakan Penyedia Lokasi Fusi. Selain itu, dokumen ini menjelaskan cara memeriksa sensor lokasi, menerima data lokasi, dan memantau koneksi data yang tertambat pada jam tangan. Lihat juga Data Lokasi untuk Jam Tangan yang Disambungkan ke iPhone.

Untuk mengurangi dampak negatif akuisisi data lokasi terhadap masa pakai baterai, Anda harus memastikan panggilan aplikasi setPriority() disetel ke PRIORITY_BALANCED_POWER_ACCURACY. Anda tidak boleh menanyakan lokasi lebih dari sekali per menit menggunakan setInterval().

Catatan: Dokumen ini mengasumsikan bahwa Anda memahami cara menggunakan API layanan Google Play untuk mengambil data lokasi.

Menggunakan penyedia lokasi fusi

Pada jam tangan, Anda harus mendapatkan data lokasi menggunakan FusedLocationProviderApi (FLP). FLP secara otomatis menggunakan data lokasi dari ponsel jika jam tangan tidak dilengkapi sensor GPS. Untuk mengetahui informasi selengkapnya, lihat Membuat klien layanan lokasi.

Untuk mengetahui informasi mengenai permintaan update lokasi dan terus melacak lokasi pengguna, lihat Menerima update lokasi.

Mendeteksi GPS internal

Jika pengguna melakukan joging dengan jam tangan yang tidak dilengkapi sensor GPS internal, tetapi tidak membawa ponsel yang disambungkan, aplikasi jam tangan tidak dapat memperoleh data lokasi melalui koneksi tertambat. Aplikasi Anda harus mampu mendeteksi situasi dan memperingatkan pengguna bahwa fungsionalitas lokasi tidak tersedia.

Untuk menentukan apakah jam tangan memiliki sensor GPS, gunakan metode hasSystemFeature(). Kode berikut mendeteksi apakah jam tangan dilengkapi sensor GPS internal saat Anda memulai suatu aktivitas:

Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        if (!hasGps()) {
            Log.d(TAG, "This hardware doesn't have GPS.")
            // Fall back to functionality that does not use location or
            // warn the user that location function is not available.
        }
    }

    private fun hasGps(): Boolean =
            packageManager.hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)
    

Java

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        if (!hasGps()) {
            Log.d(TAG, "This hardware doesn't have GPS.");
            // Fall back to functionality that does not use location or
            // warn the user that location function is not available.
        }

        ...
    }

    private boolean hasGps() {
        return getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS);
    }
    

Menangani peristiwa sambungan terputus

Jika jam tangan tidak dilengkapi sensor GPS internal, jam tangan bisa secara tiba-tiba kehilangan streaming data lokasinya setelah kehilangan koneksi data yang tertambat ke ponsel. Jika aplikasi Anda menginginkan streaming data yang stabil, aplikasi Anda harus mendeteksi terputusnya koneksi, memperingatkan pengguna, dan menurunkan fungsionalitas secara halus.

Untuk mendeteksi terputusnya koneksi data tethering, gunakan metode GetConnectedNodesResult NodeApi. Contoh:

  1. Lakukan inisialiasi GoogleApiClient dan buat metode yang memanggil NodeApi, misalnya, metode yang disebut inspectNodes:

    Kotlin

        private lateinit var googleApiClient: GoogleApiClient
        private var wearableConnected = false
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            googleApiClient = GoogleApiClient.Builder(this)
                    .addApi(Wearable.API)
                    .addConnectionCallbacks(object : GoogleApiClient.ConnectionCallbacks {
                        override fun onConnected(connectionHint: Bundle?) {
                            inspectNodes()
                        }
    
                        override fun onConnectionSuspended(cause: Int) {}
                    })
                    .build()
    
        }
    
        private fun inspectNodes() {
            Wearable.NodeApi
                    .getConnectedNodes(googleApiClient)
                    .setResultCallback(this, 1000, TimeUnit.MILLISECONDS)
        }
        

    Java

        private GoogleApiClient googleApiClient;
        private boolean wearableConnected = false;
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            googleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(Wearable.API)
                    .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                        @Override
                        public void onConnected(Bundle connectionHint) {
                            inspectNodes();
                        }
    
                        @Override
                        public void onConnectionSuspended(int cause) {
                        }
                    })
                    .build();
        }
    
        private void inspectNodes(){
            Wearable.NodeApi.getConnectedNodes(googleApiClient).setResultCallback(this, 1000, TimeUnit.MILLISECONDS);
        }
        
  2. Gunakan metode callback berikut untuk mendapatkan hasil menggunakan metode inspectNodes:

    Kotlin

        override fun onResult(getConnectedNodesResult: NodeApi.GetConnectedNodesResult) {
            wearableConnected = false
            getConnectedNodesResult.nodes.forEach { node ->
                wearableConnected = wearableConnected or node.isNearby
            }
            Log.v("TEST", "wearableConnected: $wearableConnected")
        }
        

    Java

        @Override
        public void onResult(NodeApi.GetConnectedNodesResult getConnectedNodesResult) {
            if (getConnectedNodesResult != null && getConnectedNodesResult.getNodes() != null){
                wearableConnected = false;
                for (Node node : getConnectedNodesResult.getNodes()){
                    if (node.isNearby()){
                        wearableConnected = true;
                    }
                }
            }
            Log.v("TEST", "wearableConnected: " + wearableConnected);
        }
        

Menangani lokasi tidak ditemukan

Ketika sinyal GPS hilang, Anda bisa mendapatkan kembali lokasi terakhir yang diketahui dari jam tangan pengguna. Mendapatkan kembali lokasi terakhir yang diketahui sangat membantu ketika Anda tidak bisa mendapatkan sinyal GPS, atau ketika jam tangan tidak dilengkapi GPS internal dan kehilangan koneksi dengan ponsel. Untuk mengetahui informasi selengkapnya, lihat Mendapatkan lokasi terakhir yang diketahui.