Bagikan melalui


Izin Di Xamarin.Android

Gambaran Umum

Aplikasi Android berjalan di kotak pasir mereka sendiri dan untuk alasan keamanan tidak memiliki akses ke sumber daya sistem atau perangkat keras tertentu di perangkat. Pengguna harus secara eksplisit memberikan izin ke aplikasi sebelum dapat menggunakan sumber daya ini. Misalnya, aplikasi tidak dapat mengakses GPS pada perangkat tanpa izin eksplisit dari pengguna. Android akan melempar Java.Lang.SecurityException jika aplikasi mencoba mengakses sumber daya yang dilindungi tanpa izin.

Izin dideklarasikan dalam AndroidManifest.xml oleh pengembang aplikasi saat aplikasi dikembangkan. Android memiliki dua alur kerja yang berbeda untuk mendapatkan persetujuan pengguna untuk izin tersebut:

  • Untuk aplikasi yang menargetkan Android 5.1 (API level 22) atau yang lebih rendah, permintaan izin terjadi saat aplikasi diinstal. Jika pengguna tidak memberikan izin, aplikasi tidak akan diinstal. Setelah aplikasi diinstal, tidak ada cara untuk mencabut izin kecuali dengan menghapus instalan aplikasi.
  • Mulai dari Android 6.0 (API level 23), pengguna diberi kontrol lebih besar atas izin; mereka dapat memberikan atau mencabut izin selama aplikasi diinstal pada perangkat. Cuplikan layar ini menampilkan pengaturan izin untuk aplikasi Google Kontak. Ini mencantumkan berbagai izin dan memungkinkan pengguna untuk mengaktifkan atau menonaktifkan izin:

Sample Permissions screen

Aplikasi Android harus memeriksa pada run-time untuk melihat apakah mereka memiliki izin untuk mengakses sumber daya yang dilindungi. Jika aplikasi tidak memiliki izin, aplikasi harus membuat permintaan menggunakan API baru yang disediakan oleh Android SDK agar pengguna memberikan izin. Izin dibagi menjadi dua kategori:

  • Izin Normal – Ini adalah izin yang menimbulkan sedikit risiko keamanan terhadap keamanan atau privasi pengguna. Android 6.0 akan secara otomatis memberikan izin normal pada saat penginstalan. Silakan lihat dokumentasi Android untuk daftar lengkap izin normal.
  • Izin Berbahaya – Berbeda dengan izin normal, izin berbahaya adalah izin yang melindungi keamanan atau privasi pengguna. Ini harus diberikan secara eksplisit oleh pengguna. Mengirim atau menerima pesan SMS adalah contoh tindakan yang memerlukan izin berbahaya.

Penting

Kategori tempat izin dapat berubah dari waktu ke waktu. Ada kemungkinan bahwa izin yang dikategorikan sebagai izin "normal" dapat ditingkatkan di tingkat API mendatang ke izin berbahaya.

Izin berbahaya dibagi lebih lanjut menjadi grup izin. Grup izin akan menyimpan izin yang terkait secara logis. Saat pengguna memberikan izin kepada satu anggota grup izin, Android secara otomatis memberikan izin kepada semua anggota grup tersebut. Misalnya, STORAGE grup izin memegang WRITE_EXTERNAL_STORAGE izin dan READ_EXTERNAL_STORAGE . Jika pengguna memberikan izin ke READ_EXTERNAL_STORAGE, maka WRITE_EXTERNAL_STORAGE izin secara otomatis diberikan pada saat yang sama.

Sebelum meminta satu atau beberapa izin, ini adalah praktik terbaik untuk memberikan alasan mengapa aplikasi memerlukan izin sebelum meminta izin. Setelah pengguna memahami alasannya, aplikasi dapat meminta izin dari pengguna. Dengan memahami alasannya, pengguna dapat membuat keputusan berdasarkan informasi jika mereka ingin memberikan izin dan memahami dampaknya jika tidak.

Seluruh alur kerja memeriksa dan meminta izin dikenal sebagai pemeriksaan izin run-time, dan dapat diringkas dalam diagram berikut:

Run-time permission check flow chart

Android Support Library mendukung beberapa API baru untuk izin ke versi Android yang lebih lama. API yang didukung ini akan secara otomatis memeriksa versi Android pada perangkat sehingga tidak perlu melakukan pemeriksaan tingkat API setiap kali.

Dokumen ini akan membahas cara menambahkan izin ke aplikasi Xamarin.Android dan bagaimana aplikasi yang menargetkan Android 6.0 (API level 23) atau yang lebih tinggi harus melakukan pemeriksaan izin run-time.

