Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Perubahan privasi Android Q: Kontrol pengguna atas akses aplikasi ke lokasi perangkat

Mulai dari Android Q Beta 5, perubahan ini memiliki properti berikut:

  • Memengaruhi aplikasi jika Anda meminta akses ke lokasi perangkat saat berada di latar belakang
  • Pengguna mungkin menerima pengingat setelah memberikan akses aplikasi ke lokasi perangkat di latar belakang
  • Mengurangi dengan menggunakan izin baru untuk mengakses lokasi di latar belakang dan dengan memastikan degradasi halus tanpa pembaruan lokasi di latar belakang
  • Perilaku selalu diaktifkan di Android Q

Kami menantikan masukan Anda. Laporkan masalah yang Anda temukan saat menggunakan fitur ini selama program Android Q beta.

Screenshot dialog sisi pengguna
Gambar 1. Dialog yang meminta persetujuan pengguna untuk memberikan lokasi

Android Q memberi pengguna kontrol lebih besar atas kapan aplikasi dapat memperoleh akses ke lokasi perangkat. Saat aplikasi yang berjalan di Android Q meminta akses lokasi, pengguna melihat dialog yang ditampilkan di Gambar 1. Dialog ini memungkinkan pengguna untuk memberikan akses lokasi ke dua cakupan berbeda: saat menggunakan aplikasi (khusus di latar depan) atau sepanjang waktu (latar depan dan latar belakang).

Untuk mendukung kontrol tambahan yang dimiliki oleh pengguna atas akses aplikasi ke informasi lokasi, Android Q memperkenalkan izin akses lokasi baru, ACCESS_BACKGROUND_LOCATION. Tidak seperti izin ACCESS_FINE_LOCATION dan ACCESS_COARSE_LOCATION yang sudah ada, izin baru hanya memengaruhi akses aplikasi ke lokasi saat berjalan di latar belakang. Aplikasi dianggap berada di latar belakang kecuali jika salah satu aktivitasnya terlihat atau aplikasi tersebut menjalankan layanan latar depan.

Meminta lokasi latar belakang

Jika aplikasi Anda menargetkan Android Q dan perlu mengakses lokasi perangkat saat berjalan di latar belakang, Anda harus menyatakan izin baru dalam file manifes aplikasi:

    <manifest>
      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
      <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    </manifest>
    

Jika aplikasi Anda berjalan di Android Q namun menargetkan Android 9 (API level 28) atau lebih rendah, perilaku berikut berlaku:

Meminta akses lokasi latar belakang

Jika kasus penggunaan aplikasi Anda meminta akses ke informasi lokasi saat berjalan di latar belakang, penting untuk mempertimbangkan sejauh mana Anda memerlukan akses ini:

  • Kasus penggunaan aplikasi Anda mengandalkan kelanjutan tindakan yang dimulai oleh pengguna, seperti navigasi atau tindakan smart home. Dalam hal ini, konfigurasi layanan latar depan Anda agar dapat mempertahankan akses ke lokasi perangkat setelah pengguna menekan tombol Layar utama di perangkat atau menonaktifkan layar perangkatnya, meskipun pengguna telah meminta agar aplikasi Anda memiliki akses ke lokasi perangkat hanya ketika berjalan di latar depan.
  • Kasus penggunaan aplikasi Anda mengandalkan pemeriksaan lokasi perangkat secara berkala sepanjang waktu, seperti pembatasan wilayah atau berbagi lokasi. Dalam hal ini, aplikasi Anda harus menjelaskan kepada pengguna bahwa mereka harus mengizinkan aplikasi Anda mengakses lokasi perangkat sepanjang waktu agar dapat beroperasi dengan benar, lalu meminta akses ke lokasi latar belakang.

Kelanjutan tindakan yang dimulai oleh pengguna

Catatan: Jika aplikasi Anda tidak memerlukan akses lokasi saat berjalan di latar belakang, praktik terbaiknya adalah menargetkan Android Q dan jangan meminta izin lokasi latar belakang yang baru. Dengan demikian, aplikasi Anda hanya akan menerima pembaruan lokasi selama pengguna sedang menggunakannya.

Contoh aplikasi semacam ini muncul di project LocationUpdatesForegroundService di GitHub.

Dalam kasus pengguna telah memberi aplikasi Anda akses ke lokasi yang hanya berada di latar depan, pengguna mungkin tetap meluncurkan alur kerja yang meminta aplikasi Anda mengakses lokasinya, bahkan setelah pengguna menekan tombol Layar utama di perangkat atau menonaktifkan layar perangkat.

Untuk mempertahankan akses ke lokasi perangkat dalam kasus penggunaan yang spesifik ini, mulailah layanan latar depan yang telah Anda nyatakan memiliki jenis layanan latar depan "location" dalam manifes aplikasi Anda:

    <service
        android:name="MyNavigationService"
        android:foregroundServiceType="location" ... >
        ...
    </service>
    

