Level API: 14
Android 4.0 (ICE_CREAM_SANDWICH
)
adalah rilis platform utama yang menambahkan berbagai fitur baru untuk pengguna dan aplikasi
developer. Selain semua fitur dan API baru yang dibahas di bawah ini, Android 4.0 merupakan
karena menghadirkan serangkaian API dan tema Holografik yang lengkap dari Android 3.x
ke layar yang lebih kecil. Sebagai developer aplikasi, Anda kini memiliki satu platform dan framework API terpadu
yang memungkinkan Anda mengembangkan dan memublikasikan aplikasi dengan satu APK yang menyediakan
mengoptimalkan pengalaman pengguna untuk handset, tablet, dan lainnya, saat menjalankan versi
Android—Android 4.0 (API level 14) atau yang lebih baru.
Untuk pengembang, platform Android 4.0 tersedia sebagai yang dapat didownload untuk Android SDK. Platform yang dapat didownload mencakup library dan image sistem Android, serta serangkaian skin emulator dan banyak lagi. Untuk memulai pengembangan atau pengujian di Android 4.0, menggunakan Android SDK Manager untuk mendownload platform ke SDK Anda.
Ringkasan API
Bagian di bawah ini memberikan ringkasan teknis tentang API baru di Android 4.0.
API Sosial di Penyedia Kontak
API kontak yang ditentukan oleh penyedia ContactsContract
telah
diperluas untuk mendukung fitur berorientasi sosial baru seperti profil pribadi bagi pemilik perangkat dan
kemampuan bagi pengguna untuk mengundang kontak individual ke jejaring sosial yang diinstal di
perangkat seluler.
Profil Pengguna
Android kini menyertakan profil pribadi yang mewakili pemilik perangkat, seperti yang didefinisikan oleh
Tabel ContactsContract.Profile
. Aplikasi sosial yang menjaga identitas pengguna
dapat berkontribusi pada data profil pengguna dengan membuat entri ContactsContract.RawContacts
baru dalam ContactsContract.Profile
. Yaitu, kontak mentah yang
mewakili pengguna perangkat yang
tidak termasuk dalam tabel kontak mentah tradisional yang ditentukan oleh URI ContactsContract.RawContacts
; sebagai gantinya, Anda harus menambahkan
kontak mentah profil
tabel di CONTENT_RAW_CONTACTS_URI
. Mentah
kontak di tabel ini kemudian digabungkan menjadi satu profil yang terlihat oleh pengguna berlabel "Saya".
Penambahan kontak mentah baru untuk profil memerlukan metode izin android.Manifest.permission#WRITE_PROFILE. Demikian juga, untuk membaca dari profil tabel, Anda harus meminta izin android.Manifest.permission#READ_PROFILE. Namun, sebagian besar aplikasi tidak perlu membaca profil pengguna, bahkan saat memberikan data ke untuk profil. Membaca profil pengguna adalah izin sensitif dan Anda harus mengharapkan pengguna skeptis terhadap aplikasi yang memintanya.
Intent Undangan
Tindakan intent INVITE_CONTACT
memungkinkan aplikasi
untuk memanggil tindakan yang mengindikasikan bahwa pengguna ingin menambahkan kontak ke jejaring sosial. Aplikasi
maka aplikasi akan menggunakannya untuk mengundang
kontak tertentu ke aplikasi
jejaring sosial. Sebagian besar aplikasi akan berada di pihak penerima operasi ini. Misalnya,
aplikasi Orang bawaan memanggil intent undangan saat pengguna memilih "Add connection" untuk
aplikasi sosial yang tercantum dalam detail kontak seseorang.
Untuk membuat aplikasi Anda terlihat seperti di "Tambahkan koneksi" aplikasi Anda harus menyediakan adaptor sinkronisasi untuk
menyinkronkan informasi kontak dari jejaring sosial Anda. Anda kemudian harus menunjukkan
kepada sistem bahwa
aplikasi merespons intent INVITE_CONTACT
dengan
menambahkan atribut inviteContactActivity
ke file konfigurasi sinkronisasi aplikasi Anda, dengan
nama aktivitas yang sepenuhnya memenuhi syarat dan harus dimulai oleh sistem saat mengirim intent undangan.
Aktivitas yang dimulai kemudian bisa mengambil URI kontak yang dimaksud dari intent
data dan melakukan pekerjaan yang diperlukan untuk mengundang kontak tersebut ke jaringan atau menambahkan orang itu ke
terhubung dengan pengguna.
Foto besar
Android kini mendukung foto kontak beresolusi tinggi. Sekarang, ketika Anda mendorong foto ke
catatan kontak, sistem akan memprosesnya menjadi thumbnail berukuran 96x96 (seperti yang telah dilakukan sebelumnya) dan
"tampilan foto" 256x256 yang disimpan di penyimpanan foto berbasis file baru (dimensi yang
pilihan sistem dapat bervariasi di masa mendatang). Anda dapat menambahkan foto besar ke kontak dengan menempatkan
foto di kolom PHOTO
biasa dari sebuah
baris data, yang kemudian akan diproses sistem menjadi thumbnail dan tampilan foto yang sesuai
{i>record<i}.
Masukan Penggunaan Kontak
ContactsContract.DataUsageFeedback
API baru memungkinkan Anda membantu melacak
seberapa sering pengguna menggunakan metode tertentu untuk menghubungi orang, seperti seberapa sering pengguna menggunakan
setiap nomor telepon atau alamat email. Informasi ini membantu meningkatkan peringkat untuk setiap kontak
yang dikaitkan dengan setiap orang dan memberikan saran yang lebih baik untuk menghubungi setiap orang.
Penyedia Kalender
API kalender baru memungkinkan Anda untuk membaca, menambah, mengubah, dan menghapus kalender, acara, tamu, pengingat dan pemberitahuan, yang disimpan di Penyedia Kalender.
Berbagai aplikasi dan widget dapat menggunakan API ini untuk membaca dan mengubah acara kalender. Namun, beberapa kasus penggunaan yang paling menarik adalah adaptor sinkronisasi yang menyinkronkan kalender pengguna layanan kalender lainnya dengan Penyedia Kalender, untuk menawarkan lokasi terpadu peristiwa pengguna. Acara Google Kalender, misalnya, disinkronkan dengan Penyedia Kalender dengan Adaptor Sinkronisasi Google Kalender, yang memungkinkan acara ini dilihat dengan perangkat Aplikasi Kalender.
Model data untuk kalender dan informasi terkait acara di Penyedia Kalender adalah
ditentukan oleh CalendarContract
. Semua data kalender pengguna disimpan di
jumlah tabel yang ditentukan oleh berbagai subclass CalendarContract
:
- Tabel
CalendarContract.Calendars
menyimpan data khusus kalender tidak akurat atau tidak sesuai. Setiap baris dalam tabel ini berisi detail untuk satu kalender, seperti nama, warna, sinkronisasi informasi, dan sebagainya. - Tabel
CalendarContract.Events
menyimpan informasi khusus peristiwa. Setiap baris dalam tabel ini berisi informasi untuk satu peristiwa, seperti judul acara, lokasi, waktu mulai, waktu berakhir, dan sebagainya. Peristiwa bisa terjadi satu kali atau berulang beberapa kali. Peserta, pengingat, dan properti {i>extended<i} disimpan dalam tabel terpisah dan gunakan_ID
acara untuk menautkannya dengan acara. - Tabel
CalendarContract.Instances
menyimpan waktu mulai dan berakhir untuk kemunculan suatu peristiwa. Setiap baris dalam tabel ini mewakili satu kemunculan. Untuk acara satu kali ada pemetaan one-to-one dari instance ke peristiwa. Untuk acara berulang, beberapa baris dibuat secara otomatis sesuai dengan beberapa kemunculan peristiwa tersebut. - Tabel
CalendarContract.Attendees
menyimpan tamu atau tamu acara tidak akurat atau tidak sesuai. Tiap baris mewakili satu tamu kejadian. Ini menentukan tipe tamu orang dan tanggapan orang tersebut untuk peristiwa. - Tabel
CalendarContract.Reminders
menyimpan data pemberitahuan/notifikasi. Tiap baris mewakili satu peringatan untuk sebuah kejadian. Sebuah kejadian bisa memiliki beberapa pengingat. Jumlah pengingat per peristiwa ditetapkan dalamMAX_REMINDERS
, yang disetel oleh adaptor sinkronisasi yang yang memiliki kalender yang ditentukan. Pengingat ditentukan dalam jumlah menit sebelum acara dijadwalkan dan menetapkan metode alarm, misalnya menggunakan pemberitahuan, email, atau SMS untuk mengingatkan pengguna. - Tabel
CalendarContract.ExtendedProperties
berisi kolom data buram yang digunakan oleh adaptor sinkronisasi. Penyedia tidak mengambil tindakan terhadap item dalam tabel ini kecuali untuk menghapus saat peristiwa terkait dihapus.
Untuk mengakses data kalender pengguna dengan Penyedia Kalender, aplikasi Anda harus meminta
izin READ_CALENDAR
(untuk akses baca) dan
WRITE_CALENDAR
(untuk akses tulis).
Intent peristiwa
Jika yang ingin Anda lakukan hanyalah menambahkan peristiwa ke kalender pengguna, Anda dapat menggunakan intent ACTION_INSERT
dengan data yang ditentukan oleh Events.CONTENT_URI
untuk memulai
aktivitas di aplikasi Kalender yang membuat acara baru. Penggunaan intent ini tidak memerlukan
izin akses, dan Anda dapat menentukan detail acara dengan tambahan berikut:
Events.TITLE
: Nama untuk acaraCalendarContract.EXTRA_EVENT_BEGIN_TIME
: Waktu mulai peristiwa dalam milidetik sejak epochCalendarContract.EXTRA_EVENT_END_TIME
: Peristiwa waktu berakhir dalam milidetik sejak epochEvents.EVENT_LOCATION
: Lokasi acaraEvents.DESCRIPTION
: Peristiwa deskripsiIntent.EXTRA_EMAIL
: Alamat email mereka yang akan undangEvents.RRULE
: Pengulangan aturan untuk peristiwa tersebutEvents.ACCESS_LEVEL
: Apakah acara tersebut pribadi atau publikEvents.AVAILABILITY
: Apakah jangka waktu acara ini memungkinkan acara lain dijadwalkan pada waktu yang sama
Penyedia Pesan Suara
Penyedia Pesan Suara baru memungkinkan aplikasi menambahkan pesan suara ke perangkat, untuk menyajikan semua pesan suara pengguna dalam satu presentasi visual. Contohnya, pengguna mungkin memiliki beberapa sumber pesan suara, seperti satu dari penyedia layanan ponsel dan lainnya dari VoIP atau suara alternatif lainnya layanan IT perusahaan mereka. Aplikasi ini dapat menggunakan API Penyedia Pesan Suara untuk menambahkan pesan suara ke perangkat. Tujuan aplikasi Telepon bawaan kemudian menyajikan semua pesan suara kepada pengguna dalam presentasi terpadu. Meskipun aplikasi Telepon sistem adalah satu-satunya aplikasi yang dapat membaca semua pesan suara, setiap aplikasi yang menyediakan pesan suara dapat membaca pesan yang telah ditambahkannya ke sistem (tetapi tidak membaca pesan suara dari layanan lain).
Karena API saat ini tidak mengizinkan aplikasi pihak ketiga membaca semua pesan suara dari satu-satunya aplikasi pihak ketiga yang seharusnya menggunakan API pesan suara adalah aplikasi yang memiliki untuk disampaikan kepada pengguna.
Class VoicemailContract
menentukan penyedia konten untuk
Penyedia Pesan Suara. Subclass VoicemailContract.Voicemails
dan VoicemailContract.Status
menyediakan tabel yang dapat digunakan aplikasi untuk
menyisipkan data pesan suara untuk disimpan di perangkat. Untuk contoh aplikasi penyedia pesan suara, lihat
Penyedia Pesan Suara
Demo.
Multimedia
Android 4.0 menambahkan beberapa API baru untuk aplikasi yang berinteraksi dengan media seperti foto, video, dan musik.
Efek Media
Kerangka kerja efek media baru memungkinkan Anda menerapkan berbagai efek visual ke gambar dan video. Contohnya, efek gambar memungkinkan Anda memperbaiki mata merah dengan mudah, mengonversi gambar menjadi hitam putih, menyesuaikan kecerahan, menyesuaikan saturasi, memutar gambar, menerapkan efek mata ikan, dan banyak lagi. Tujuan sistem akan melakukan semua pemrosesan efek pada GPU untuk memperoleh performa maksimal.
Untuk performa maksimum, efek diterapkan langsung ke tekstur OpenGL, sehingga aplikasi Anda harus memiliki konteks OpenGL yang valid sebelum dapat menggunakan API efek. Tekstur yang Anda gunakan dapat berasal dari bitmap, video, atau bahkan kamera. Namun, ada batasan tertentu yang tekstur harus memenuhi:
- Gambar ini harus terikat ke gambar tekstur
GL_TEXTURE_2D
- Item harus berisi setidaknya satu tingkat mipmap
Objek Effect
menentukan satu efek media yang dapat Anda terapkan
bingkai gambar. Alur kerja dasar untuk membuat Effect
adalah:
- Panggil
EffectContext.createWithCurrentGlContext()
dari konteks OpenGL ES 2.0. - Gunakan
EffectContext
yang ditampilkan untuk memanggilEffectContext.getFactory()
, yang menampilkan instance dariEffectFactory
. - Panggil
createEffect()
, dengan meneruskan nama efek dari @link android.media.effect.EffectFactory}, sepertiEFFECT_FISHEYE
atauEFFECT_VIGNETTE
.
Anda dapat menyesuaikan parameter efek dengan memanggil setParameter()
serta meneruskan nama parameter dan nilai parameter. Setiap jenis efek menerima
parameter yang berbeda, yang
didokumentasikan dengan nama efek. Misalnya, EFFECT_FISHEYE
memiliki satu parameter untuk scale
elemen
distorsi.
Untuk menerapkan efek pada tekstur, panggil apply()
pada
Effect
dan teruskan tekstur input, lebar dan tingginya, serta outputnya
tekstur. Tekstur input harus terikat dengan tekstur GL_TEXTURE_2D
gambar (biasanya dilakukan dengan memanggil glTexImage2D()
). Anda dapat memberikan beberapa level mipmap. Jika tekstur output tidak terikat ke elemen
gambar tekstur, gambar ini akan otomatis terikat oleh efek sebagai GL_TEXTURE_2D
dan dengan satu tingkat mipmap (0), yang akan memiliki
ukuran sebagai input.
Semua efek yang tercantum dalam EffectFactory
dijamin akan didukung.
Namun, beberapa efek tambahan yang tersedia dari
library eksternal tidak didukung oleh semua perangkat,
sehingga Anda harus terlebih dahulu memeriksa apakah efek yang diinginkan dari library eksternal didukung dengan memanggil
isEffectSupported()
.
Klien remote control
RemoteControlClient
baru memungkinkan pemutar media mengaktifkan pemutaran
{i>control <i}dari klien {i>remote control<i}
seperti layar kunci perangkat. Pemutar media juga
dapat mengekspos
informasi tentang media yang sedang diputar untuk ditampilkan pada remote control, seperti trek
informasi dan gambar album.
Guna mengaktifkan klien remote control untuk pemutar media, buat instance RemoteControlClient
dengan konstruktornya, dengan meneruskan PendingIntent
yang menyiarkan ACTION_MEDIA_BUTTON
. Intent juga harus mendeklarasikan komponen BroadcastReceiver
eksplisit di aplikasi Anda yang menangani peristiwa ACTION_MEDIA_BUTTON
.
Untuk mendeklarasikan input kontrol media mana yang dapat ditangani pemutar, Anda harus memanggil setTransportControlFlags()
di
RemoteControlClient
, yang meneruskan kumpulan tanda FLAG_KEY_MEDIA_*
, seperti
FLAG_KEY_MEDIA_PREVIOUS
dan FLAG_KEY_MEDIA_NEXT
.
Selanjutnya, Anda harus mendaftarkan RemoteControlClient
dengan meneruskannya ke MediaManager.registerRemoteControlClient()
.
Setelah terdaftar, penerima siaran yang Anda deklarasikan saat membuat instance RemoteControlClient
akan menerima ACTION_MEDIA_BUTTON
peristiwa saat tombol ditekan dari remote control. Intent yang Anda terima menyertakan KeyEvent
untuk tombol media yang ditekan, yang dapat Anda ambil dari intent dengan getParcelableExtra(Intent.EXTRA_KEY_EVENT)
.
Untuk menampilkan informasi media yang sedang diputar pada remote control, panggil editMetaData()
dan tambahkan metadata ke data yang ditampilkan
RemoteControlClient.MetadataEditor
. Anda dapat menyediakan bitmap untuk karya seni media,
informasi numerik seperti waktu berlalu, dan informasi teks seperti judul lagu. Sebagai
informasi terkait kunci yang tersedia, lihat flag METADATA_KEY_*
di MediaMetadataRetriever
.
Untuk contoh implementasi, lihat Random Music Player, yang menyediakan logika kompatibilitas sehingga memungkinkan klien remote control di Android 4.0 perangkat sambil terus mendukung perangkat untuk kembali ke Android 2.1.
Pemutar media
- Streaming media online dari
MediaPlayer
kini memerlukan izinINTERNET
. Jika Anda menggunakanMediaPlayer
untuk memutar konten dari Internet, pastikan untuk menambahkanINTERNET
izin ke manifes, jika tidak pemutaran media Anda tidak akan berfungsi mulai dari Android 4.0. setSurface()
memungkinkan Anda menentukanSurface
agar berperilaku sebagai sink video.setDataSource()
memungkinkan Anda untuk mengirim header HTTP tambahan dengan permintaan Anda, yang dapat berguna untuk live streaming HTTP(S)- Live streaming HTTP(S) kini mematuhi cookie HTTP di seluruh permintaan
Jenis media
Android 4.0 menambahkan dukungan untuk:
- Protokol live streaming HTTP/HTTPS versi 3
- Encoding audio AAC mentah ADTS
- Gambar WEBP
- Video Matroska
Untuk mengetahui info selengkapnya, lihat Media yang Didukung Format.
Kamera
Class Camera
kini menyertakan API untuk mendeteksi wajah dan mengontrol
area fokus dan pengukuran.
Deteksi wajah
Aplikasi kamera kini dapat meningkatkan kemampuannya dengan API deteksi wajah Android, yang tidak hanya mendeteksi wajah subjek, tetapi juga fitur wajah tertentu, seperti mata dan mulut.
Untuk mendeteksi wajah di aplikasi kamera, Anda harus mendaftarkan Camera.FaceDetectionListener
dengan memanggil setFaceDetectionListener()
. Anda kemudian dapat memulai
permukaan kamera dan mulai mendeteksi wajah dengan memanggil startFaceDetection()
.
Saat mendeteksi satu atau beberapa wajah di adegan kamera, sistem akan memanggil callback onFaceDetection()
di
implementasi Camera.FaceDetectionListener
, termasuk array
Objek Camera.Face
.
Instance class Camera.Face
memberikan berbagai informasi tentang
wajah yang terdeteksi, termasuk:
Rect
yang menentukan batas wajah, relatif terhadap antarmuka kamera ruang pandang saat ini- Bilangan bulat antara 1 dan 100 yang menunjukkan seberapa yakin sistem bahwa objek adalah wajah manusia
- ID unik sehingga Anda dapat melacak beberapa wajah
- Beberapa objek
Point
yang menunjukkan lokasi mata dan mulut ditemukan
Catatan: Deteksi wajah mungkin tidak didukung di beberapa perangkat
perangkat, jadi Anda harus memeriksanya dengan memanggil getMaxNumDetectedFaces()
dan memastikan pengembalian
nilainya lebih besar dari nol. Juga, beberapa perangkat mungkin tidak
mendukung identifikasi mata dan mulut,
dalam hal ini, kolom tersebut dalam objek Camera.Face
akan menjadi null.
Area fokus dan pengukuran
Aplikasi kamera kini dapat mengontrol area yang digunakan kamera untuk fokus dan untuk pengukuran warna putih
keseimbangan
dan eksposur otomatis. Kedua fitur menggunakan class Camera.Area
baru untuk menentukan
area tampilan kamera saat ini yang harus difokuskan atau diukur. Instance class Camera.Area
menentukan batas area dengan Rect
dan bobot area—yang mewakili tingkat kepentingannya
area, relatif terhadap area lain yang dipertimbangkan—dengan bilangan bulat.
Sebelum menetapkan area fokus atau area pengukuran, Anda harus terlebih dahulu memanggil getMaxNumFocusAreas()
atau getMaxNumMeteringAreas()
. Jika hasilnya nol, maka
perangkat itu tidak mendukung fitur tersebut.
Untuk menentukan area fokus atau pengukuran yang akan digunakan, cukup panggil setFocusAreas()
atau setMeteringAreas()
. Masing-masing mengambil List
dari Camera.Area
objek yang menunjukkan area yang perlu dipertimbangkan
untuk fokus atau pengukuran. Misalnya, Anda dapat mengimplementasikan fitur yang memungkinkan pengguna menyetel
area fokus dengan menyentuh area pratinjau, yang kemudian Anda terjemahkan ke objek Camera.Area
dan meminta kamera untuk fokus pada area adegan tersebut.
Fokus atau eksposur di area tersebut akan terus diperbarui seiring perubahan area di area tersebut.
Fokus otomatis berkelanjutan untuk foto
Anda kini dapat mengaktifkan fokus otomatis berkelanjutan (CAF) saat mengambil foto. Untuk mengaktifkan CAF di
aplikasi kamera, teruskan FOCUS_MODE_CONTINUOUS_PICTURE
ke setFocusMode()
. Saat siap mengambil foto
foto, panggil autoFocus()
. Camera.AutoFocusCallback
akan segera menerima callback untuk menunjukkan apakah
fokus tercapai. Untuk melanjutkan CAF setelah menerima callback, Anda harus memanggil cancelAutoFocus()
.
Catatan: Fokus otomatis berkelanjutan juga didukung saat mengambil gambar
video, menggunakan FOCUS_MODE_CONTINUOUS_VIDEO
, yang
ditambahkan di API level 9.
Fitur kamera lainnya
- Saat merekam video, kini Anda dapat memanggil
takePicture()
untuk menyimpan foto tanpa mengganggu sesi video. Sebelum melakukannya, Anda harus panggilisVideoSnapshotSupported()
untuk memastikan hardware mendukungnya. - Anda kini dapat mengunci eksposur otomatis dan white balance dengan
setAutoExposureLock()
dansetAutoWhiteBalanceLock()
untuk mencegah properti ini agar tidak berubah. - Anda kini dapat memanggil
setDisplayOrientation()
saat pratinjau kamera berjalan. Sebelumnya, Anda dapat memanggilnya hanya sebelum memulai pratinjau, tetapi Anda kini dapat mengubah orientasinya kapan saja.
Intent siaran kamera
Camera.ACTION_NEW_PICTURE
: Hal ini menunjukkan bahwa pengguna telah mengambil foto baru. Aplikasi Kamera bawaan memanggil setelah foto diambil dan aplikasi kamera pihak ketiga juga harus menyiarkan intent ini setelah mengambil foto.Camera.ACTION_NEW_VIDEO
: Hal ini menunjukkan bahwa pengguna telah merekam video baru. Aplikasi Kamera bawaan memanggil disiarkan setelah video direkam dan aplikasi kamera pihak ketiga juga harus menyiarkan intent ini setelah merekam video.
Android Beam (NDEF Push dengan NFC)
Android Beam adalah fitur NFC baru yang memungkinkan Anda mengirim pesan NDEF dari satu perangkat ke yang lain (proses yang juga dikenal sebagai "NDEF Push"). Transfer data dimulai ketika dua Perangkat berbasis Android yang mendukung Android Beam berada di jarak yang dekat (sekitar 4 cm), biasanya dengan punggung mereka bersentuhan. Data di dalam pesan NDEF dapat berisi data apa pun yang ingin Anda bagikan antar perangkat. Misalnya, aplikasi Orang berbagi kontak, YouTube berbagi video, dan Browser membagikan URL menggunakan Android Beam.
Untuk mentransmisikan data antar-perangkat menggunakan Android Beam, Anda perlu membuat NdefMessage
yang berisi informasi yang ingin dibagikan saat aktivitas Anda berada
latar depan. Kemudian, Anda harus meneruskan NdefMessage
ke sistem di salah satu dari dua
cara:
- Tentukan satu
NdefMessage
yang akan dikirim saat dalam aktivitas:Panggil
setNdefPushMessage()
kapan saja untuk menyetel pesan yang ingin Anda kirim. Misalnya, Anda dapat memanggil metode ini dan meneruskanNdefMessage
selamaonCreate()
aktivitas . Lalu, setiap kali Android Beam diaktifkan dengan perangkat lain saat aktivitas berada dalam latar depan, sistem akan mengirimkanNdefMessage
ke perangkat lain. - Tentukan
NdefMessage
yang akan dikirim pada saat Android Beam dimulai:Terapkan
NfcAdapter.CreateNdefMessageCallback
, di mana properti implementasicreateNdefMessage()
akan menampilkanNdefMessage
yang ingin Anda kirim. Kemudian, teruskan implementasiNfcAdapter.CreateNdefMessageCallback
kesetNdefPushMessageCallback()
.Dalam hal ini, saat Android Beam diaktifkan dengan perangkat lain saat aktivitas Anda berada di latar depan, sistem akan memanggil
createNdefMessage()
untuk mengambilNdefMessage
yang ingin Anda kirim. Ini memungkinkan Anda menentukanNdefMessage
yang akan dikirim hanya setelah Android Beam dimulai, jika konten pesan dapat bervariasi selama masa aktifnya.
Jika Anda ingin menjalankan beberapa kode tertentu setelah sistem berhasil mengirimkan NDEF
ke perangkat lain, Anda dapat menerapkan NfcAdapter.OnNdefPushCompleteCallback
dan menyetelnya dengan setNdefPushCompleteCallback()
. Sistem akan
lalu panggil onNdefPushComplete()
saat pesan disampaikan.
Di perangkat penerima, sistem mengirim pesan NDEF Push dengan cara yang sama seperti NFC biasa
{i>tag<i}. Sistem memanggil intent dengan ACTION_NDEF_DISCOVERED
tindakan untuk memulai aktivitas, dengan URL atau jenis MIME yang ditetapkan sesuai dengan NdefRecord
pertama dalam NdefMessage
. Untuk aktivitas yang ingin
Anda bisa mendeklarasikan filter intent untuk URL atau jenis MIME yang perlu diperhatikan aplikasi Anda. Untuk selengkapnya
informasi tentang Pengiriman Tag, lihat panduan developer NFC.
Jika ingin NdefMessage
membawa URI, Anda kini dapat menggunakan kemudahan
metode createUri
untuk membuat NdefRecord
baru berdasarkan string atau objek Uri
. Jika URI
format khusus yang Anda inginkan agar juga diterima aplikasi selama acara Android Beam, Anda
harus membuat filter intent untuk aktivitas Anda menggunakan skema URI yang sama untuk menerima
pesan NDEF yang masuk.
Anda juga harus meneruskan "catatan aplikasi Android" dengan NdefMessage
Anda di
untuk menjamin bahwa aplikasi Anda menangani
pesan NDEF yang masuk, meskipun
aplikasi untuk tindakan intent yang sama. Anda dapat membuat catatan aplikasi Android dengan
memanggil createApplicationRecord()
, meneruskannya
nama paket aplikasi Anda. Ketika perangkat lain menerima pesan NDEF dengan
dan beberapa aplikasi berisi aktivitas yang menangani intent yang ditentukan,
sistem akan selalu mengirimkan pesan ke aktivitas di aplikasi Anda (berdasarkan pencocokan
aplikasi). Jika perangkat target saat ini belum menginstal aplikasi Anda,
menggunakan catatan aplikasi Android untuk meluncurkan Google Play dan membawa pengguna ke
aplikasi untuk menginstalnya.
Jika aplikasi Anda tidak menggunakan NFC API untuk melakukan pesan NDEF Push, Android akan menyediakan perilaku default: Saat aplikasi berada di latar depan pada satu perangkat dan Android Beam dipanggil dengan perangkat lain yang didukung Android, kemudian perangkat lain menerima pesan NDEF dengan Catatan aplikasi Android yang mengidentifikasi aplikasi Anda. Jika perangkat penerima memiliki aplikasi diinstal, sistem akan meluncurkannya; jika tidak diinstal, Google Play akan terbuka dan mengambil pengguna ke aplikasi Anda untuk menginstalnya.
Anda dapat membaca selengkapnya tentang Android Beam dan fitur NFC lainnya di panduan developer Dasar-Dasar NFC. Untuk beberapa kode contoh yang menggunakan Android Beam, lihat Demo Beam.
Wi-Fi P2P
Android kini mendukung koneksi Wi-Fi peer-to-peer (P2P) antara perangkat Android dan jenis perangkat lain (sesuai dengan Wi-Fi DirectTM Wi-Fi Alliance ) tanpa koneksi internet atau hotspot. Framework Android menyediakan 1 set API Wi-Fi P2P yang memungkinkan Anda menemukan dan terhubung ke perangkat lain saat mendukung Wi-Fi P2P, kemudian berkomunikasi melalui koneksi cepat melintasi jarak yang lebih lama dari Koneksi Bluetooth.
Paket baru, android.net.wifi.p2p
, berisi semua API untuk melakukan peer-to-peer
dengan Wi-Fi. Class utama yang perlu Anda gunakan adalah WifiP2pManager
, yang dapat Anda peroleh dengan memanggil getSystemService(WIFI_P2P_SERVICE)
. WifiP2pManager
menyertakan API yang memungkinkan Anda:
- Melakukan inisialisasi aplikasi untuk koneksi P2P dengan memanggil
initialize()
- Temukan perangkat di sekitar dengan memanggil
discoverPeers()
- Mulai koneksi P2P dengan memanggil
connect()
- Dan lainnya
Beberapa antarmuka dan class lain juga diperlukan, seperti:
- Antarmuka
WifiP2pManager.ActionListener
memungkinkan Anda menerima callback ketika operasi seperti menemukan peer atau menghubungkan dengannya berhasil atau gagal. - Antarmuka
WifiP2pManager.PeerListListener
memungkinkan Anda menerima informasi tentang rekan yang ditemukan. Callback menyediakanWifiP2pDeviceList
, tempat Anda dapat mengambil objekWifiP2pDevice
untuk setiap perangkat dalam jangkauan dan mendapatkan informasi seperti nama perangkat, alamat, jenis perangkat, konfigurasi WPS yang didukung perangkat, dan banyak lagi. - Antarmuka
WifiP2pManager.GroupInfoListener
memungkinkan Anda untuk menerima informasi tentang grup P2P. Callback menyediakan objekWifiP2pGroup
, yang memberikan informasi grup seperti pemilik, nama jaringan, dan frasa sandi. - Antarmuka
WifiP2pManager.ConnectionInfoListener
memungkinkan Anda menerima informasi tentang koneksi saat ini. Callback menyediakan objekWifiP2pInfo
, yang memiliki informasi seperti apakah grup telah terbentuk dan siapa pemilik grupnya.
Untuk menggunakan Wi-Fi P2P API, aplikasi Anda harus meminta izin pengguna berikut:
ACCESS_WIFI_STATE
CHANGE_WIFI_STATE
INTERNET
(meskipun aplikasi Anda tidak terhubung secara teknis ke Internet, berkomunikasi dengan rekan Wi-Fi P2P dengan soket java standar memerlukan koneksi tertentu).
Sistem Android juga menyiarkan beberapa tindakan berbeda selama peristiwa P2P Wi-Fi tertentu:
WIFI_P2P_CONNECTION_CHANGED_ACTION
: P2P status koneksi telah berubah. Ini membawaEXTRA_WIFI_P2P_INFO
dengan objekWifiP2pInfo
danEXTRA_NETWORK_INFO
denganNetworkInfo
.WIFI_P2P_STATE_CHANGED_ACTION
: Status P2P memiliki berubah antara diaktifkan dan dinonaktifkan. Aplikasi membawaEXTRA_WIFI_STATE
denganWIFI_P2P_STATE_DISABLED
atauWIFI_P2P_STATE_ENABLED
WIFI_P2P_PEERS_CHANGED_ACTION
: Daftar pembanding perangkat telah berubah.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
: Detail untuk perangkat ini telah berubah.
Lihat dokumentasi WifiP2pManager
untuk mengetahui informasi selengkapnya. Selain itu,
lihat
Demo P2P Wi-Fi
contoh aplikasi.
Perangkat Kesehatan Bluetooth
Android kini mendukung perangkat Profil Kesehatan Bluetooth, sehingga Anda dapat membuat aplikasi yang menggunakan Bluetooth untuk berkomunikasi dengan perangkat kesehatan yang mendukung Bluetooth, seperti monitor detak jantung, pengukur darah, termometer, dan timbangan.
Serupa dengan headset biasa dan perangkat profil A2DP, Anda harus memanggil getProfileProxy()
dengan BluetoothProfile.ServiceListener
dan jenis profil HEALTH
untuk terhubung dengan profil
objek proxy-nya.
Setelah Anda mendapatkan proxy Profil Kesehatan (BluetoothHealth
), menghubungkan dan berkomunikasi dengan perangkat kesehatan yang disambungkan melibatkan
Class Bluetooth:
BluetoothHealthCallback
: Anda harus memperluas class ini dan menerapkan metode metode callback untuk menerima pembaruan tentang perubahan status pendaftaran aplikasi dan Status saluran Bluetooth.BluetoothHealthAppConfiguration
: Selama callback keBluetoothHealthCallback
, Anda akan menerima instance objek ini, yang menyediakan informasi konfigurasi tentang perangkat kesehatan Bluetooth yang tersedia, yang harus Anda gunakan untuk melakukan berbagai operasi seperti memulai dan mengakhiri koneksi denganBluetoothHealth
API.
Untuk informasi selengkapnya tentang menggunakan Profil Kesehatan Bluetooth, lihat dokumentasi untuk BluetoothHealth
.
Aksesibilitas
Android 4.0 meningkatkan aksesibilitas bagi pengguna yang memiliki gangguan penglihatan dengan mode klik untuk info baru dan API tambahan yang memungkinkan Anda menyediakan informasi selengkapnya tentang cara melihat materi atau mengembangkan layanan aksesibilitas lanjutan.
Mode Jelajahi dengan Sentuhan
Pengguna yang kehilangan penglihatan kini dapat menjelajahi layar dengan menyentuh dan menyeret jari di sepanjang
layar untuk mendengar deskripsi suara konten. Karena mode jelajahi-demi-sentuh bekerja seperti
kursor virtual, memungkinkan pembaca layar untuk mengidentifikasi teks deskriptif dengan cara yang sama seperti layar
dapat dilakukan pembaca saat pengguna melakukan navigasi dengan d-pad atau trackball—dengan membaca informasi yang
oleh android:contentDescription
dan setContentDescription()
pada simulasi "kursor" peristiwa. Jadi,
menganggap ini sebagai pengingat bahwa Anda harus menyediakan teks deskriptif untuk tampilan di
aplikasi, terutama untuk ImageButton
, EditText
,
ImageView
dan widget lain yang mungkin tidak secara alami berisi deskripsi
teks.
Aksesibilitas untuk tampilan
Untuk meningkatkan informasi yang tersedia untuk layanan aksesibilitas seperti pembaca layar, Anda dapat
mengimplementasikan metode callback baru untuk peristiwa aksesibilitas dalam komponen View
kustom Anda.
Penting untuk diperhatikan terlebih dahulu bahwa perilaku metode sendAccessibilityEvent()
telah berubah di Android
4.0. Seperti Android versi sebelumnya, saat pengguna mengaktifkan layanan aksesibilitas di perangkat
dan peristiwa input seperti klik atau pengarahan kursor terjadi, tampilan masing-masing akan diberi tahu dengan panggilan ke
sendAccessibilityEvent()
. Sebelumnya,
implementasi sendAccessibilityEvent()
akan
melakukan inisialisasi AccessibilityEvent
dan mengirimkannya ke AccessibilityManager
. Perilaku baru ini melibatkan beberapa callback tambahan
yang memungkinkan tampilan dan induknya untuk menambahkan lebih banyak informasi kontekstual ke peristiwa:
- Saat dipanggil, metode
sendAccessibilityEvent()
dansendAccessibilityEventUnchecked()
akan menunda keonInitializeAccessibilityEvent()
.Implementasi kustom
View
mungkin ingin menerapkanonInitializeAccessibilityEvent()
untuk melampirkan informasi aksesibilitas tambahan keAccessibilityEvent
, tetapi juga harus memanggil implementasi super untuk menyediakan informasi default seperti deskripsi konten standar, indeks item, dan banyak lagi. Namun, Anda tidak boleh menambahkan konten teks tambahan dalam callback ini—yang akan terjadi berikutnya. - Setelah diinisialisasi, jika peristiwa adalah salah satu dari beberapa jenis yang harus diisi dengan teks
informasi tambahan, tampilan akan menerima panggilan ke
dispatchPopulateAccessibilityEvent()
, yang akan mengalihkan keonPopulateAccessibilityEvent()
.Implementasi kustom
View
biasanya harus menerapkanonPopulateAccessibilityEvent()
untuk menambahkan konten teks keAccessibilityEvent
jika teksandroid:contentDescription
tidak ada atau tidak mencukupi. Untuk menambahkan lebih banyak deskripsi teks keAccessibilityEvent
, panggilgetText()
.add()
. - Pada tahap ini,
View
akan meneruskan peristiwa ke atas hierarki tampilan dengan memanggilrequestSendAccessibilityEvent()
pada dan tampilan orang tua. Setiap tampilan induk memiliki kesempatan untuk menambah informasi aksesibilitas dengan menambahkanAccessibilityRecord
, sampai akhirnya mencapai tampilan root, yang mengirimkan peristiwa keAccessibilityManager
dengansendAccessibilityEvent()
.
Selain metode baru di atas, yang berguna saat memperluas class View
, Anda juga dapat menangkap callback peristiwa ini di View
dengan memperluas AccessibilityDelegate
dan menyetelnya pada tampilan menggunakan
setAccessibilityDelegate()
.
Bila Anda melakukannya, setiap metode aksesibilitas dalam tampilan akan menunda panggilan ke metode terkait
delegasi tersebut. Misalnya, saat menerima panggilan ke onPopulateAccessibilityEvent()
, tampilan akan meneruskannya ke
metode yang sama dalam View.AccessibilityDelegate
. Setiap metode yang
tidak ditangani oleh
delegasi dikembalikan ke tampilan
untuk melihat perilaku {i>default<i}. Ini memungkinkan Anda
untuk mengganti
metode yang diperlukan untuk tampilan tertentu tanpa memperluas class View
.
Jika Anda ingin mempertahankan kompatibilitas dengan versi Android sebelum 4.0, sekaligus mendukung API aksesibilitas yang baru, Anda dapat melakukannya dengan dukungan v4 versi terbaru library (dalam Paket Kompatibilitas, r4) menggunakan seperangkat class utilitas yang menyediakan API aksesibilitas baru dalam desain.
Layanan aksesibilitas
Jika Anda mengembangkan layanan aksesibilitas, informasi tentang berbagai peristiwa aksesibilitas telah diperluas secara signifikan untuk memungkinkan masukan aksesibilitas yang lebih canggih bagi pengguna. Di beberapa khususnya, peristiwa dihasilkan berdasarkan komposisi tampilan, sehingga memberikan informasi konteks dan memungkinkan layanan aksesibilitas untuk melintasi hierarki tampilan untuk mendapatkan informasi tampilan tambahan dan menangani kasus khusus.
Jika Anda mengembangkan layanan aksesibilitas (seperti pembaca layar), Anda dapat mengakses informasi konten tambahan dan hierarki tampilan lintas dengan prosedur berikut:
- Setelah menerima
AccessibilityEvent
dari aplikasi, panggilAccessibilityEvent.getRecord()
untuk mengambilAccessibilityRecord
tertentu (mungkin ada beberapa data yang dilampirkan ke peristiwa). - Dari
AccessibilityEvent
atauAccessibilityRecord
individual, Anda dapat memanggilgetSource()
untuk mengambil objekAccessibilityNodeInfo
.AccessibilityNodeInfo
mewakili node tunggal konten jendela dalam format yang memungkinkan Anda untuk meminta informasi aksesibilitas tentang {i>node<i}. ObjekAccessibilityNodeInfo
yang ditampilkan dariAccessibilityEvent
mendeskripsikan sumber peristiwa, sedangkan sumber dariAccessibilityRecord
menjelaskan pendahulu peristiwa sumber. - Dengan
AccessibilityNodeInfo
, Anda dapat mengkueri informasi tentang peristiwa tersebut, panggilgetParent()
ataugetChild()
untuk melintasi tampilan hierarki, dan bahkan menambahkan tampilan turunan ke node.
Agar aplikasi Anda mempublikasikan dirinya ke sistem sebagai layanan aksesibilitas,
harus mendeklarasikan file konfigurasi XML yang sesuai dengan AccessibilityServiceInfo
. Untuk informasi selengkapnya tentang cara membuat
layanan aksesibilitas, lihat AccessibilityService
dan SERVICE_META_DATA
untuk mengetahui informasi tentang konfigurasi XML.
API aksesibilitas lainnya
Jika Anda tertarik dengan status aksesibilitas perangkat, AccessibilityManager
memiliki beberapa API baru seperti:
AccessibilityManager.AccessibilityStateChangeListener
adalah antarmuka yang memungkinkan Anda menerima callback setiap kali aksesibilitas diaktifkan atau dinonaktifkan.getEnabledAccessibilityServiceList()
memberikan informasi tentang layanan aksesibilitas yang saat ini diaktifkan.isTouchExplorationEnabled()
memberi tahu apakah mode jelajahi dengan sentuh diaktifkan.
Layanan Pemeriksa Ejaan
Kerangka kerja pemeriksa ejaan baru memungkinkan aplikasi membuat pemeriksa ejaan dengan cara yang mirip dengan
framework metode input (untuk IME). Untuk membuat pemeriksa ejaan baru, Anda harus mengimplementasikan layanan yang
memperluas
SpellCheckerService
dan perluas class SpellCheckerService.Session
untuk memberikan saran ejaan
pada teks yang disediakan oleh metode callback antarmuka. Dalam metode callback SpellCheckerService.Session
, Anda harus menampilkan metode
saran ejaan sebagai objek SuggestionsInfo
.
Aplikasi dengan layanan pemeriksa ejaan harus menyatakan izin BIND_TEXT_SERVICE
sebagaimana yang diwajibkan oleh layanan.
Layanan juga harus mendeklarasikan filter intent dengan <action
android:name="android.service.textservice.SpellCheckerService" />
sebagai tindakan intent dan harus
menyertakan elemen <meta-data>
yang mendeklarasikan informasi konfigurasi untuk ejaan tersebut
pemeriksa.
Lihat contoh Layanan Pemeriksa Ejaan dan contoh Aplikasi Klien Pemeriksa Ejaan untuk kode contoh.
Mesin Text-to-speech
API text-to-speech (TTS) Android telah diperluas secara signifikan untuk memungkinkan aplikasi lebih mudah menerapkan mesin TTS kustom, sedangkan aplikasi yang ingin menggunakan mesin TTS memiliki beberapa API baru untuk memilih engine.
Menggunakan mesin text-to-speech
Di Android versi sebelumnya, Anda dapat menggunakan class TextToSpeech
untuk melakukan operasi text-to-speech (TTS) menggunakan mesin TTS yang disediakan oleh sistem atau menyetel
mesin kustom menggunakan setEngineByPackageName()
. Di Android 4.0, metode setEngineByPackageName()
telah
tidak digunakan lagi dan kini Anda dapat menentukan mesin yang akan digunakan dengan konstruktor TextToSpeech
baru yang menerima nama paket mesin TTS.
Anda juga dapat membuat kueri mesin TTS yang tersedia dengan getEngines()
. Metode ini menampilkan daftar objek TextToSpeech.EngineInfo
, yang menyertakan metadata seperti metadata
ikon, label, dan nama paket.
Membuat mesin text-to-speech
Sebelumnya, mesin kustom mewajibkan mesin dibuat menggunakan header native yang tidak terdokumentasi . Di Android 4.0, ada set lengkap API framework untuk membangun mesin TTS.
Penyiapan dasar memerlukan implementasi TextToSpeechService
yang
akan merespons intent INTENT_ACTION_TTS_SERVICE
. Tujuan
pekerjaan utama untuk mesin TTS terjadi selama callback onSynthesizeText()
dalam layanan
yang memperluas TextToSpeechService
. Sistem mengirimkan metode ini dua
objek:
SynthesisRequest
: Elemen ini berisi berbagai data termasuk teks yang melakukan sintesis, lokal, kecepatan bicara, dan tinggi nada suara.SynthesisCallback
: Ini adalah antarmuka yang digunakan mesin TTS Anda memberikan data ucapan yang dihasilkan sebagai audio streaming. Pertama, mesin harus memanggilstart()
untuk menunjukkan bahwa mesin siap dikirim audio, lalu panggilaudioAvailable()
, meneruskan data audio dalam buffer byte. Setelah mesin Anda meneruskan semua audio melalui buffer, panggildone()
.
Setelah framework mendukung API sejati untuk membuat mesin TTS, dukungan untuk kode native telah dihapus. Cari postingan blog tentang lapisan kompatibilitas yang dapat digunakan untuk mengonversi mesin TTS lama ke framework baru.
Untuk contoh mesin TTS yang menggunakan API baru, lihat aplikasi contoh Text To Speech Engine.
Penggunaan Jaringan
Android 4.0 memberikan visibilitas yang akurat kepada pengguna terkait banyaknya data jaringan yang digunakan aplikasi mereka. Aplikasi Setelan menyediakan kontrol yang memungkinkan pengguna mengelola batas yang telah ditetapkan untuk penggunaan data jaringan dan bahkan menonaktifkan penggunaan data latar belakang untuk masing-masing aplikasi. Untuk menghindari pengguna menonaktifkan akses aplikasi ke data dari latar belakang, Anda harus mengembangkan strategi untuk menggunakan koneksi secara efisien dan menyesuaikan penggunaan Anda tergantung pada jenis koneksi yang tersedia.
Jika aplikasi Anda melakukan banyak transaksi jaringan, Anda harus menyediakan pengaturan pengguna yang
memungkinkan pengguna mengontrol kebiasaan data aplikasi Anda, seperti seberapa sering aplikasi menyinkronkan data, apakah
melakukan unggahan/download hanya saat terhubung ke Wi-Fi, apakah akan menggunakan data saat roaming, dll. Dengan
yang tersedia bagi mereka, kemungkinan besar pengguna
menonaktifkan akses aplikasi Anda ke data ketika
aplikasi Anda mendekati batasnya, karena justru dapat mengontrol dengan tepat berapa banyak data yang digunakan aplikasi Anda.
Jika Anda menyediakan aktivitas preferensi dengan setelan ini, Anda harus menyertakan dalam manifesnya
mendeklarasikan filter intent untuk ACTION_MANAGE_NETWORK_USAGE
tindakan. Contoh:
<activity android:name="DataPreferences" android:label="@string/title_preferences"> <intent-filter> <action android:name="android.intent.action.MANAGE_NETWORK_USAGE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Filter intent ini menunjukkan kepada sistem bahwa ini adalah aktivitas yang mengontrol penggunaan data aplikasi. Jadi, saat pengguna memeriksa seberapa banyak data yang digunakan aplikasi Anda dari Aplikasi setelan, “Melihat setelan aplikasi" tersedia yang meluncurkan preferensi Anda sehingga pengguna dapat menyaring berapa banyak data yang digunakan aplikasi Anda.
Selain itu, berhati-hatilah karena getBackgroundDataSetting()
sekarang
tidak digunakan lagi dan selalu menampilkan true—gunakan getActiveNetworkInfo()
sebagai gantinya. Sebelum Anda mencoba jaringan apa pun
transaksi, Anda harus selalu memanggil getActiveNetworkInfo()
untuk mendapatkan NetworkInfo
yang mewakili jaringan saat ini dan mengkueri isConnected()
untuk memeriksa apakah perangkat memiliki
koneksi jarak jauh. Kemudian, Anda dapat memeriksa properti koneksi lainnya,
roaming atau terhubung ke Wi-Fi.
Enterprise
Android 4.0 memperluas kemampuan aplikasi perusahaan dengan fitur berikut.
Layanan VPN
VpnService
baru memungkinkan aplikasi mem-build VPN-nya sendiri (Virtual
Jaringan Pribadi), berjalan sebagai Service
. Layanan VPN membuat
antarmuka untuk
jaringan virtual dengan alamat dan aturan {i>routing<i}-nya sendiri dan melakukan semua pembacaan dan penulisan dengan
deskriptor file.
Untuk membuat layanan VPN, gunakan VpnService.Builder
, yang memungkinkan Anda menentukan
alamat jaringan, server DNS, rute jaringan, dan banyak lagi. Setelah selesai, Anda dapat menetapkan
antarmuka dengan memanggil establish()
, yang menampilkan ParcelFileDescriptor
.
Karena layanan VPN dapat mencegat paket, terdapat implikasi keamanan. Dengan demikian, jika Anda
implementasikan VpnService
, maka layanan Anda harus memerlukan BIND_VPN_SERVICE
untuk memastikan bahwa hanya sistem yang dapat mengikatnya (hanya
sistem diberi izin ini—aplikasi tidak dapat memintanya). Kemudian, untuk menggunakan
layanan VPN Anda,
pengguna harus mengaktifkannya secara
manual dalam pengaturan sistem.
Kebijakan perangkat
Aplikasi yang mengelola batasan perangkat kini dapat menonaktifkan kamera menggunakan setCameraDisabled()
dan properti USES_POLICY_DISABLE_CAMERA
(diterapkan dengan elemen <disable-camera />
di file konfigurasi kebijakan).
Pengelolaan sertifikat
Class KeyChain
yang baru menyediakan API yang memungkinkan Anda mengimpor dan mengakses
sertifikat di penyimpanan kunci sistem. Sertifikat menyederhanakan
penginstalan klien
sertifikat (untuk memvalidasi identitas pengguna) dan sertifikat otoritas sertifikat (untuk
memverifikasi identitas server). Aplikasi seperti browser web atau program email dapat mengakses
sertifikat untuk mengotentikasi
pengguna ke server. Lihat KeyChain
dokumentasi untuk informasi selengkapnya.
Sensor Perangkat
Dua jenis sensor baru telah ditambahkan di Android 4.0:
TYPE_AMBIENT_TEMPERATURE
: Sensor suhu yang memberikan suhu sekitar (kamar) dalam derajat Celsius.TYPE_RELATIVE_HUMIDITY
: Sensor kelembapan yang menyediakan kelembapan relatif (ruangan) dalam persentase.
Jika perangkat memiliki sensor TYPE_AMBIENT_TEMPERATURE
dan TYPE_RELATIVE_HUMIDITY
, Anda dapat menggunakannya untuk menghitung titik embun
dan kelembapan absolut.
Sensor suhu sebelumnya, TYPE_TEMPERATURE
, telah
tidak digunakan lagi. Sebaiknya gunakan sensor TYPE_AMBIENT_TEMPERATURE
sebagai gantinya.
Selain itu, tiga sensor sintetis Android telah ditingkatkan secara signifikan sehingga kini memiliki
latensinya & output yang lebih halus. Sensor ini meliputi sensor gravitasi (TYPE_GRAVITY
), sensor vektor rotasi (TYPE_ROTATION_VECTOR
), dan sensor akselerasi linear (TYPE_LINEAR_ACCELERATION
). Peningkatan sensor mengandalkan giroskop
sensor untuk meningkatkan outputnya, sehingga sensor hanya muncul pada perangkat yang memiliki giroskop.
Panel Tindakan
ActionBar
telah diupdate untuk mendukung beberapa perilaku baru. Paling sering
yang penting, sistem mengelola ukuran dan konfigurasi bilah tindakan dengan baik saat berjalan di
layar yang lebih kecil untuk memberikan
pengalaman pengguna yang optimal di semua ukuran layar. Misalnya,
ketika layar sempit (misalnya ketika handset dalam orientasi potret), bilah tindakan
tab navigasi muncul dalam “{i>stacked bar<i}”, yang muncul tepat di bawah bilah tindakan utama. Anda dapat
juga ikut serta dalam “bilah tindakan terpisah", yang menempatkan semua item tindakan dalam panel terpisah di bagian bawah
pada layar saat layar sempit.
Panel tindakan terpisah
Jika bilah tindakan Anda berisi beberapa item tindakan, tidak semuanya sesuai dengan bilah tindakan di
layar yang sempit, jadi sistem akan menempatkan lebih
banyak lagi halaman itu dalam menu tambahan. Namun, Android 4.0
memungkinkan Anda mengaktifkan "bilah tindakan terpisah" sehingga lebih banyak item tindakan
dapat muncul di layar dalam
bilah terpisah di bagian bawah layar. Untuk mengaktifkan panel tindakan pemisahan, tambahkan android:uiOptions
dengan "splitActionBarWhenNarrow"
ke
<application>
menandai atau
tag <activity>
individual
dalam file manifes. Jika diaktifkan, sistem akan menambahkan panel tambahan di bagian bawah
layar untuk semua item tindakan saat layar sempit (tidak ada item tindakan yang akan muncul di
panel tindakan).
Jika ingin menggunakan tab navigasi yang disediakan oleh ActionBar.Tab
API,
namun tidak memerlukan bilah tindakan utama di bagian atas (Anda hanya ingin tab muncul di bagian atas), lalu aktifkan
panel tindakan pemisahan seperti yang dijelaskan di atas dan juga memanggil setDisplayShowHomeEnabled(false)
untuk menonaktifkan
ikon aplikasi di bilah tindakan. Dengan tidak ada yang tersisa di bilah tindakan utama,
menghilang—yang tersisa hanyalah tab navigasi di bagian atas dan item tindakan di
di bagian bawah layar.
Gaya panel tindakan
Jika ingin menerapkan gaya visual kustom ke panel tindakan, Anda dapat menggunakan properti gaya baru backgroundStacked
dan backgroundSplit
untuk menerapkan latar belakang
drawable atau warna masing-masing ke batang bertumpuk dan batang pemisah. Anda juga dapat menetapkan {i>style<i} ini di
runtime dengan setStackedBackgroundDrawable()
dan setSplitBackgroundDrawable()
.
Penyedia tindakan
Class ActionProvider
baru memungkinkan Anda membuat pengendali khusus untuk
item tindakan. Penyedia tindakan dapat menentukan tampilan tindakan, perilaku tindakan default, dan submenu
untuk setiap item tindakan yang terkait. Saat Anda ingin membuat item tindakan yang memiliki
perilaku dinamis (seperti tampilan tindakan variabel, tindakan default, atau submenu), memperluas ActionProvider
adalah solusi yang baik untuk membuat komponen yang dapat digunakan kembali, daripada
menangani berbagai transformasi item tindakan dalam fragmen atau aktivitas Anda.
Misalnya, ShareActionProvider
adalah ekstensi dari ActionProvider
yang memfasilitasi "bagikan" tindakan dari panel tindakan. Daripada menggunakan
item tindakan tradisional yang memanggil intent ACTION_SEND
, Anda dapat
menggunakan penyedia tindakan ini untuk menyajikan tampilan tindakan dengan daftar drop-down aplikasi yang menangani
intent ACTION_SEND
. Saat pengguna memilih aplikasi yang akan digunakan
untuk tindakan tersebut, ShareActionProvider
akan mengingat pilihan itu dan memberikannya
di tampilan tindakan untuk akses lebih cepat
ke berbagi dengan aplikasi tersebut.
Guna mendeklarasikan penyedia tindakan untuk item tindakan, sertakan android:actionProviderClass
di elemen <item>
untuk menu opsi aktivitas Anda, dengan nama class tindakan
provider sebagai nilai. Contoh:
<item android:id="@+id/menu_share" android:title="Share" android:showAsAction="ifRoom" android:actionProviderClass="android.widget.ShareActionProvider" />
Di onCreateOptionsMenu()
aktivitas Anda
, ambil instance penyedia tindakan dari item menu dan atur
intent:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.options, menu) val shareActionProvider = menu.findItem(R.id.menu_share)?.actionProvider as? ShareActionProvider // Set the share intent of the share action provider. shareActionProvider?.setShareIntent(createShareIntent()) ... return super.onCreateOptionsMenu(menu) }
Java
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.options, menu); ShareActionProvider shareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider(); // Set the share intent of the share action provider. shareActionProvider.setShareIntent(createShareIntent()); ... return super.onCreateOptionsMenu(menu); }
Untuk contoh penggunaan ShareActionProvider
, lihat ViewGroupShareActionProviderActivity di ApiDemos.
Tampilan tindakan yang dapat diciutkan
Item tindakan yang menyediakan tampilan tindakan sekarang dapat beralih antara status tampilan tindakannya dan
status item tindakan tradisional. Sebelumnya, hanya SearchView
yang didukung
diciutkan bila digunakan sebagai tampilan aksi, namun sekarang Anda bisa menambah tampilan aksi untuk item aksi dan
beralih antara status diperluas (tampilan tindakan terlihat) dan status diciutkan (item tindakan
terlihat).
Untuk mendeklarasikan bahwa item tindakan yang berisi tampilan tindakan dapat diciutkan, sertakan tanda “collapseActionView"
dalam atribut android:showAsAction
untuk elemen <item>
di file XML menu.
Untuk menerima callback saat tampilan tindakan beralih antara diperluas dan diciutkan, daftarkan
instance MenuItem.OnActionExpandListener
dengan MenuItem
masing-masing dengan memanggil setOnActionExpandListener()
. Biasanya, Anda harus melakukannya selama callback onCreateOptionsMenu()
.
Untuk mengontrol tampilan tindakan yang dapat diciutkan, Anda dapat memanggil collapseActionView()
dan expandActionView()
di
MenuItem
masing-masing.
Saat membuat tampilan tindakan kustom, Anda juga dapat menerapkan antarmuka CollapsibleActionView
baru untuk menerima callback saat tampilan diperluas dan
diciutkan.
API lain untuk panel tindakan
setHomeButtonEnabled()
memungkinkan Anda menentukan apakah ikon/logo berperilaku sebagai tombol untuk menavigasi ke beranda atau ke "atas" (berikan "true" untuk membuatnya berperilaku sebagai tombol).setIcon()
dansetLogo()
memungkinkan Anda menentukan ikon atau logo panel tindakan saat runtime.Fragment.setMenuVisibility()
memungkinkan Anda mengaktifkan atau menonaktifkan visibilitas item menu opsi yang dideklarasikan oleh fragmen. Hal ini berguna jika telah ditambahkan ke aktivitas, namun tidak terlihat, sehingga item menu harus disembunyikan.FragmentManager.invalidateOptionsMenu()
memungkinkan Anda membatalkan menu opsi aktivitas selama berbagai status siklus proses fragmen yang mungkin tidak tersedia jika menggunakan metode yang setara dariActivity
.
Antarmuka Pengguna dan Tampilan
Android 4.0 memperkenalkan berbagai tampilan baru dan komponen UI lainnya.
GridLayout
GridLayout
adalah kelompok tampilan baru yang menempatkan tampilan turunan dalam persegi panjang
{i>grid.<i} Tidak seperti TableLayout
, GridLayout
bergantung pada
hierarki dan tidak menggunakan tampilan tengah seperti baris tabel untuk menyediakan struktur.
Sebaliknya, turunan menentukan baris dan kolom mana yang harus mereka tempati (sel dapat menjangkau beberapa
baris dan/atau kolom), dan secara default ditata secara berurutan di seluruh baris dan kolom {i>grid<i}.
Orientasi GridLayout
menentukan apakah turunan berurutan menggunakan
{i>default<i} yang ditata secara
horizontal atau vertikal. Ruang antar-turunan dapat ditentukan dengan menggunakan
instance tampilan Space
baru atau dengan menetapkan parameter margin yang relevan
terhadap anak-anak.
Lihat ApiDemos
untuk contoh menggunakan GridLayout
.
TextureView
TextureView
adalah tampilan baru yang memungkinkan Anda menampilkan streaming konten, seperti
sebagai video atau adegan OpenGL. Meskipun mirip dengan SurfaceView
, TextureView
bersifat unik karena berperilaku seperti tampilan reguler, bukan membuat
jendela terpisah, sehingga Anda dapat memperlakukannya seperti objek View
lainnya. Misalnya,
Anda dapat menerapkan transformasi, menganimasikannya menggunakan ViewPropertyAnimator
, atau
menyesuaikan opasitasnya dengan setAlpha()
.
Perlu diketahui bahwa TextureView
hanya berfungsi dalam jendela dengan akselerasi hardware.
Untuk mengetahui informasi selengkapnya, lihat dokumentasi TextureView
.
Ganti widget
Widget Switch
baru adalah tombol dua status yang dapat ditarik oleh pengguna ke salah satu status
sisi atau status lainnya (atau cukup ketuk) untuk beralih opsi antara dua status.
Anda dapat menggunakan atribut android:textOn
dan android:textOff
untuk menentukan teks
muncul di {i>switch<i} ketika berada
dalam pengaturan aktif dan nonaktif. Atribut android:text
juga
memungkinkan Anda menempatkan label di samping {i>switch<i}.
Untuk contoh penggunaan switch, lihat file tata letak switches.xml dan Tombol masing-masing aktivitas Anda.
Menu popup
Android 3.0 memperkenalkan PopupMenu
untuk membuat menu kontekstual pendek yang menarik
ke titik link yang Anda tentukan (biasanya pada titik item yang dipilih). Android 4.0 memperluas
PopupMenu
dengan beberapa fitur berguna:
- Anda sekarang dapat dengan mudah meng-inflate konten menu pop-up dari resource menu XML dengan
inflate()
, dengan meneruskan ID resource menu ke dalamnya. - Sekarang Anda juga dapat membuat
PopupMenu.OnDismissListener
yang menerima jika menu ditutup.
Preferensi
Class abstrak TwoStatePreference
baru berfungsi sebagai dasar untuk
preferensi yang menyediakan opsi pemilihan dua status. SwitchPreference
baru adalah ekstensi dari TwoStatePreference
yang menyediakan widget Switch
di
tampilan preferensi yang memungkinkan pengguna untuk mengaktifkan atau menonaktifkan setelan tanpa perlu membuka
dialog atau layar preferensi. Misalnya, aplikasi Setelan menggunakan SwitchPreference
untuk setelan Wi-Fi dan Bluetooth.
Tema sistem
Tema default untuk semua aplikasi yang menargetkan Android 4.0 (dengan menyetel targetSdkVersion
atau
minSdkVersion
ke
“14"
atau yang lebih tinggi) sekarang menjadi
"default perangkat" tema: Theme.DeviceDefault
. Mungkin ini adalah
tema Holo gelap atau tema gelap berbeda
yang ditentukan oleh perangkat tertentu.
Kelompok tema Theme.Holo
dijamin tidak akan berubah
dari satu perangkat ke perangkat lain saat menjalankan versi Android yang sama. Jika Anda secara eksplisit
menerapkan salah satu tema Theme.Holo
ke aktivitas, Anda dapat
yakinlah bahwa tema ini tidak akan mengubah karakter di perangkat lain dalam
versi platform.
Jika ingin aplikasi Anda menyatu dengan tema perangkat secara keseluruhan (seperti saat OEM yang berbeda
menyediakan tema default yang berbeda untuk sistem), Anda harus secara eksplisit menerapkan tema dari kelompok Theme.DeviceDefault
.
Tombol menu opsi
Mulai Android 4.0, Anda akan mendapati bahwa handset tidak lagi memerlukan tombol Perangkat keras Menu. Namun, Anda tidak perlu mengkhawatirkan hal ini jika aplikasi yang ada menyediakan menu opsi dan mengharapkan adanya Tombol menu. Untuk memastikan aplikasi yang ada terus berfungsi seperti yang diharapkan, sistem menyediakan tombol Menu di layar untuk aplikasi yang dirancang untuk versi Android lama.
Untuk pengalaman pengguna terbaik, aplikasi baru dan yang diupdate harus menggunakan ActionBar
untuk memberikan akses ke item menu dan menyetel targetSdkVersion
ke
"14"
untuk memanfaatkan perilaku default framework terbaru.
Kontrol untuk visibilitas UI sistem
Sejak awal Android, sistem telah mengelola komponen UI yang dikenal sebagai status , yang berada di bagian atas perangkat handset untuk mengirimkan informasi seperti informasi sinyal, waktu, notifikasi, dan sebagainya. Android 3.0 menambahkan kolom sistem untuk tablet yang berada di bagian bawah layar untuk memberikan kontrol navigasi sistem (Rumah, Kembali, dan sebagainya) serta antarmuka untuk elemen yang biasanya disediakan oleh status bar. Di beberapa Android 4.0, sistem menyediakan jenis UI sistem baru yang disebut menu navigasi. Anda mungkin menganggap bilah navigasi sebagai versi bilah sistem yang dirancang ulang untuk handset—menyediakan kontrol navigasi untuk perangkat yang tidak memiliki perangkat keras untuk menavigasi sistem, tetapi tidak menggunakan UI notifikasi bilah sistem dan kontrol setelan. Dengan demikian, perangkat yang menyediakan navigasi juga memiliki bilah status di bagian atas.
Hingga hari ini, Anda dapat menyembunyikan status bar pada handset menggunakan tanda FLAG_FULLSCREEN
. Di Android 4.0, API yang mengontrol
visibilitas bilah sistem telah diperbarui untuk lebih mencerminkan perilaku bilah sistem
dan bilah navigasi:
- Flag
SYSTEM_UI_FLAG_LOW_PROFILE
menggantikan flagSTATUS_BAR_HIDDEN
. Jika disetel, tanda ini akan mengaktifkan “profil rendah" untuk bilah sistem atau di bilah navigasi sebelah atas. Tombol navigasi meredup dan elemen lain di bilah sistem juga disembunyikan. Mengaktifkan Hal ini berguna untuk membuat game yang lebih imersif tanpa mengganggu navigasi sistem tombol. - Flag
SYSTEM_UI_FLAG_VISIBLE
menggantikan flagSTATUS_BAR_VISIBLE
untuk meminta bilah sistem atau menu navigasi terlihat. SYSTEM_UI_FLAG_HIDE_NAVIGATION
adalah flag baru yang meminta {i>navigation bar<i} akan benar-benar tersembunyi. Perlu diketahui bahwa setelan ini hanya berfungsi untuk menu navigasi digunakan oleh beberapa handset (tidak menyembunyikan kolom sistem pada tablet). Navigasi kembali ke tampilan segera setelah sistem menerima input pengguna. Oleh karena itu, mode ini berguna terutama untuk pemutaran video atau kasus lain di mana seluruh layar diperlukan tetapi input pengguna tidak diperlukan.
Anda dapat menetapkan masing-masing tanda ini untuk kolom sistem dan menu navigasi dengan memanggil setSystemUiVisibility()
di tampilan mana pun dalam aktivitas Anda. Tujuan
pengelola jendela menggabungkan (OR-bersama-sama) semua tanda dari semua tampilan di jendela Anda dan
menerapkannya ke UI sistem selama jendela memiliki fokus input. Saat jendela kehilangan input
fokus (pengguna keluar dari aplikasi Anda, atau dialog muncul), flag Anda tidak lagi berfungsi.
Demikian pula, jika Anda menghapus tampilan tersebut dari hierarki tampilan, flag tidak akan berlaku lagi.
Untuk menyinkronkan kejadian lain dalam aktivitas Anda dengan perubahan visibilitas pada UI sistem (untuk
menyembunyikan bilah tindakan atau kontrol UI lain saat UI sistem disembunyikan), Anda harus mendaftarkan
View.OnSystemUiVisibilityChangeListener
untuk diberi tahu saat visibilitas
dari perubahan bilah sistem
atau {i>navigation bar<i}.
Lihat OverscanActivity untuk demonstrasi berbagai opsi UI sistem.
Framework Input
Android 4.0 menambahkan dukungan untuk peristiwa pengarahan kursor kursor serta peristiwa tombol mouse dan stilus baru.
Peristiwa pengarahan kursor
Class View
kini mendukung "kursor" peristiwa untuk memungkinkan interaksi yang lebih beragam
melalui penggunaan perangkat {i>pointer<i} (seperti {i>mouse<i} atau perangkat lain yang menggerakkan sebuah layar
kursor).
Untuk menerima peristiwa pengarahan kursor pada tampilan, terapkan View.OnHoverListener
dan
mendaftarkannya ke setOnHoverListener()
. Saat mengarahkan kursor
terjadi pada tampilan, pemroses akan menerima panggilan ke onHover()
, menyediakan View
yang
menerima peristiwa dan MotionEvent
yang menjelaskan jenis peristiwa pengarahan kursor
yang terjadi. Peristiwa pengarahan kursor dapat berupa salah satu dari hal berikut:
View.OnHoverListener
akan menampilkan benar (true) dari onHover()
jika menangani peristiwa pengarahan kursor. Jika
mengembalikan false, maka peristiwa pengarahan kursor akan dikirim ke tampilan induk seperti biasa.
Jika aplikasi Anda menggunakan tombol atau widget lain yang mengubah tampilannya berdasarkan
status saat ini, Anda kini dapat menggunakan atribut android:state_hovered
dalam drawable daftar status untuk
menyediakan drawable latar belakang yang berbeda saat kursor diarahkan ke tampilan.
Untuk demonstrasi peristiwa pengarahan kursor baru, lihat kelas Hover di ApiDemos.
Peristiwa stilus dan tombol mouse
Android kini menyediakan API untuk menerima input dari perangkat input stilus seperti digitizer periferal tablet atau layar sentuh yang mendukung stilus.
Input stilus beroperasi dengan cara yang serupa dengan input sentuh atau mouse. Saat stilus bersentuhan dengan digitizer, aplikasi menerima peristiwa sentuh sama seperti ketika jari digunakan untuk sentuh layar. Saat stilus ditaruh di atas digitizer, aplikasi akan menerima pengarahan kursor peristiwa yang sama seperti ketika kursor mouse dipindahkan melintasi layar ketika tidak ada tombol ditekan.
Aplikasi Anda dapat membedakan antara input jari, mouse, stilus, dan penghapus dengan membuat kueri
"jenis alat" yang dikaitkan dengan setiap pointer di MotionEvent
menggunakan getToolType()
. Jenis alat yang saat ini ditetapkan adalah: TOOL_TYPE_UNKNOWN
, TOOL_TYPE_FINGER
,
TOOL_TYPE_MOUSE
, TOOL_TYPE_STYLUS
,
dan TOOL_TYPE_ERASER
. Dengan membuat kueri jenis alat, aplikasi Anda
dapat memilih untuk menangani input stilus dengan berbagai cara dari input jari atau mouse.
Aplikasi Anda juga dapat mengkueri tombol mouse atau stilus mana yang ditekan dengan membuat kueri “tombol
negara bagian" dari MotionEvent
menggunakan getButtonState()
. Status tombol yang saat ini ditentukan adalah: BUTTON_PRIMARY
, BUTTON_SECONDARY
, BUTTON_TERTIARY
, BUTTON_BACK
, dan BUTTON_FORWARD
. Untuk memudahkan, tombol mouse
mundur dan maju
otomatis dipetakan ke kunci KEYCODE_BACK
dan KEYCODE_FORWARD
. Aplikasi Anda dapat menangani
kunci ini untuk mendukung
tombol mouse berdasarkan navigasi mundur dan maju.
Selain mengukur posisi dan tekanan kontak secara akurat, beberapa input stilus
juga melaporkan jarak antara ujung stilus dan digitizer, sudut kemiringan stilus,
dan sudut orientasi stilus. Aplikasi Anda dapat mengkueri informasi ini menggunakan getAxisValue()
dengan kode sumbu AXIS_DISTANCE
, AXIS_TILT
, dan AXIS_ORIENTATION
.
Untuk demonstrasi jenis alat, status tombol, dan kode sumbu baru, lihat TouchPaint dalam ApiDemos.
Properti
Class Property
yang baru menyediakan cara yang cepat, efisien, dan mudah untuk menentukan
pada objek apa pun yang memungkinkan pemanggil menetapkan/mendapatkan nilai secara umum pada objek target. Ini juga
memungkinkan fungsi meneruskan referensi kolom/metode dan memungkinkan kode untuk menetapkan/mendapatkan nilai
properti tanpa mengetahui detail
tentang {i>field<i}/metodenya.
Misalnya, jika Anda ingin menetapkan nilai kolom bar
pada objek foo
, Anda perlu
lakukan hal ini sebelumnya:
Kotlin
foo.bar = value
Java
foo.bar = value;
Jika ingin memanggil penyetel untuk kolom pribadi pokok bar
, Anda sebelumnya akan
lakukan ini:
Kotlin
foo.setBar(value)
Java
foo.setBar(value);
Namun, jika Anda ingin meneruskan instance foo
dan meminta beberapa kode lain menetapkan
bar
, tidak ada cara untuk melakukannya sebelum Android 4.0.
Dengan menggunakan class Property
, Anda dapat mendeklarasikan Property
objek BAR
di class Foo
sehingga Anda dapat menyetel kolom pada instance foo
class Foo
seperti ini:
Kotlin
BAR.set(foo, value)
Java
BAR.set(foo, value);
Class View
sekarang memanfaatkan class Property
untuk
memungkinkan Anda menetapkan berbagai kolom, seperti properti transformasi yang ditambahkan di Android 3.0 (ROTATION
, ROTATION_X
, TRANSLATION_X
, dll.).
Class ObjectAnimator
juga menggunakan Property
sehingga Anda dapat membuat ObjectAnimator
dengan Property
, yang lebih cepat, lebih efisien, dan lebih aman dari jenisnya daripada berbasis string
pendekatan.
Akselerasi Perangkat Keras
Mulai Android 4.0, akselerasi perangkat keras untuk semua jendela diaktifkan secara bawaan jika
aplikasi telah menetapkan targetSdkVersion
atau
minSdkVersion
ke
“14"
atau yang lebih tinggi. Akselerasi hardware umumnya menghasilkan animasi yang lebih halus,
scroll, serta performa dan respons yang lebih baik secara keseluruhan terhadap interaksi pengguna.
Jika perlu, Anda dapat menonaktifkan akselerasi hardware secara manual dengan hardwareAccelerated
untuk masing-masing elemen <activity>
atau <application>
. Anda juga dapat menonaktifkan akselerasi hardware untuk masing-masing tampilan dengan memanggil setLayerType(LAYER_TYPE_SOFTWARE)
.
Untuk informasi selengkapnya tentang akselerasi hardware, termasuk daftar gambar yang tidak didukung operasi, lihat Hardware Dokumen akselerasi.
Perubahan JNI
Di versi Android sebelumnya, referensi lokal JNI bukanlah handle tidak langsung; Menggunakan Android pointer langsung. Ini bukan masalah selama pembersih sampah memori tidak memindahkan objek, tapi itu tampaknya berfungsi karena memungkinkan untuk menulis kode yang berisi bug. Di Android 4.0, sistem sekarang menggunakan referensi tidak langsung untuk mendeteksi {i>bug<i} ini.
Seluk-beluk referensi lokal JNI dijelaskan dalam "Referensi Lokal dan Global" di Tip JNI. Di Android 4.0, CheckJNI telah ditingkatkan untuk mendeteksi error ini. Lihat Blog Developer Android untuk melihat postingan mendatang tentang kesalahan umum dalam referensi JNI dan cara memperbaikinya.
Perubahan dalam implementasi JNI ini hanya memengaruhi aplikasi yang menargetkan Android 4.0 dengan menyetel
targetSdkVersion
atau minSdkVersion
ke “14"
atau yang lebih tinggi. Jika Anda telah menetapkan
atribut ini ke nilai yang lebih rendah,
referensi lokal JNI berperilaku sama seperti dalam versi sebelumnya.
WebKit
- WebKit diupdate ke versi 534.30
- Dukungan untuk font India (Devanagari, Bengali, dan Tamil, termasuk dukungan karakter yang kompleks
diperlukan untuk menggabungkan glyph) di
WebView
dan Browser bawaan - Dukungan untuk font Etiopia, Georgia, dan Armenia di
WebView
dan Browser bawaan - Dukungan untuk WebDriver membuat
memudahkan Anda menguji aplikasi yang menggunakan
WebView
Browser Android
Aplikasi Browser menambahkan fitur berikut untuk mendukung aplikasi web:
- Kompilator JavaScript V8 yang diupdate untuk performa yang lebih cepat
- Ditambah penyempurnaan penting lainnya
yang berasal dari Android
3.0 kini tersedia untuk handset:
- Dukungan untuk elemen posisi tetap di semua halaman
- Pengambilan media HTML
- Orientasi perangkat peristiwa
- Transformasi 3D CSS
Izin
Berikut adalah izin baru:
ADD_VOICEMAIL
: Mengizinkan layanan pesan suara menambahkan pesan suara mengirim pesan ke perangkat.BIND_TEXT_SERVICE
: Layanan yang mengimplementasikanSpellCheckerService
harus memerlukan izin ini untuk layanan itu sendiri.BIND_VPN_SERVICE
: Layanan yang mengimplementasikanVpnService
harus memerlukan izin ini untuk layanan itu sendiri.- android.Manifest.permission#READ_PROFILE: Memberikan akses baca ke penyedia
ContactsContract.Profile
. - android.Manifest.permission#WRITE_PROFILE: Memberikan akses tulis ke penyedia
ContactsContract.Profile
.
Fitur Perangkat
Berikut adalah fitur perangkat baru:
FEATURE_WIFI_DIRECT
: Mendeklarasikan bahwa aplikasi menggunakan Wi-Fi untuk komunikasi peer-to-peer.
Untuk tampilan mendetail dari semua perubahan API di Android 4.0 (API Level 14), lihat Laporan Perbedaan API.
API sebelumnya
Selain semua hal di atas, Android 4.0 secara alami mendukung semua API dari rilis sebelumnya. Karena platform Android 3.x hanya tersedia untuk perangkat layar besar, dikembangkan terutama untuk handset, maka Anda mungkin tidak mengetahui semua API yang ditambahkan ke Android dalam rilis terbaru ini.
Berikut adalah beberapa API penting yang mungkin Anda lewatkan dan kini tersedia pada handset:
- Android 3.0
-
Fragment
: Komponen framework yang memungkinkan Anda memisahkan perbedaan elemen aktivitas menjadi modul mandiri yang menentukan UI dan siklus prosesnya sendiri. Lihat Panduan developer Fragment.ActionBar
: Penggantian untuk panel judul tradisional di bagian atas jendela Aktivitas. Ikon ini menyertakan logo aplikasi di sudut kiri dan memberikan untuk item menu. Lihat Panduan developer Panel Tindakan.Loader
: Komponen framework yang memfasilitasi model pemuatan data dalam kombinasi dengan komponen UI untuk memuat data secara dinamis tanpa memblokir thread utama. Lihat Panduan developer Loader.- Clipboard sistem: Aplikasi dapat menyalin dan menempelkan data (bukan hanya teks) ke dan dari papan klip di seluruh sistem. Data yang terpotong bisa berupa teks biasa, URI, atau intent. Lihat Panduan developer Salin dan Tempel.
- Tarik lalu lepas: Serangkaian API yang disertakan dalam framework tampilan yang memfasilitasi tarik lalu lepas operasional bisnis. Lihat Panduan developer Tarik lalu Lepas.
- Framework animasi baru yang fleksibel memungkinkan Anda menganimasikan properti arbitrer (Tampilan, Drawable, Fragmen, Objek, atau apa pun) dan menentukan aspek animasi seperti durasi, interpolasi, pengulangan, dan banyak lagi. Framework baru membuat Animasi di Android menjadi lebih sederhana. Lihat Developer Animasi Properti kami.
- Grafis RenderScript dan mesin komputasi: RenderScript menawarkan 3D berperforma tinggi rendering grafis, dan komputasi API pada level native, yang Anda tulis dalam C (standar C99), memberikan jenis performa yang Anda harapkan dari lingkungan native sekaligus tetap portabel di berbagai CPU dan GPU. Lihat Developer RenderScript kami.
- Grafis 2D dengan akselerasi perangkat keras: Sekarang Anda dapat mengaktifkan perender OpenGL untuk
aplikasi dengan menyetel {android:hardwareAccelerated="true"} di
<application>
elemen manifes Anda atau untuk setiap<activity>
yang kurang penting. Hal ini menghasilkan dalam animasi yang lebih halus, scroll yang lebih mulus, serta performa dan respons yang lebih baik secara keseluruhan interaksi.Catatan: Jika Anda menetapkan
minSdkVersion
atautargetSdkVersion
aplikasi ke"14"
atau yang lebih tinggi, akselerasi hardware diaktifkan secara default. - Dan masih banyak lagi. Lihat Platform Android 3.0 catatan untuk informasi selengkapnya.
- Android 3.1
-
- API USB: API baru yang canggih untuk mengintegrasikan periferal yang terhubung dengan aplikasi Android. API didasarkan pada stack USB dan layanan yang yang disertakan dalam platform, termasuk dukungan untuk interaksi perangkat dan {i>host<i} USB. Lihat panduan developer Host dan Aksesori USB.
- API MTP/PTP: Aplikasi dapat berinteraksi langsung dengan kamera yang terhubung dan PTP lainnya
perangkat untuk menerima notifikasi saat perangkat dipasang dan dilepas, mengelola file dan penyimpanan di
perangkat tersebut, dan mentransfer file
serta {i>metadata<i} ke dan dari perangkat tersebut. MTP API menerapkan PTP
(Picture Transfer Protocol) dari spesifikasi MTP (Media Transfer Protocol). Lihat
Dokumentasi
android.mtp
. - RTP API: Android mengekspos API ke stack RTP (Real-time Transport Protocol) bawaannya,
aplikasi mana yang dapat digunakan untuk mengelola {i>
on-demand<i} atau streaming data interaktif. Secara khusus, aplikasi
yang menyediakan VOIP, push-to-talk, konferensi, dan streaming audio dapat menggunakan API untuk memulai
sesi dan mengirimkan atau menerima
aliran data melalui jaringan yang tersedia. Lihat dokumentasi
android.net.rtp
. - Dukungan untuk joystick dan input gerakan umum lainnya.
- Lihat Platform Android 3.1 catatan bagi banyak API baru lainnya.
- Android 3.2
-
- Layar baru mendukung API yang memberi Anda lebih banyak kontrol atas cara aplikasi Anda yang ditampilkan pada berbagai ukuran layar. API ini memperluas model dukungan layar yang ada dengan kemampuan untuk menargetkan dengan tepat rentang ukuran layar tertentu berdasarkan dimensi, yang diukur dalam satuan piksel kepadatan mandiri (seperti lebar 600 dp atau 720 dp), bukan menurut ukuran layar (seperti besar atau ekstra besar). Misalnya, hal ini penting untuk membantu Anda membedakan antara angka 5" dan layar 7" khusus, yang secara tradisional akan dikelompokkan sebagai "besar" layar. Lihat postingan blog, Alat Baru untuk Mengelola Ukuran Layar.
- Konstanta baru untuk
<uses-feature>
untuk mendeklarasikan persyaratan orientasi layar lanskap atau potret. - "Ukuran layar" perangkat konfigurasi kini berubah selama orientasi layar
berubah. Jika aplikasi menargetkan API level 13 atau yang lebih tinggi, Anda harus menangani
"screenSize"
perubahan konfigurasi jika Anda juga ingin menangani perubahan konfigurasi"orientation"
. Lihatandroid:configChanges
untuk mengetahui informasi selengkapnya. - Lihat Platform Android 3.2 untuk API baru lainnya.
API Level
Android 4.0 API diberi bilangan bulat —14—yang disimpan di dalam sistem itu sendiri. ID ini, yang disebut "level API", memungkinkan sistem menentukan dengan benar apakah aplikasi kompatibel dengan sistem, sebelum menginstal aplikasi.
Untuk menggunakan API yang diperkenalkan di Android 4.0 di aplikasi, Anda harus mengompilasi
aplikasi pada platform Android yang
mendukung level API 14 atau
lebih tinggi. Bergantung pada kebutuhan, Anda mungkin juga perlu menambahkan
android:minSdkVersion="14"
ke atribut
<uses-sdk>
.
Untuk informasi selengkapnya, baca Apa yang dimaksud dengan API Tingkat?