Catatan

Ada kemungkinan bahwa izin untuk perangkat keras dapat memengaruhi bagaimana aplikasi difilter oleh Google Play. Misalnya, jika aplikasi memerlukan izin untuk kamera, Google Play tidak akan menampilkan aplikasi di Google Play Store di perangkat yang tidak memasang kamera.

Persyaratan

Sangat disarankan agar proyek Xamarin.Android menyertakan paket Xamarin.Android.Support.Compat NuGet. Paket ini akan mem-backport izin API tertentu ke versi Android yang lebih lama, menyediakan satu antarmuka umum tanpa perlu terus-menerus memeriksa versi Android tempat aplikasi berjalan.

Meminta Izin Sistem

Langkah pertama dalam bekerja dengan izin Android adalah mendeklarasikan izin dalam file manifes Android. Ini harus dilakukan terlepas dari tingkat API yang ditargetkan aplikasi.

Aplikasi yang menargetkan Android 6.0 atau yang lebih tinggi tidak dapat mengasumsikan bahwa karena pengguna memberikan izin di beberapa titik sebelumnya, bahwa izin akan valid di lain waktu. Aplikasi yang menargetkan Android 6.0 harus selalu melakukan pemeriksaan izin runtime. Aplikasi yang menargetkan Android 5.1 atau yang lebih rendah tidak perlu melakukan pemeriksaan izin run-time.

Catatan

Aplikasi hanya boleh meminta izin yang mereka butuhkan.

Mendeklarasikan Izin dalam Manifes

Izin ditambahkan ke AndroidManifest.xml dengan uses-permission elemen . Misalnya, jika aplikasi adalah menemukan posisi perangkat, aplikasi memerlukan izin lokasi yang baik dan kursus. Dua elemen berikut ditambahkan ke manifes:

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

Dimungkinkan untuk mendeklarasikan izin menggunakan dukungan alat yang disertakan dalam Visual Studio:

  1. Klik dua kali Properti di Penjelajah Solusi dan pilih tab Manifes Android di jendela Properti:

    Required permissions in the Android Manifest tab

  2. Jika aplikasi belum memiliki AndroidManifest.xml, klik Tidak AndroidManifest.xml ditemukan. Klik untuk menambahkannya seperti yang ditunjukkan di bawah ini:

    No AndroidManifest.xml message

  3. Pilih izin apa pun yang dibutuhkan aplikasi Anda dari daftar Izin yang diperlukan dan simpan:

    Example CAMERA permissions selected

Xamarin.Android akan secara otomatis menambahkan beberapa izin pada waktu build ke build Debug. Ini akan mempermudah penelusuran kesalahan aplikasi. Secara khusus, dua izin penting adalah INTERNET dan READ_EXTERNAL_STORAGE. Izin yang diatur secara otomatis ini tampaknya tidak akan diaktifkan di daftar Izin yang diperlukan. Build rilis, namun, hanya gunakan izin yang secara eksplisit diatur dalam daftar Izin yang diperlukan.

Untuk aplikasi yang menargetkan Android 5.1(API level 22) atau yang lebih rendah, tidak ada lagi yang perlu dilakukan. Aplikasi yang akan berjalan di Android 6.0 (API 23 level 23) atau yang lebih tinggi harus melanjutkan ke bagian berikutnya tentang cara melakukan pemeriksaan izin run time.

Pemeriksaan Izin Runtime di Android 6.0

Metode ContextCompat.CheckSelfPermission (tersedia dengan Android Support Library) digunakan untuk memeriksa apakah izin tertentu telah diberikan. Metode ini akan mengembalikan Android.Content.PM.Permission enum yang memiliki salah satu dari dua nilai:

  • Permission.Granted – Izin yang ditentukan telah diberikan.
  • Permission.Denied – Izin yang ditentukan belum diberikan.

Cuplikan kode ini adalah contoh cara memeriksa izin Kamera dalam Aktivitas:

if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) == (int)Permission.Granted) 
{
    // We have permission, go ahead and use the camera.
} 
else 
{
    // Camera permission is not granted. If necessary display rationale & request.
}

Ini adalah praktik terbaik untuk memberi tahu pengguna mengapa izin diperlukan untuk aplikasi sehingga keputusan yang diinformasikan dapat dibuat untuk memberikan izin. Contohnya adalah aplikasi yang mengambil foto dan menandainya secara geografis. Jelas untuk pengguna bahwa izin kamera diperlukan, tetapi mungkin tidak jelas mengapa aplikasi juga membutuhkan lokasi perangkat. Alasan harus menampilkan pesan untuk membantu pengguna memahami mengapa izin lokasi diinginkan dan bahwa izin kamera diperlukan.