Sebelum memulai layanan latar depan, pastikan aplikasi Anda masih memiliki akses ke lokasi perangkat:

Kotlin

    val permissionAccessCoarseLocationApproved = ActivityCompat
        .checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION) ==
        PackageManager.PERMISSION_GRANTED

    if (permissionAccessCoarseLocationApproved) {
       // App has permission to access location in the foreground. Start your
       // foreground service that has a foreground service type of "location".
    } else {
       // Make a request for foreground-only location access.
       ActivityCompat.requestPermissions(this,
           arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),
           your-permission-request-code
       )
    }
    

Java

    boolean permissionAccessCoarseLocationApproved =
        ActivityCompat.checkSelfPermission(this,
            permission.ACCESS_COARSE_LOCATION) ==
            PackageManager.PERMISSION_GRANTED;

    if (permissionAccessCoarseLocationApproved) {
        // App has permission to access location in the foreground. Start your
        // foreground service that has a foreground service type of "location".
    } else {
       // Make a request for foreground-only location access.
       ActivityCompat.requestPermissions(this, new String[] {
            Manifest.permission.ACCESS_COARSE_LOCATION},
           your-permission-request-code);
    }
    

Pemeriksaan berkala lokasi perangkat

Aplikasi Anda mungkin memiliki kasus penggunaan yang memerlukan akses ke lokasi perangkat sepanjang waktu. Kasus penggunaan demikian mencakup pembatasan wilayah dan berbagi lokasi kepada teman dan keluarga.

Jika kondisi ini berlaku pada aplikasi Anda, Anda dapat terus meminta pembaruan lokasi tanpa perubahan apa pun, selama pengguna memberi aplikasi Anda akses sepanjang waktu ke lokasi perangkat:

Cuplikan kode berikut menunjukkan cara mendeklarasikan layanan yang meminta akses ke lokasi perangkat sepanjang waktu:

    <!-- It's unnecessary to include a foreground service type for services that must have
         access to the device's location "all the time" in order to run successfully.-->
    <service
        android:name="MyFamilyLocationSharingService" ... >
        ...
    </service>
    

Contoh aplikasi semacam ini adalah project LocationUpdatesPendingIntent di GitHub.

Screenshot notifikasi sistem
Gambar 2. Notifikasi yang mengingatkan pengguna bahwa mereka telah memberikan akses aplikasi "sepanjang waktu" ke lokasi perangkat

Setiap kali pengguna memilih untuk mengizinkan akses sepanjang waktu aplikasi ke lokasi perangkat, sistem akan menjadwalkan notifikasi untuk dikirimkan kepada pengguna. Notifikasi ini mengingatkan pengguna bahwa mereka mengizinkan aplikasi untuk mengakses lokasi perangkat sepanjang waktu. Contoh notifikasi muncul pada Gambar 2.

Meskipun aplikasi Anda dapat meminta akses ke lokasi di latar belakang, pengguna memiliki opsi untuk mengurangi akses aplikasi Anda hanya ke latar depan atau mencabut akses sepenuhnya. Karena alasan ini, setiap kali aplikasi Anda memulai layanan, periksa apakah pengguna masih mengizinkan aplikasi Anda mengakses informasi lokasi di latar belakang.

Jika pengguna telah meminta agar aplikasi Anda mengakses lokasi hanya saat berada di latar depan, sebaiknya aplikasi Anda menampilkan dialog kustom, yang memberi tahu pengguna bahwa alur kerja dalam aplikasi Anda tidak dapat berfungsi dengan baik tanpa akses ke lokasinya setiap saat. Setelah pengguna menerima dialog ini, Anda dapat meminta lokasi latar belakang, dan pada saat itu dialog sistem yang ditunjukkan pada Gambar 3 akan muncul:

Screenshot dialog sisi pengguna
Gambar 3. Dialog yang meminta persetujuan pengguna untuk akses setiap saat ke lokasi

Contoh logika pemeriksaan izin ini muncul di cuplikan kode berikut:

Kotlin

    val permissionAccessCoarseLocationApproved = ActivityCompat
        .checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION) ==
        PackageManager.PERMISSION_GRANTED

    if (permissionAccessCoarseLocationApproved) {
       val backgroundLocationPermissionApproved = ActivityCompat
           .checkSelfPermission(this, permission.ACCESS_BACKGROUND_LOCATION) ==
           PackageManager.PERMISSION_GRANTED

       if (backgroundLocationPermissionApproved) {
           // App can access location both in the foreground and in the background.
           // Start your service that doesn't have a foreground service type
           // defined.
       } else {
           // App can only access location in the foreground. Display a dialog
           // warning the user that your app must have all-the-time access to
           // location in order to function properly. Then, request background
           // location.
           ActivityCompat.requestPermissions(this,
               arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION),
               your-permission-request-code
           )
       }
    } else {
       // App doesn't have access to the device's location at all. Make full request
       // for permission.
       ActivityCompat.requestPermissions(this,
           arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION,
                   Manifest.permission.ACCESS_BACKGROUND_LOCATION),
           your-permission-request-code
       )
    }
    

