Level API: 18
Android 4.3 (JELLY_BEAN_MR2
)
adalah pembaruan untuk rilis Jelly Bean yang menawarkan fitur baru untuk pengguna dan aplikasi
developer. Dokumen ini memberikan pengantar tentang hal-hal yang paling penting
API baru.
Sebagai developer aplikasi, Anda harus mendownload image sistem Android 4.3 dan SDK dari SDK Manager sebagai sesegera mungkin. Jika Anda tidak memiliki perangkat yang menjalankan Android 4.3 yang akan uji aplikasi Anda, gunakan sistem Android 4.3 untuk menguji aplikasi Anda di Android Emulator. Kemudian bangun aplikasi Anda pada platform Android 4.3 untuk mulai menggunakan API terbaru.
Memperbarui target API level Anda
Untuk lebih mengoptimalkan aplikasi Anda pada perangkat yang menjalankan Android 4.3,
Anda harus menetapkan targetSdkVersion
ke
"18"
, instal pada image sistem Android 4.3,
mengujinya, lalu mempublikasikan
pembaruan dengan perubahan ini.
Anda bisa menggunakan API di Android 4.3 sekaligus mendukung versi yang lebih lama dengan menambahkan
kondisi pada kode yang memeriksa level API sistem sebelum mengeksekusi
API yang tidak didukung oleh minSdkVersion
Anda.
Untuk mempelajari lebih lanjut cara mempertahankan kompatibilitas mundur, baca Mendukung Fitur Berbeda
Versi Platform.
Berbagai API juga tersedia di Support Library Android yang memungkinkan Anda menerapkan fitur baru pada versi platform lama.
Untuk informasi selengkapnya tentang cara kerja level API, baca Apa yang dimaksud dengan API level Tingkat?
Perubahan Perilaku yang Penting
Jika Anda sebelumnya telah memublikasikan aplikasi untuk Android, ketahuilah bahwa aplikasi mungkin terpengaruh oleh perubahan di Android 4.3.
Jika aplikasi Anda menggunakan intent implisit...
Aplikasi Anda mungkin berperilaku tidak semestinya dalam lingkungan profil yang dibatasi.
Pengguna dalam lingkungan profil yang dibatasi mungkin tidak
memiliki semua aplikasi
Android standar yang tersedia. Misalnya, profil yang dibatasi mungkin memiliki
browser web dan aplikasi kamera dinonaktifkan. Jadi aplikasi Anda tidak boleh membuat
asumsi tentang aplikasi mana
tersedia, karena jika Anda memanggil startActivity()
tanpa
memverifikasi apakah aplikasi tersedia untuk menangani Intent
,
aplikasi Anda mungkin macet
di profil yang dibatasi.
Saat menggunakan intent implisit, Anda harus selalu memverifikasi bahwa aplikasi tersedia untuk menangani intent tersebut dengan memanggil resolveActivity()
atau queryIntentActivities()
. Contoh:
Kotlin
val intent = Intent(Intent.ACTION_SEND) ... if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } else { Toast.makeText(context, R.string.app_not_available, Toast.LENGTH_LONG).show() }
Java
Intent intent = new Intent(Intent.ACTION_SEND); ... if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } else { Toast.makeText(context, R.string.app_not_available, Toast.LENGTH_LONG).show(); }
Jika aplikasi Anda bergantung pada akun...
Aplikasi Anda mungkin berperilaku tidak semestinya dalam lingkungan profil yang dibatasi.
Pengguna dalam lingkungan profil yang dibatasi tidak memiliki akses ke akun pengguna secara default.
Jika aplikasi Anda bergantung pada Account
, aplikasi mungkin akan mengalami error atau berperilaku
secara tiba-tiba bila digunakan
dalam profil yang dibatasi.
Jika Anda ingin mencegah profil yang dibatasi agar tidak menggunakan aplikasi Anda sepenuhnya karena
aplikasi bergantung pada informasi akun yang sensitif, tentukan atribut android:requiredAccountType
dalam <application>
manifes Anda
.
Jika Anda ingin mengizinkan profil yang dibatasi untuk terus menggunakan aplikasi meskipun tidak dapat melakukannya membuat akun sendiri, maka Anda dapat menonaktifkan fitur aplikasi yang memerlukan akun atau mengizinkan profil yang dibatasi untuk mengakses akun yang dibuat oleh pengguna utama. Untuk selengkapnya informasi tertentu, lihat bagian di bawah tentang Mendukung akun yang memiliki profil yang dibatasi.
Jika aplikasi Anda menggunakan VideoView...
Video Anda mungkin tampak lebih kecil di Android 4.3.
Di versi Android sebelumnya, widget VideoView
salah
menghitung nilai "wrap_content"
untuk layout_height
dan layout_width
agar sama dengan "match_parent"
. Jadi, saat menggunakan "wrap_content"
untuk tinggi atau lebar mungkin sebelumnya telah memberikan tata letak video yang Anda inginkan,
Jika melakukannya, ukuran video yang dihasilkan akan jauh lebih kecil di Android 4.3 dan versi yang lebih tinggi. Untuk memperbaiki masalah ini, ganti
"wrap_content"
dengan "match_parent"
dan verifikasi video Anda muncul seperti yang diharapkan pada
Android 4.3 serta versi yang lebih lama.
Profil Dibatasi
Di tablet Android, pengguna kini dapat membuat profil yang dibatasi berdasarkan pengguna utama. Saat pengguna membuat profil yang dibatasi, mereka dapat mengaktifkan pembatasan seperti aplikasi mana yang tersedia untuk profil. Serangkaian API baru di Android 4.3 juga memungkinkan Anda membuat pengaturan batasan untuk aplikasi yang dikembangkan. Misalnya, dengan menggunakan API baru, Anda bisa memungkinkan pengguna mengontrol jenis konten yang tersedia dalam aplikasi Anda saat dijalankan di lingkungan profil yang terbatas.
UI bagi pengguna untuk mengontrol batasan yang telah Anda bangun dikelola oleh
Aplikasi setelan. Untuk membuat setelan pembatasan aplikasi
Anda terlihat oleh pengguna,
Anda harus mendeklarasikan batasan yang diberikan aplikasi Anda dengan membuat BroadcastReceiver
yang menerima intent ACTION_GET_RESTRICTION_ENTRIES
. Sistem akan memanggil intent ini untuk mengkueri
semua aplikasi untuk batasan yang tersedia, lalu membangun UI yang memungkinkan pengguna utama
mengelola pembatasan untuk setiap profil yang dibatasi.
Dalam metode onReceive()
BroadcastReceiver
, Anda harus membuat RestrictionEntry
untuk setiap batasan yang diberikan aplikasi. Setiap RestrictionEntry
menentukan judul, deskripsi, dan salah satu pembatasan
tipe data berikut:
TYPE_BOOLEAN
untuk pembatasan yang benar atau salah.TYPE_CHOICE
untuk pembatasan yang memiliki pilihan ganda yang sama-sama bersifat eksklusif (pilihan tombol pilihan).TYPE_MULTI_SELECT
untuk pembatasan yang memiliki beberapa pilihan yang tidak saling eksklusif (pilihan kotak centang).
Kemudian, Anda menempatkan semua objek RestrictionEntry
ke dalam ArrayList
dan memasukkannya ke dalam hasil penerima siaran sebagai nilai untuk
Tambahan EXTRA_RESTRICTIONS_LIST
.
Sistem membuat UI untuk batasan aplikasi Anda di aplikasi Setelan dan menyimpan masing-masing
pembatasan dengan kunci unik yang Anda berikan untuk setiap RestrictionEntry
. Ketika pengguna membuka aplikasi, Anda bisa membuat kueri untuk batasan saat ini dengan
memanggil getApplicationRestrictions()
.
Tindakan ini akan menampilkan Bundle
yang berisi key-value pair untuk setiap pembatasan
yang Anda tentukan dengan objek RestrictionEntry
.
Jika Anda ingin memberikan batasan lebih spesifik yang tidak dapat ditangani oleh boolean,
pilihan, dan nilai multi-pilihan, maka Anda bisa membuat aktivitas tempat pengguna dapat menentukan
dan memungkinkan pengguna membuka aktivitas tersebut dari setelan pembatasan. Di
penerima siaran, menyertakan tambahan EXTRA_RESTRICTIONS_INTENT
dalam hasil Bundle
. Tambahan ini harus menentukan Intent
menunjukkan class Activity
untuk diluncurkan (gunakan
putParcelable()
untuk meneruskan EXTRA_RESTRICTIONS_INTENT
dengan intent).
Ketika pengguna utama memasuki aktivitas Anda untuk menetapkan pembatasan khusus,
aktivitas harus mengembalikan hasil yang berisi nilai batasan dalam ekstra menggunakan
kunci EXTRA_RESTRICTIONS_LIST
atau EXTRA_RESTRICTIONS_BUNDLE
, bergantung pada apakah Anda menentukan
Objek RestrictionEntry
atau pasangan nilai kunci.
Mendukung akun pada profil yang dibatasi
Setiap akun yang ditambahkan ke pengguna utama tersedia untuk profil yang dibatasi, namun
akun tidak dapat diakses dari API AccountManager
secara default.
Jika Anda mencoba menambahkan akun dengan AccountManager
saat berada dalam pembatasan
{i>profile<i}, Anda akan
mendapatkan hasil kegagalan. Karena pembatasan ini, Anda memiliki hal-hal berikut
tiga opsi:
Untuk mendapatkan akses ke akun dari profil yang dibatasi, Anda harus menambahkan atribut android:restrictedAccountType
ke tag <application>:
<application ... android:restrictedAccountType="com.example.account.type" >
Perhatian: Mengaktifkan atribut ini akan memberikan akses aplikasi ke akun pengguna utama dari profil yang dibatasi. Jadi, Anda harus mengizinkan hanya jika informasi yang ditampilkan oleh aplikasi Anda tidak mengungkapkan identitas pribadi (PII) yang dianggap sensitif. Setelan sistem akan memberi tahu pengguna bahwa aplikasi Anda memberikan profil yang dibatasi ke akun mereka, sehingga harus jelas bagi pengguna bahwa akses akun berperan penting untuk fungsionalitas aplikasi Anda. Jika memungkinkan, Anda juga harus menyediakan kontrol pembatasan yang memadai bagi pengguna utama yang menentukan seberapa banyak akses akun diizinkan di aplikasi Anda.
Jika Anda ingin menggunakan akun, tetapi sebenarnya tidak memerlukannya untuk
fungsionalitasnya, Anda dapat memeriksa ketersediaan akun dan menonaktifkan fitur jika tidak tersedia.
Anda harus memeriksa terlebih dahulu apakah sudah ada akun yang tersedia. Jika tidak, kueri apakah
Anda dapat membuat akun baru dengan memanggil getUserRestrictions()
dan memeriksa tambahan DISALLOW_MODIFY_ACCOUNTS
di hasilnya. Jika true
,
maka Anda harus menonaktifkan fungsi apa pun
dari aplikasi Anda yang membutuhkan akses ke akun.
Contoh:
Kotlin
val um = context.getSystemService(Context.USER_SERVICE) as UserManager val restrictions: Bundle = um.userRestrictions if (restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS, false)) { // cannot add accounts, disable some functionality }
Java
UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE); Bundle restrictions = um.getUserRestrictions(); if (restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS, false)) { // cannot add accounts, disable some functionality }
Catatan: Dalam skenario ini, Anda tidak boleh mendeklarasikan atribut baru apa pun dalam file manifes Anda.
Jika yang terpenting adalah aplikasi Anda tidak tersedia untuk profil yang dibatasi karena
aplikasi Anda bergantung pada informasi pribadi sensitif di akun (dan karena profil yang dibatasi
saat ini tidak dapat menambahkan akun baru), tambahkan
atribut android:requiredAccountType
ke tag <application>:
<application ... android:requiredAccountType="com.example.account.type" >
Misalnya, aplikasi Gmail menggunakan atribut ini untuk menonaktifkan dirinya sendiri untuk profil yang dibatasi, karena email pribadi pemilik tidak boleh tersedia untuk profil yang dibatasi.
Nirkabel dan Konektivitas
Bluetooth Hemat Energi (Smart Ready)
Android kini mendukung Bluetooth Hemat Energi (LE) dengan API baru di android.bluetooth
.
Dengan API baru, Anda dapat membangun aplikasi Android yang berkomunikasi dengan Bluetooth Hemat Energi
periferal seperti monitor
detak jantung dan pedometer.
Karena Bluetooth LE adalah fitur perangkat keras
yang tidak tersedia di semua
Perangkat yang didukung Android, Anda harus mendeklarasikan <uses-feature>
dalam file manifes
untuk "android.hardware.bluetooth_le"
:
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
Jika Anda sudah terbiasa dengan Bluetooth API Klasik Android, perhatikan bahwa menggunakan
Bluetooth LE API memiliki beberapa perbedaan. Yang terpenting adalah sekarang ada class BluetoothManager
yang harus Anda gunakan untuk beberapa operasi tingkat tinggi
seperti mendapatkan BluetoothAdapter
, mendapatkan daftar koneksi
perangkat, dan memeriksa
status perangkat. Misalnya, berikut ini adalah cara mendapatkan
BluetoothAdapter
:
Kotlin
val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager bluetoothAdapter = bluetoothManager.adapter
Java
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); bluetoothAdapter = bluetoothManager.getAdapter();
Untuk menemukan periferal Bluetooth LE, panggil startLeScan()
di BluetoothAdapter
, lalu teruskan implementasi
dari antarmuka BluetoothAdapter.LeScanCallback
. Ketika Bluetooth
adaptor mendeteksi periferal Bluetooth LE, implementasi BluetoothAdapter.LeScanCallback
akan menerima panggilan ke
Metode onLeScan()
. Ini
memberi Anda objek BluetoothDevice
yang mewakili
perangkat yang terdeteksi, nilai RSSI untuk perangkat, dan array byte yang berisi
catatan iklan.
Jika ingin memindai jenis periferal tertentu saja, Anda dapat memanggil startLeScan()
dan menyertakan array objek UUID
yang menentukan layanan GATT yang didukung aplikasi Anda.
Catatan: Anda hanya dapat memindai perangkat Bluetooth LE atau memindai perangkat Bluetooth Klasik menggunakan API sebelumnya. Anda tidak dapat memindai LE dan Classic sekaligus perangkat Bluetooth sekaligus.
Kemudian, untuk terhubung ke periferal Bluetooth LE, panggil connectGatt()
di
BluetoothDevice
, dengan meneruskan implementasi
BluetoothGattCallback
. Implementasi BluetoothGattCallback
Anda menerima callback terkait konektivitas
status dengan perangkat dan peristiwa lainnya. Dilakukan selama onConnectionStateChange()
callback sehingga Anda dapat mulai berkomunikasi dengan perangkat jika metode tersebut meneruskan STATE_CONNECTED
sebagai status baru.
Mengakses fitur Bluetooth di perangkat juga mengharuskan aplikasi Anda meminta Izin pengguna Bluetooth. Untuk informasi selengkapnya, lihat panduan Bluetooth Hemat Energi API.
Mode hanya pemindaian Wi-Fi
Saat mencoba mengidentifikasi lokasi pengguna, Android mungkin menggunakan Wi-Fi untuk membantu menentukan lokasi dengan memindai titik akses yang terdekat. Namun, pengguna sering kali tetap menonaktifkan Wi-Fi untuk menghemat baterai, sehingga menghasilkan data lokasi yang kurang akurat. Android kini menyertakan mode hanya pindai yang memungkinkan Wi-Fi perangkat memindai titik akses untuk membantu mendapatkan lokasi tanpa terhubung ke titik akses, sehingga sangat mengurangi penggunaan baterai.
Jika Anda ingin mendapatkan lokasi pengguna tetapi Wi-Fi saat ini nonaktif, Anda dapat meminta
untuk mengaktifkan mode hanya pemindaian Wi-Fi dengan memanggil startActivity()
dengan tindakan ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE
.
Konfigurasi Wi-Fi
WifiEnterpriseConfig
API baru memungkinkan layanan berorientasi perusahaan untuk
mengotomatiskan konfigurasi Wi-Fi untuk perangkat terkelola.
Respons cepat untuk panggilan masuk
Sejak Android 4.0, fitur yang disebut "Respons cepat" memungkinkan pengguna merespons
dengan pesan teks langsung tanpa perlu mengangkat telepon atau membuka kunci perangkat.
Sampai sekarang, pesan cepat ini selalu ditangani oleh aplikasi Perpesanan default. Sekarang, semua aplikasi
dapat mendeklarasikan kemampuannya untuk menangani pesan ini dengan membuat Service
dengan filter intent untuk ACTION_RESPOND_VIA_MESSAGE
.
Saat pengguna merespons panggilan masuk dengan
respons cepat, aplikasi Telepon mengirimkan
intent ACTION_RESPOND_VIA_MESSAGE
dengan URI
yang menjelaskan penerima (pemanggil) dan tambahan EXTRA_TEXT
dengan pesan yang ingin
dikirim pengguna. Saat menerima intent, layanan harus mengirimkan
pesan dan langsung berhenti sendiri (aplikasi Anda tidak boleh menampilkan aktivitas).
Untuk menerima intent ini, Anda harus mendeklarasikan izin SEND_RESPOND_VIA_MESSAGE
.
Multimedia
Penyempurnaan MediaExtractor dan MediaCodec
Android kini memudahkan Anda menulis sendiri Dynamic Adaptive
Pemutar streaming melalui HTTP (DASH) sesuai dengan standar ISO/IEC 23009-1,
menggunakan API yang sudah ada di MediaCodec
dan MediaExtractor
. Framework yang mendasari API ini telah diupdate untuk mendukung
penguraian file MP4 terfragmentasi, tetapi aplikasi Anda masih bertanggung jawab untuk mengurai metadata MPD
dan meneruskan masing-masing aliran data ke MediaExtractor
.
Jika Anda ingin menggunakan DASH dengan konten terenkripsi, perlu diperhatikan bahwa metode getSampleCryptoInfo()
menampilkan metadata MediaCodec.CryptoInfo
yang menjelaskan struktur setiap media terenkripsi
contoh. Selain itu, metode getPsshInfo()
telah ditambahkan ke
MediaExtractor
agar Anda dapat mengakses metadata PSSH untuk media DASH.
Metode ini menampilkan peta objek UUID
ke byte, dengan
UUID
yang menentukan skema kripto, dan byte adalah data spesifik
ke skema tersebut.
DRM Media
Class MediaDrm
yang baru menyediakan solusi modular untuk hak digital
dengan konten media Anda dengan memisahkan masalah DRM dari pemutaran media. Sebagai
Misalnya, pemisahan API ini memungkinkan Anda memutar konten terenkripsi Widevine tanpa
untuk menggunakan format media Widevine. Solusi DRM ini juga mendukung Enkripsi Umum DASH sehingga Anda
dapat menggunakan berbagai skema DRM dengan konten streaming Anda.
Anda dapat menggunakan MediaDrm
untuk mendapatkan pesan permintaan kunci buram dan memprosesnya
pesan respons kunci dari server untuk
akuisisi dan penyediaan lisensi. Aplikasi Anda
bertanggung jawab untuk menangani
komunikasi jaringan dengan server; Class MediaDrm
hanya memberikan kemampuan untuk membuat dan memproses pesan.
MediaDrm
API dimaksudkan untuk digunakan bersama dengan
MediaCodec
API yang diperkenalkan di Android 4.1 (API level 16),
termasuk MediaCodec
untuk mengenkode dan mendekode konten Anda, MediaCrypto
untuk menangani konten terenkripsi, dan MediaExtractor
untuk mengekstrak dan mengurai konten Anda.
Anda harus terlebih dahulu membuat MediaExtractor
dan
MediaCodec
objek. Anda kemudian dapat mengakses
pengenal identifikasi skema DRM
UUID
, biasanya dari metadata dalam konten, dan menggunakannya untuk membuat
instance objek MediaDrm
dengan konstruktornya.
Encoding video dari Platform
Android 4.1 (level API 16) menambahkan class MediaCodec
untuk level rendah
encoding dan decoding konten media. Saat mengenkode video, Android 4.1 mengharuskan Anda memberikan
media dengan array ByteBuffer
, tetapi Android 4.3 kini memungkinkan Anda menggunakan Surface
sebagai input ke encoder. Misalnya, ini memungkinkan Anda mengenkode input
dari file video yang ada atau menggunakan frame yang dihasilkan dari OpenGL ES.
Untuk menggunakan Surface
sebagai input ke encoder, pertama-tama panggil configure()
untuk MediaCodec
.
Lalu, panggil createInputSurface()
untuk menerima Surface
yang dapat digunakan untuk melakukan streaming media.
Misalnya, Anda dapat menggunakan Surface
yang diberikan sebagai jendela untuk OpenGL
konteks dengan meneruskannya ke eglCreateWindowSurface()
. Kemudian, saat merender platform, panggil eglSwapBuffers()
untuk meneruskan frame ke MediaCodec
.
Untuk memulai encoding, panggil start()
pada MediaCodec
. Setelah selesai, panggil signalEndOfInputStream()
untuk menghentikan encoding, dan memanggil release()
pada
Surface
.
muxing media
Class MediaMuxer
yang baru memungkinkan multiplexing antara satu streaming audio
dan satu streaming video. API ini berfungsi sebagai pasangan dengan MediaExtractor
ditambahkan di Android 4.2 untuk {i>de-multiplexing<i} media.
Format output yang didukung ditentukan dalam MediaMuxer.OutputFormat
. Saat ini,
MP4 adalah satu-satunya format output yang didukung dan MediaMuxer
saat ini mendukung
hanya satu streaming audio dan/atau satu streaming video pada satu waktu.
MediaMuxer
sebagian besar didesain agar berfungsi dengan MediaCodec
sehingga Anda dapat melakukan pemrosesan video melalui MediaCodec
, lalu simpan
output ke file MP4 melalui MediaMuxer
. Anda juga dapat menggunakan MediaMuxer
yang dikombinasikan dengan MediaExtractor
untuk melakukan
pengeditan media tanpa perlu mengenkode atau mendekode.
Progres dan scrubbing pemutaran untuk RemoteControlClient
Di Android 4.0 (API level 14), RemoteControlClient
telah ditambahkan ke
mengaktifkan kontrol pemutaran media dari klien remote control seperti kontrol yang tersedia di
layar kunci. Android 4.3 kini menyediakan kemampuan bagi pengontrol tersebut untuk menampilkan pemutaran
posisi dan kontrol untuk menggeser pemutaran. Jika Anda telah mengaktifkan remote control untuk
aplikasi media dengan API RemoteControlClient
, maka Anda dapat mengizinkan pemutaran
{i>scrubbing<i} dengan
mengimplementasikan dua antarmuka baru.
Pertama, Anda harus mengaktifkan tanda FLAG_KEY_MEDIA_POSITION_UPDATE
dengan meneruskannya ke
setTransportControlsFlags()
.
Kemudian, terapkan dua antarmuka baru berikut:
RemoteControlClient.OnGetPlaybackPositionListener
- Ini mencakup callback
onGetPlaybackPosition()
, yang meminta posisi saat ini media Anda ketika remote control perlu memperbarui progres di UI-nya. RemoteControlClient.OnPlaybackPositionUpdateListener
- Ini mencakup callback
onPlaybackPositionUpdate()
, yang memberi tahu aplikasi kode waktu baru untuk media Anda ketika pengguna menggeser pemutaran dengan UI remote control.Setelah memperbarui pemutaran dengan posisi baru, panggil
setPlaybackState()
untuk menunjukkan status, posisi, dan kecepatan pemutaran baru.
Setelah antarmuka ini ditentukan, Anda dapat menyetelnya untuk RemoteControlClient
dengan memanggil setOnGetPlaybackPositionListener()
dan
setPlaybackPositionUpdateListener()
.
Grafik
Dukungan untuk OpenGL ES 3.0
Android 4.3 menambahkan antarmuka Java dan dukungan bawaan untuk OpenGL ES 3.0. Fungsi utama baru yang disediakan dalam OpenGL ES 3.0 meliputi:
- Akselerasi efek visual lanjutan
- Kompresi tekstur ETC2/EAC berkualitas tinggi sebagai fitur standar
- Versi baru bahasa shading GLSL ES dengan dukungan bilangan bulat dan floating point 32-bit
- Rendering tekstur lanjutan
- Standardisasi yang lebih luas untuk ukuran tekstur dan format render-buffer
Antarmuka Java untuk OpenGL ES 3.0 di Android dilengkapi dengan GLES30
.
Saat menggunakan OpenGL ES 3.0, pastikan Anda mendeklarasikannya dalam file manifes dengan
<uses-feature>
dan atribut android:glEsVersion
. Contoh:
<manifest> <uses-feature android:glEsVersion="0x00030000" /> ... </manifest>
Jangan lupa untuk menentukan konteks OpenGL ES dengan memanggil setEGLContextClientVersion()
,
meneruskan 3
sebagai versinya.
Untuk informasi selengkapnya tentang penggunaan OpenGL ES, termasuk cara memeriksa dukungan perangkat Versi OpenGL ES saat runtime, lihat panduan OpenGL ES API.
Mipmapping untuk drawable
Menggunakan mipmap sebagai sumber untuk bitmap atau drawable adalah cara sederhana untuk menyediakan gambar berkualitas dan beragam skala gambar, yang bisa sangat berguna jika Anda mengharapkan gambar yang akan diskalakan selama animasi.
Android 4.2 (API level 17) menambahkan dukungan untuk mipmap di Bitmap
—Android menukar gambar mip di Bitmap
saat Anda
menyediakan sumber mipmap dan telah mengaktifkan setHasMipMap()
. Sekarang di Android 4.3, Anda juga dapat mengaktifkan mipmap untuk objek BitmapDrawable
, dengan menyediakan aset mipmap dan
menetapkan atribut android:mipMap
dalam file resource bitmap atau dengan memanggil hasMipMap()
.
Antarmuka Pengguna
Overlay tampilan
Class ViewOverlay
yang baru memberikan lapisan transparan di atas
View
tempat Anda dapat menambahkan konten visual dan yang tidak memengaruhi
hierarki tata letak. Anda bisa mendapatkan ViewOverlay
untuk View
apa pun dengan memanggil getOverlay()
. Overlay
selalu memiliki ukuran dan posisi yang sama dengan tampilan {i>host<i}-nya (tampilan asal pembuatannya),
memungkinkan Anda untuk menambahkan konten yang muncul di
depan tampilan {i>host<i}, tetapi yang tidak dapat
batas tampilan {i>host<i} tersebut.
Menggunakan ViewOverlay
sangat berguna ketika Anda ingin membuat
animasi seperti menggeser tampilan di luar container-nya atau memindahkan item di sekitar layar
tanpa memengaruhi hierarki tampilan. Akan tetapi, karena area overlay yang dapat digunakan
dibatasi ke area yang sama dengan tampilan host-nya, jika Anda ingin menganimasikan tampilan yang bergerak ke luar
posisinya dalam tata letak, Anda harus menggunakan overlay dari tampilan induk yang memiliki
batas tata letak.
Saat membuat overlay untuk tampilan widget seperti Button
, Anda
dapat menambahkan objek Drawable
ke overlay dengan memanggil
add(Drawable)
. Jika Anda memanggil getOverlay()
untuk tampilan tata letak, seperti RelativeLayout
,
objek yang ditampilkan adalah ViewGroupOverlay
. Tujuan
Class ViewGroupOverlay
adalah subclass
dari ViewOverlay
yang juga memungkinkan Anda menambahkan View
objek dengan memanggil add(View)
.
Catatan: Semua drawable dan tampilan yang Anda tambahkan ke overlay hanya bersifat visual. Fungsi ini tidak dapat menerima peristiwa fokus atau input.
Misalnya, kode berikut menganimasikan tampilan yang bergeser ke kanan dengan menempatkan tampilan di overlay tampilan induk, lalu menjalankan animasi terjemahan pada tampilan tersebut:
Kotlin
val view: View? = findViewById(R.id.view_to_remove) val container: ViewGroup? = view?.parent as ViewGroup container?.apply { overlay.add(view) ObjectAnimator.ofFloat(view, "translationX", right.toFloat()) .start() }
Java
View view = findViewById(R.id.view_to_remove); ViewGroup container = (ViewGroup) view.getParent(); container.getOverlay().add(view); ObjectAnimator anim = ObjectAnimator.ofFloat(view, "translationX", container.getRight()); anim.start();
Tata letak batas optik
Untuk tampilan yang berisi gambar latar nine-patch, kini Anda dapat menetapkan bahwa gambar tersebut seharusnya sejajar dengan tampilan yang berdekatan berdasarkan batas gambar latar, bukan daripada "klip" batas tampilan.
Misalnya, gambar 1 dan 2 masing-masing menunjukkan tata letak yang sama, tetapi versi pada gambar 1 adalah menggunakan batas klip (perilaku default), sedangkan gambar 2 menggunakan batas optik. Karena gambar {i>nine-patch<i} yang digunakan untuk tombol dan bingkai foto menyertakan {i>padding<i} di sekitar tepi, bentuknya tidak sejajar satu sama lain atau dengan teks saat menggunakan batas klip.
Catatan: Screenshot pada gambar 1 dan 2 memiliki kolom "Tampilkan batas tata letak" mengaktifkan setelan developer. Untuk setiap tampilan, garis merah menunjukkan batas klip, garis biru menunjukkan batas klip, dan merah muda menunjukkan margin.
Untuk meratakan tampilan berdasarkan batas optiknya, setel atribut android:layoutMode
ke "opticalBounds"
di salah satu tata letak induk. Contoh:
<LinearLayout android:layoutMode="opticalBounds" ... >
Agar berfungsi, gambar nine-patch yang diterapkan ke latar belakang tampilan harus menentukan batas optik menggunakan garis merah di sepanjang bagian bawah dan sisi kanan file nine-patch (seperti yang ditunjukkan pada gambar 3). Garis merah menunjukkan wilayah yang harus dikurangi dari batas klip, menyisakan batas optik gambar.
Saat Anda mengaktifkan batas optik untuk ViewGroup
di tata letak, semua
tampilan turunan mewarisi mode tata letak batas optik kecuali jika Anda menggantinya untuk grup dengan
menyetel android:layoutMode
ke "clipBounds"
. Semua elemen tata letak juga mengikuti
batas optik tampilan turunan mereka, menyesuaikan batasnya sendiri berdasarkan batas optik
tampilan di dalamnya. Namun, elemen tata letak (subclass ViewGroup
)
saat ini tidak mendukung batas optik untuk gambar nine-patch yang diterapkan pada latar belakangnya sendiri.
Jika Anda membuat tampilan kustom dengan membuat subclass View
, ViewGroup
, atau subclass-nya, tampilan Anda akan mewarisi perilaku terikat optik ini.
Catatan: Semua widget yang didukung oleh tema Holo telah diupdate
dengan batas optik, termasuk Button
, Spinner
,
EditText
, dan lainnya. Jadi, Anda bisa segera mendapatkan
manfaat dengan menetapkan
Atribut android:layoutMode
ke "opticalBounds"
jika aplikasi Anda menerapkan tema Holo
(Theme.Holo
, Theme.Holo.Light
, dll.).
Guna menentukan batas optik untuk gambar nine-patch Anda sendiri dengan alat Draw 9-patch, tahan Control saat dengan mengklik {i>border piksel<i}.
Animasi untuk nilai Kotak
Anda kini dapat menganimasikan antara dua nilai Rect
dengan RectEvaluator
baru. Class baru ini adalah implementasi TypeEvaluator
yang dapat Anda teruskan ke ValueAnimator.setEvaluator()
.
Pemasangan jendela dan pemroses fokus
Sebelumnya, jika Anda ingin mendengarkan saat tampilan Anda dilampirkan/dilepas ke jendela atau
saat fokusnya berubah, Anda perlu mengganti class View
untuk
mengimplementasikan onAttachedToWindow()
dan onDetachedFromWindow()
, atau onWindowFocusChanged()
.
Sekarang, untuk menerima peristiwa pemasangan dan pelepasan, Anda dapat menerapkan ViewTreeObserver.OnWindowAttachListener
dan menyetelnya pada tampilan dengan
addOnWindowAttachListener()
.
Untuk menerima peristiwa fokus, Anda dapat menerapkan ViewTreeObserver.OnWindowFocusChangeListener
dan menyetelnya pada tampilan dengan
addOnWindowFocusChangeListener()
.
Dukungan pemindaian berlebih TV
Untuk memastikan aplikasi Anda mengisi seluruh layar pada setiap televisi, Anda kini dapat mengaktifkan overscan
untuk tata letak aplikasi Anda. Mode overscan ditentukan oleh flag FLAG_LAYOUT_IN_OVERSCAN
, yang dapat Anda aktifkan dengan tema platform seperti
Theme_DeviceDefault_NoActionBar_Overscan
, atau dengan mengaktifkan
Gaya windowOverscan
dalam tema kustom.
Orientasi layar
<activity>
screenOrientation
dari tag
kini mendukung nilai tambahan untuk mengikuti preferensi pengguna untuk rotasi otomatis:
"userLandscape"
- Berperilaku sama seperti
"sensorLandscape"
, kecuali jika pengguna menonaktifkan fitur putar otomatis maka akan terkunci dalam orientasi lanskap normal dan tidak akan dibalik. "userPortrait"
- Berperilaku sama seperti
"sensorPortrait"
, kecuali jika pengguna menonaktifkan putar otomatis, kunci dalam orientasi potret normal dan tidak akan dibalik. "fullUser"
- Berperilaku sama seperti
"fullSensor"
dan memungkinkan rotasi ke keempat arah, kecuali jika pengguna menonaktifkan putar otomatis, maka akan terkunci sesuai orientasi pilihan pengguna.
Selain itu, Anda kini juga dapat mendeklarasikan "locked"
untuk mengunci orientasi aplikasi Anda ke
orientasi layar saat ini.
Animasi rotasi
Kolom rotationAnimation
baru di
WindowManager
memungkinkan Anda memilih salah satu dari tiga animasi yang
gunakan ketika sistem mengalihkan orientasi layar. Ketiga animasi tersebut adalah:
Catatan: Animasi ini hanya tersedia jika Anda telah menyetel aktivitas untuk menggunakan "layar penuh" , yang dapat Anda aktifkan dengan tema seperti Theme.Holo.NoActionBar.Fullscreen
.
Misalnya, berikut adalah cara mengaktifkan "crossfade" animasi:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val params: WindowManager.LayoutParams = window.attributes params.rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE window.attributes = params ... }
Java
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WindowManager.LayoutParams params = getWindow().getAttributes(); params.rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE; getWindow().setAttributes(params); ... }
Masukan Pengguna
Tipe sensor baru
Sensor TYPE_GAME_ROTATION_VECTOR
baru memungkinkan Anda mendeteksi rotasi perangkat tanpa perlu mengkhawatirkan gangguan magnetik. Tidak seperti sensor TYPE_ROTATION_VECTOR
, TYPE_GAME_ROTATION_VECTOR
tidak didasarkan pada utara magnetik.
Sensor TYPE_GYROSCOPE_UNCALIBRATED
dan TYPE_MAGNETIC_FIELD_UNCALIBRATED
baru memberikan data sensor mentah tanpa
untuk estimasi bias. Artinya, TYPE_GYROSCOPE
dan TYPE_MAGNETIC_FIELD
yang sudah ada
sensor memberikan data sensor yang memperhitungkan perkiraan bias dari giroskopik dan besi keras
masing-masing di perangkat. Sedangkan perintah "tidak dikalibrasi" dari sensor-sensor tersebut sebagai gantinya,
data sensor mentah dan menawarkan
nilai bias yang diperkirakan secara terpisah. Sensor ini memungkinkan Anda untuk
menyediakan kalibrasi khusus Anda sendiri untuk data sensor dengan meningkatkan
data eksternal.
Pemroses Notifikasi
Android 4.3 menambahkan class layanan baru, NotificationListenerService
, yang memungkinkan aplikasi Anda menerima informasi tentang notifikasi baru saat diposting oleh sistem.
Jika aplikasi Anda saat ini menggunakan API layanan aksesibilitas untuk mengakses notifikasi sistem, Anda harus mengupdate aplikasi agar menggunakan API ini.
Penyedia Kontak
Kueri untuk "contactables"
Kueri Penyedia Kontak baru, Contactables.CONTENT_URI
, menyediakan cara yang efisien untuk mendapatkan satu Cursor
yang berisi semua alamat email dan nomor telepon milik semua kontak yang cocok dengan kueri yang ditentukan.
Kueri untuk delta kontak
API baru telah ditambahkan ke Penyedia Kontak yang memungkinkan Anda secara efisien melakukan kueri perubahan terbaru pada data kontak. Sebelumnya, aplikasi Anda dapat diberi tahu saat ada perubahan dalam data kontak, namun Anda tidak tahu persis apa yang berubah dan harus mengambil semua kontak, lalu melakukan iterasi untuk menemukan perubahan tersebut.
Untuk melacak perubahan penyisipan dan pembaruan, Anda kini dapat menyertakan parameter CONTACT_LAST_UPDATED_TIMESTAMP
dengan pilihan Anda untuk hanya mengkueri kontak yang telah berubah sejak terakhir kali Anda membuat kueri penyedia.
Untuk melacak kontak yang telah dihapus, tabel baru ContactsContract.DeletedContacts
menyediakan log kontak yang telah dihapus (tetapi setiap kontak yang dihapus akan disimpan di tabel ini dalam jangka waktu terbatas). Serupa dengan CONTACT_LAST_UPDATED_TIMESTAMP
, Anda dapat menggunakan parameter pilihan baru, CONTACT_DELETED_TIMESTAMP
untuk memeriksa kontak mana yang telah dihapus sejak terakhir kali Anda membuat kueri penyedia. Tabel tersebut juga berisi konstanta DAYS_KEPT_MILLISECONDS
yang berisi jumlah hari (dalam milidetik) yang akan disimpan log.
Selain itu, Penyedia Kontak sekarang menyiarkan tindakan CONTACTS_DATABASE_CREATED
saat pengguna
menghapus penyimpanan kontak melalui menu
pengaturan sistem, menciptakan kembali
Database Penyedia Kontak. Aplikasi ini dimaksudkan untuk memberi tahu aplikasi bahwa aplikasi perlu melepaskan semua kontak
informasi yang telah mereka simpan dan
muat ulang dengan kueri baru.
Untuk kode contoh yang menggunakan API ini guna memeriksa perubahan pada kontak, lihat di ApiDemos yang tersedia di download SDK Samples.
Pelokalan
Peningkatan dukungan untuk teks dua arah
Android versi sebelumnya mendukung bahasa dan tata letak kanan-ke-kiri (RTL),
tetapi terkadang tidak menangani teks arah campuran
dengan benar. Jadi, Android 4.3 menambahkan BidiFormatter
API yang membantu Anda memformat teks dengan benar dengan arah berlawanan
konten tanpa mengacaukan bagiannya.
Misalnya, saat Anda ingin membuat kalimat dengan variabel string, seperti "Apakah maksud Anda
15 Bay Street, Laurel, CA?", Anda biasanya meneruskan resource string dan variabel yang dilokalkan ke
String.format()
:
Kotlin
val suggestion = String.format(resources.getString(R.string.did_you_mean), address)
Java
Resources res = getResources(); String suggestion = String.format(res.getString(R.string.did_you_mean), address);
Namun, jika lokalitasnya adalah bahasa Ibrani, string yang diformat akan menjadi seperti ini:
האם התכוונת ל 15 Bay Street, Laurel, CA?
Jawaban Anda salah karena angka "15" harus ada di sebelah kiri "Bay Street". Solusinya adalah menggunakan BidiFormatter
dan metode unicodeWrap()
. Misalnya, kode di atas menjadi:
Kotlin
val bidiFormatter = BidiFormatter.getInstance() val suggestion = String.format( resources.getString(R.string.did_you_mean), bidiFormatter.unicodeWrap(address) )
Java
Resources res = getResources(); BidiFormatter bidiFormatter = BidiFormatter.getInstance(); String suggestion = String.format(res.getString(R.string.did_you_mean), bidiFormatter.unicodeWrap(address));
Secara default, unicodeWrap()
menggunakan
estimasi arah kuat pertama yang heuristik, yang bisa
melakukan kesalahan jika hal pertama
sinyal untuk arah teks tidak merepresentasikan arah yang sesuai untuk konten secara keseluruhan.
Jika perlu, Anda dapat menentukan heuristik yang berbeda dengan meneruskan salah satu konstanta TextDirectionHeuristic
dari TextDirectionHeuristics
ke unicodeWrap()
.
Catatan: API baru ini juga tersedia untuk versi sebelumnya
Android melalui Dukungan Android
Library, dengan class BidiFormatter
dan API terkait.
Layanan Aksesibilitas
Menangani peristiwa penting
AccessibilityService
kini dapat menerima callback untuk
peristiwa input utama dengan metode callback onKeyEvent()
. Hal ini memungkinkan layanan aksesibilitas
Anda untuk menangani input untuk
perangkat input berbasis tombol seperti keyboard dan
menerjemahkan peristiwa tersebut ke tindakan khusus yang
sebelumnya hanya dapat dilakukan dengan input sentuh atau tombol arah perangkat.
Pilih teks dan salin/tempel
AccessibilityNodeInfo
kini menyediakan API yang memungkinkan
AccessibilityService
untuk memilih, memotong, menyalin, dan menempel
teks dalam sebuah simpul.
Untuk menentukan pemilihan teks yang akan dipotong atau disalin, layanan aksesibilitas Anda dapat menggunakan
tindakan, ACTION_SET_SELECTION
, meneruskan
dengannya, posisi awal dan akhir pemilihan dengan ACTION_ARGUMENT_SELECTION_START_INT
dan ACTION_ARGUMENT_SELECTION_END_INT
.
Atau, Anda dapat memilih teks dengan memanipulasi posisi kursor menggunakan
tindakan, ACTION_NEXT_AT_MOVEMENT_GRANULARITY
(sebelumnya hanya untuk memindahkan posisi kursor), dan menambahkan argumen ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
.
Anda kemudian dapat memotong atau menyalin dengan ACTION_CUT
,
ACTION_COPY
, lalu tempel dengan
ACTION_PASTE
.
Catatan: API baru ini juga tersedia untuk versi sebelumnya
Android melalui Dukungan Android
Library, dengan AccessibilityNodeInfoCompat
.
Mendeklarasikan fitur aksesibilitas
Mulai Android 4.3, layanan aksesibilitas harus mendeklarasikan kemampuan aksesibilitas
dalam file metadatanya untuk menggunakan
fitur aksesibilitas tertentu. Jika kemampuan tersebut tidak
diminta dalam file metadata, maka fitur tersebut tidak akan dioperasikan. Untuk mendeklarasikan persyaratan
aksesibilitas, Anda harus menggunakan atribut XML yang sesuai dengan berbagai
"kemampuan" konstanta dalam AccessibilityServiceInfo
.
Misalnya, jika layanan tidak meminta kemampuan flagRequestFilterKeyEvents
,
maka kode itu tidak akan menerima
peristiwa utama.
Pengujian dan Proses Debug
Pengujian UI otomatis
Class UiAutomation
baru menyediakan API yang memungkinkan Anda menyimulasikan penggunaan
untuk otomatisasi pengujian. Dengan menggunakan AccessibilityService
API platform, UiAutomation
API memungkinkan Anda memeriksa konten layar dan memasukkan keyboard arbitrer serta peristiwa sentuh.
Untuk mendapatkan instance UiAutomation
, panggil Instrumentation.getUiAutomation()
. Secara berurutan
agar berfungsi, Anda harus menyediakan opsi -w
dengan perintah instrument
saat menjalankan InstrumentationTestCase
dari adb shell
.
Dengan instance UiAutomation
, Anda dapat menjalankan peristiwa arbitrer untuk diuji
aplikasi Anda dengan memanggil executeAndWaitForEvent()
, meneruskan Runnable
untuk dijalankan, waktu tunggu
periode untuk operasi, dan implementasi antarmuka UiAutomation.AccessibilityEventFilter
. Anda akan menerima panggilan dalam implementasi UiAutomation.AccessibilityEventFilter
yang memungkinkan Anda untuk memfilter peristiwa yang Anda minati dan menentukan keberhasilan atau
kegagalan kasus pengujian tertentu.
Untuk mengamati semua peristiwa selama pengujian, buat implementasi UiAutomation.OnAccessibilityEventListener
dan teruskan ke setOnAccessibilityEventListener()
.
Antarmuka pemroses Anda kemudian menerima panggilan ke onAccessibilityEvent()
setiap kali peristiwa terjadi, menerima objek AccessibilityEvent
yang mendeskripsikan peristiwa.
Ada berbagai operasi lain yang diekspos oleh UiAutomation
API
pada tingkat yang sangat rendah untuk mendorong pengembangan alat pengujian UI seperti uiautomator. Contohnya,
UiAutomation
juga dapat:
- Memasukkan peristiwa input
- Mengubah orientasi layar
- Mengambil screenshot
Dan yang paling penting untuk alat pengujian UI, UiAutomation
API berfungsi
lintas batas aplikasi, tidak seperti yang ada di Instrumentation
.
Peristiwa Systrace untuk aplikasi
Android 4.3 menambahkan class Trace
dengan dua metode statis,
beginSection()
dan endSection()
,
yang memungkinkan Anda menentukan blok kode untuk disertakan dengan laporan systrace. Dengan membuat
bagian kode yang dapat dilacak di aplikasi Anda, log systrace memberi Anda informasi yang lebih detail
analisis tentang tempat terjadinya perlambatan dalam aplikasi.
Untuk mengetahui informasi tentang cara menggunakan alat Systrace, baca Menganalisis Tampilan dan Performa dengan Systrace.
Keamanan
Key store Android untuk kunci pribadi aplikasi
Android kini menawarkan Penyedia Keamanan Java kustom di KeyStore
bernama Android Key Store, yang memungkinkan Anda membuat dan menyimpan kunci pribadi
hanya dapat dilihat dan digunakan oleh aplikasi Anda. Untuk memuat Android Key Store, teruskan
"AndroidKeyStore"
untuk KeyStore.getInstance()
.
Untuk mengelola kredensial pribadi aplikasi di Android Key Store, buat kunci baru dengan
KeyPairGenerator
dengan KeyPairGeneratorSpec
. Nama Depan
dapatkan instance KeyPairGenerator
dengan memanggil getInstance()
. Lalu panggil
initialize()
, dengan meneruskan instance
KeyPairGeneratorSpec
, yang dapat Anda gunakan
KeyPairGeneratorSpec.Builder
.
Terakhir, dapatkan KeyPair
dengan memanggil generateKeyPair()
.
Penyimpanan kredensial hardware
Android kini juga mendukung penyimpanan yang didukung hardware untuk KeyChain
kredensial, sehingga memberikan keamanan yang lebih baik dengan membuat kunci tidak tersedia untuk diekstrak. Yaitu, sekali
kunci yang ada di penyimpanan kunci yang didukung perangkat keras (Elemen Aman, TPM, atau TrustZone), kunci itu dapat digunakan untuk
operasi kriptografi tetapi materi kunci pribadi
tidak dapat diekspor. Bahkan {i>kernel<i} OS
tidak dapat mengakses materi kunci ini. Meskipun tidak semua perangkat Android
mendukung penyimpanan di
hardware, Anda dapat memeriksa pada saat runtime apakah penyimpanan yang didukung hardware tersedia dengan memanggil
KeyChain.IsBoundKeyAlgorithm()
.
Deklarasi Manifes
Fitur wajib yang bisa dideklarasikan
Nilai berikut kini didukung di <uses-feature>
sehingga Anda bisa memastikan bahwa aplikasi hanya diinstal pada perangkat yang menyediakan fitur
dibutuhkan aplikasi Anda.
FEATURE_APP_WIDGETS
- Mendeklarasikan bahwa aplikasi Anda menyediakan widget aplikasi dan hanya boleh diinstal di perangkat yang
menyertakan layar Utama atau lokasi serupa tempat pengguna dapat menyematkan widget aplikasi.
Contoh:
<uses-feature android:name="android.software.app_widgets" android:required="true" />
FEATURE_HOME_SCREEN
- Mendeklarasikan bahwa aplikasi Anda berperilaku sebagai pengganti Layar utama dan hanya boleh diinstal di
perangkat yang mendukung aplikasi Layar utama pihak ketiga.
Contoh:
<uses-feature android:name="android.software.home_screen" android:required="true" />
FEATURE_INPUT_METHODS
- Mendeklarasikan bahwa aplikasi Anda menyediakan metode input kustom (keyboard yang dibuat dengan
InputMethodService
) dan hanya boleh diinstal di perangkat yang mendukung metode input pihak ketiga. Contoh:<uses-feature android:name="android.software.input_methods" android:required="true" />
FEATURE_BLUETOOTH_LE
- Mendeklarasikan bahwa aplikasi Anda menggunakan API Bluetooth Hemat Energi dan hanya boleh diinstal di perangkat
serta mampu berkomunikasi dengan perangkat lain
melalui {i>Bluetooth<i} Energi Rendah.
Contoh:
<uses-feature android:name="android.software.bluetooth_le" android:required="true" />
Izin pengguna
Nilai berikut kini didukung di <uses-permission>
untuk mendeklarasikan
izin yang diperlukan aplikasi Anda
untuk mengakses API tertentu.
BIND_NOTIFICATION_LISTENER_SERVICE
- Diperlukan untuk menggunakan
NotificationListenerService
API baru. SEND_RESPOND_VIA_MESSAGE
- Wajib untuk menerima
ACTION_RESPOND_VIA_MESSAGE
intent.
Untuk tampilan detail semua perubahan API di Android 4.3, lihat Laporan Perbedaan API.