Mendeteksi lokasi di Wear OS

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

Lihat referensi terkait berikut:

Smartwatch tertentu dilengkapi sensor GPS internal yang dapat mengambil data lokasi tanpa perlu ponsel yang di-tether. Namun, saat meminta data lokasi di aplikasi smartwatch, Anda tidak perlu khawatir tentang asal data lokasi. Sistem mendapatkan data melalui metode yang paling hemat daya. Namun, sebagaimana dijelaskan dalam bagian di bawah ini, aplikasi memang perlu menangani hilangnya data lokasi.

Metode yang direkomendasikan untuk memperoleh data lokasi pada smartwatch adalah menggunakan Penyedia Lokasi Fusi. Selain itu, dokumen ini menjelaskan cara memeriksa sensor lokasi, menerima data lokasi, dan memantau koneksi data yang di-tether pada smartwatch. Lihat juga Data Lokasi untuk Smartwatch yang Disambungkan ke iPhone.

Untuk mengurangi dampak negatif perolehan data lokasi terhadap masa pakai baterai, Anda harus memastikan aplikasi memanggil setPriority() yang ditetapkan 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 Google Play Services API untuk mengambil data lokasi.

Menggunakan penyedia lokasi fusi

Pada smartwatch, Anda akan mendapatkan data lokasi menggunakan FusedLocationProviderApi (FLP). FLP otomatis menggunakan data lokasi dari ponsel jika smartwatch tidak dilengkapi sensor GPS. Untuk informasi selengkapnya, lihat Membuat klien layanan lokasi.

Untuk informasi tentang cara meminta pembaruan lokasi dan terus melacak lokasi pengguna, lihat Menerima pembaruan lokasi.

Mendeteksi GPS internal

Jika pengguna melakukan joging dengan smartwatch yang tidak dilengkapi sensor GPS internal, tetapi tidak membawa ponsel yang disambungkan, aplikasi smartwatch tidak dapat memperoleh data lokasi melalui koneksi yang di-tether. Aplikasi harus mampu mendeteksi situasi dan memperingatkan pengguna bahwa fungsi lokasi tidak tersedia.

Untuk menentukan apakah smartwatch memiliki sensor GPS, gunakan metode hasSystemFeature(). Kode berikut mendeteksi apakah smartwatch memiliki sensor GPS internal saat Anda memulai 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 tidak memiliki sensor GPS internal, smartwatch dapat tiba-tiba kehilangan aliran data lokasi setelah kehilangan koneksi data yang di-tether ke ponsel. Jika menginginkan aliran data yang stabil, aplikasi harus mendeteksi terputusnya koneksi, memperingatkan pengguna, dan menurunkan fungsi secara halus.

Untuk mendeteksi terputusnya koneksi data yang di-tether, gunakan metode GetConnectedNodesResult NodeApi. Contohnya:

  1. Lakukan inisialisasi 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 penggunaan 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

Bila sinyal GPS hilang, Anda dapat memperoleh kembali lokasi terakhir smartwatch pengguna yang diketahui. Mendapatkan kembali lokasi terakhir yang diketahui sangat membantu bila Anda tidak dapat memperoleh sinyal GPS, atau bila smartwatch tidak dilengkapi GPS internal dan kehilangan koneksi dengan ponsel. Untuk informasi selengkapnya, lihat Mendapatkan lokasi terakhir yang diketahui.