Java

    boolean permissionAccessCoarseLocationApproved =
        ActivityCompat.checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION)
            == PackageManager.PERMISSION_GRANTED;

    if (permissionAccessCoarseLocationApproved) {
       boolean backgroundLocationPermissionApproved =
               ActivityCompat.checkSelfPermission(this,
                   permission.ACCESS_BACKGROUND_LOCATION)
                   == PackageManager.PERMISSION_GRANTED;

       if (backgroundLocationPermissionApproved) {
           // App can access location both in the foreground and in the background.
           // Start your service that doesn't have a foreground service type
           // defined.
       } else {
           // App can only access location in the foreground. Display a dialog
           // warning the user that your app must have all-the-time access to
           // location in order to function properly. Then, request background
           // location.
           ActivityCompat.requestPermissions(this, new String[] {
               Manifest.permission.ACCESS_BACKGROUND_LOCATION},
               your-permission-request-code);
       }
    } else {
       // App doesn't have access to the device's location at all. Make full request
       // for permission.
       ActivityCompat.requestPermissions(this, new String[] {
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_BACKGROUND_LOCATION
            },
            your-permission-request-code);
    }
    

Skenario desain untuk upgrade perangkat

Jika pengguna menyelesaikan langkah berikut:

  1. Menginstal aplikasi Anda di perangkat yang menjalankan Android 9 (API level 28).
  2. Memberi aplikasi Anda akses ke lokasi perangkat - baik ACCESS_COARSE_LOCATION atau ACCESS_FINE_LOCATION.
  3. Meng-upgrade perangkat mereka dari Android 9 ke Android Q.

...sistem secara otomatis memperbarui status izin lokasi default aplikasi Anda berdasarkan versi SDK target dan izin yang ditentukan, seperti yang ditunjukkan pada tabel berikut:

Tabel 1. Perubahan status izin lokasi setelah upgrade perangkat ke Android Q

Versi SDK target Izin untuk akurasi rendah atau
akurasi tinggi diberikan?
Izin latar belakang
didefinisikan dalam manifes?
Status izin default yang diperbarui
Android Q Ya Ya Akses latar depan dan latar belakang
Android Q Ya Tidak Hanya akses latar depan
Android Q Tidak (Diabaikan oleh sistem) Tanpa akses
Android 9 atau yang lebih rendah Ya (Otomatis ditambahkan oleh sistem pada waktu upgrade perangkat) Akses latar depan dan latar belakang
Android 9 atau yang lebih rendah Tidak (Diabaikan oleh sistem) Tanpa akses

Catatan: Meskipun setelah sistem otomatis memperbarui akses aplikasi Anda ke lokasi perangkat, pengguna memiliki opsi untuk mengubah tingkat akses ini. Pengguna dapat mengurangi akses aplikasi Anda hanya untuk latar depan atau mencabut akses sepenuhnya.

Untuk alasan ini, sebelum mengakses pembaruan lokasi perangkat, ikuti praktik terbaik untuk memeriksa apakah pengguna masih mengizinkan aplikasi Anda untuk menerima informasi lokasi ini.

Mengikuti praktik terbaik lokasi

Dengan memeriksa dan meminta izin lokasi sesuai cara yang ditunjukkan dalam panduan ini, aplikasi Anda dapat berhasil melacak level aksesnya ke lokasi perangkat.

Untuk informasi selengkapnya tentang cara menjaga keamanan data pengguna, lihat panduan praktik terbaik izin.

Hanya meminta izin yang Anda perlukan

Minta izin hanya jika diperlukan. Contoh:

  • Jangan meminta izin lokasi saat aplikasi dimulai, kecuali benar-benar diperlukan.
  • Jika aplikasi Anda menargetkan Android Q dan memerlukan akses ke informasi lokasi hanya saat berjalan di latar depan, jangan meminta ACCESS_BACKGROUND_LOCATION.

Mendukung degradasi halus jika izin tidak diberikan

Untuk mempertahankan pengalaman pengguna yang baik, desain aplikasi Anda agar dapat secara halus menangani situasi berikut:

  • Aplikasi Anda tidak memiliki akses ke informasi lokasi.
  • Aplikasi Anda tidak memiliki akses ke informasi lokasi saat berjalan di latar belakang.

Referensi lainnya

Untuk mengetahui informasi lebih lanjut tentang perubahan terkait akses aplikasi ke lokasi perangkat, lihat referensi tambahan berikut:

Contoh