Metode ActivityCompat.ShouldShowRequestPermissionRationale ini digunakan untuk menentukan apakah alasan harus ditampilkan kepada pengguna. Metode ini akan mengembalikan true jika alasan untuk izin tertentu harus ditampilkan. Cuplikan layar ini menunjukkan contoh Snackbar yang ditampilkan oleh aplikasi yang menjelaskan mengapa aplikasi perlu mengetahui lokasi perangkat:

Rationale for location

Jika pengguna memberikan izin, ActivityCompat.RequestPermissions(Activity activity, string[] permissions, int requestCode) metode harus dipanggil. Metode ini memerlukan parameter berikut:

  • activity – Ini adalah aktivitas yang meminta izin dan akan diberitahukan oleh Android tentang hasilnya.
  • izin – Daftar izin yang diminta.
  • requestCode – Nilai bilangan bulat yang digunakan untuk mencocokkan hasil permintaan izin dengan RequestPermissions panggilan. Nilai ini harus lebih besar dari nol.

Cuplikan kode ini adalah contoh dari dua metode yang dibahas. Pertama, pemeriksaan dilakukan untuk menentukan apakah alasan izin harus ditampilkan. Jika alasannya akan ditampilkan, maka Snackbar ditampilkan dengan alasan. Jika pengguna mengklik OK di Snackbar, maka aplikasi akan meminta izin. Jika pengguna tidak menerima alasannya, aplikasi tidak boleh melanjutkan untuk meminta izin. Jika alasan tidak ditampilkan, aktivitas akan meminta izin:

if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.AccessFineLocation)) 
{
    // Provide an additional rationale to the user if the permission was not granted
    // and the user would benefit from additional context for the use of the permission.
    // For example if the user has previously denied the permission.
    Log.Info(TAG, "Displaying camera permission rationale to provide additional context.");

    var requiredPermissions = new String[] { Manifest.Permission.AccessFineLocation };
    Snackbar.Make(layout, 
                   Resource.String.permission_location_rationale,
                   Snackbar.LengthIndefinite)
            .SetAction(Resource.String.ok, 
                       new Action<View>(delegate(View obj) {
                           ActivityCompat.RequestPermissions(this, requiredPermissions, REQUEST_LOCATION);
                       }    
            )
    ).Show();
}
else 
{
    ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.Camera }, REQUEST_LOCATION);
}

RequestPermission dapat dipanggil meskipun pengguna telah memberikan izin. Panggilan berikutnya tidak diperlukan, tetapi mereka memberi pengguna kesempatan untuk mengonfirmasi (atau mencabut) izin. Ketika RequestPermission dipanggil, kontrol diserahkan ke sistem operasi, yang akan menampilkan UI untuk menerima izin:

Permssion Dialog

Setelah pengguna selesai, Android akan mengembalikan hasilnya ke Aktivitas melalui metode panggilan balik, OnRequestPermissionResult. Metode ini adalah bagian dari antarmuka ActivityCompat.IOnRequestPermissionsResultCallback yang harus diimplementasikan oleh Aktivitas. Antarmuka ini memiliki satu metode, OnRequestPermissionsResult, yang akan dipanggil oleh Android untuk menginformasikan Aktivitas pilihan pengguna. Jika pengguna telah memberikan izin, aplikasi dapat melanjutkan dan menggunakan sumber daya yang dilindungi. Contoh cara menerapkan OnRequestPermissionResult ditunjukkan di bawah ini:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
{
    if (requestCode == REQUEST_LOCATION) 
    {
        // Received permission result for camera permission.
        Log.Info(TAG, "Received response for Location permission request.");

        // Check if the only required permission has been granted
        if ((grantResults.Length == 1) && (grantResults[0] == Permission.Granted)) {
            // Location permission has been granted, okay to retrieve the location of the device.
            Log.Info(TAG, "Location permission has now been granted.");
            Snackbar.Make(layout, Resource.String.permission_available_camera, Snackbar.LengthShort).Show();            
        } 
        else 
        {
            Log.Info(TAG, "Location permission was NOT granted.");
            Snackbar.Make(layout, Resource.String.permissions_not_granted, Snackbar.LengthShort).Show();
        }
    } 
    else 
    {
        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

Ringkasan

Panduan ini membahas cara menambahkan dan memeriksa izin di perangkat Android. Perbedaan cara kerja izin antara aplikasi Android lama (API level < 23) dan aplikasi Android baru (API level > 22). Ini membahas cara melakukan pemeriksaan izin run-time di Android 6.0.