Save the date! Android Dev Summit is coming to Sunnyvale, CA on Oct 23-24, 2019.

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 bisa mem-build aplikasi yang memberi pengguna update real-time mengenai jarak, kecepatan, dan arah, atau memberikan informasi yang mudah dilihat mengenai area di sekitar pengguna.

Lihat pada sumber daya terkait berikut:

Beberapa jam tangan dilengkapi sensor GPS internal yang bisa mengambil data lokasi tanpa memerlukan ponsel yang tertambat. Namun, saat Anda meminta data lokasi di aplikasi jam tangan, Anda tidak perlu khawatir tentang 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 adalah dengan menggunakan Fused Location Provider. Selain itu, dokumen ini menjelaskan cara memeriksa sensor lokasi, menerima data lokasi, dan memantau koneksi data yang tertambat pada jam. 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 setPriority() panggilan aplikasi disetel ke PRIORITY_BALANCED_POWER_ACCURACY. Anda tidak boleh menanyakan lokasi lebih sering dari sekali per menit menggunakan setInterval().

Catatan: Dokumen ini mengasumsikan bahwa Anda tahu cara menggunakan Google Play services API untuk mendapatkan kembali data lokasi.

Menggunakan fused location provider

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

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

Mendeteksi GPS internal

Bila pengguna melakukan joging dengan jam tangan yang tidak dilengkapi sensor GPS internal, tetapi tidak membawa ponsel yang disambungkan, aplikasi jam 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 watch dilengkapi sensor GPS built-in, gunakan metode hasSystemFeature(). Kode berikut mendeteksi apakah watch dilengkapi sensor GPS built-in 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 kejadian 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 apik.

Untuk mendeteksi terputusnya koneksi data tertambat, gunakan metode GetConnectedNodesResult dari NodeApi. Misalnya:

  1. Lakukan inisialiasi GoogleApiClient dan buat sebuah metode yang memanggil NodeApi, mis. 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 tidak dilengkapi GPS internal dan kehilangan koneksi dengan ponsel. Untuk informasi selengkapnya, lihat Mendapatkan lokasi terakhir yang diketahui.