API Düzeyi: 18
Android 4.3 (JELLY_BEAN_MR2
), kullanıcılar ve uygulama geliştiriciler için yeni özellikler sunan bir Jelly Bean güncellemesidir. Bu belgede en önemli yeni API'ler tanıtılmaktadır.
Uygulama geliştirici olarak Android 4.3 sistem görüntüsünü ve SDK platformunu en kısa sürede SDK Yöneticisi'nden indirmeniz gerekir. Uygulamanızı test edebileceğiniz Android 4.3 çalıştıran bir cihazınız yoksa uygulamanızı Android emülatörde test etmek için Android 4.3 sistem görüntüsünü kullanın. Ardından, en yeni API'leri kullanmaya başlamak için uygulamalarınızı Android 4.3 platformuna göre derleyin.
Hedef API düzeyinizi güncelleyin
Uygulamanızı Android 4.3 çalıştıran cihazlar için daha iyi optimize etmek amacıyla targetSdkVersion
uygulamanızı "18"
olarak ayarlamalı, bir Android 4.3 sistem görüntüsüne yüklemeli, test etmeli ve ardından bu değişikliği içeren bir güncelleme yayınlamalısınız.
Hem Android 4.3'te API'leri kullanabilir hem de kodunuza minSdkVersion
tarafından desteklenmeyen API'leri yürütmeden önce sistem API düzeyini kontrol eden koşullar ekleyerek eski sürümleri destekleyebilirsiniz.
Geriye dönük uyumluluğun sürdürülmesi hakkında daha fazla bilgi edinmek için Farklı Platform Sürümlerini Destekleme bölümünü okuyun.
Android Destek Kitaplığı'nda, yeni özellikleri platformun eski sürümlerinde uygulamanıza olanak tanıyan çeşitli API'ler de bulunmaktadır.
API düzeylerinin işleyiş şekli hakkında daha fazla bilgi için API Düzeyi nedir? başlıklı makaleyi okuyun.
Önemli Davranış Değişiklikleri
Daha önce Android için bir uygulama yayınladıysanız uygulamanızın Android 4.3'teki değişikliklerden etkilenebileceğini unutmayın.
Uygulamanız dolaylı intent'ler kullanıyorsa...
Uygulamanız kısıtlanmış profil ortamında hatalı çalışabilir.
Kısıtlı profil ortamındaki kullanıcılar tüm standart Android uygulamalarına sahip olmayabilir. Örneğin, kısıtlı bir profilde web tarayıcısı ve
kamera uygulaması devre dışı bırakılabilir. Bu nedenle, uygulamanız hangi uygulamaların kullanılabilir olduğu konusunda varsayımlarda bulunmamalıdır. Çünkü bir uygulamanın Intent
işine uygun olup olmadığını doğrulamadan startActivity()
öğesini çağırırsanız uygulamanız kısıtlanmış bir profilde kilitlenebilir.
Dolaylı niyet kullanırken her zaman bir uygulamanın, resolveActivity()
veya queryIntentActivities()
yöntemini çağırarak amacı işleyebilecek şekilde kullanılabilir olduğunu doğrulamanız gerekir. Örnek:
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(); }
Uygulamanız hesaplara dayalıysa...
Uygulamanız kısıtlanmış profil ortamında hatalı çalışabilir.
Kısıtlanmış bir profil ortamındaki kullanıcılar, varsayılan olarak kullanıcı hesaplarına erişemez.
Uygulamanız Account
kullanıyorsa kısıtlanmış bir profilde kullanıldığında uygulamanız kilitlenebilir veya beklenmedik şekilde davranabilir.
Uygulamanız hassas hesap bilgilerine bağlı olduğu için kısıtlanmış profillerin uygulamanızı tamamen kullanmasını engellemek istiyorsanız manifest'inizin <application>
öğesinde android:requiredAccountType
özelliğini belirtin.
Kısıtlanmış profillerin kendi hesaplarını oluşturamasalar bile uygulamanızı kullanmaya devam etmesine izin vermek istiyorsanız, hesap gerektiren uygulama özelliklerinizi devre dışı bırakabilir veya kısıtlanmış profillerin, birincil kullanıcı tarafından oluşturulan hesaplara erişmesine izin verebilirsiniz. Daha fazla bilgi edinmek için aşağıdaki Kısıtlanmış profildeki hesapları destekleme bölümüne bakın.
Uygulamanız VideoView kullanıyorsa...
Videonuz Android 4.3'te daha küçük görünebilir.
VideoView
widget'ı, Android'in önceki sürümlerinde yanlış bir şekilde layout_height
ve layout_width
için "wrap_content"
değerini "match_parent"
ile aynı olacak şekilde hesapladı. Yükseklik veya genişlik için "wrap_content"
kullanıldığında istediğiniz video düzeni önceden sağlanmış olsa da bu işlem Android 4.3 ve sonraki sürümlerde çok daha küçük bir video oluşturulmasına neden olabilir. Sorunu düzeltmek için "wrap_content"
değerini "match_parent"
ile değiştirin ve videonuzun Android 4.3'te ve eski sürümlerde beklendiği gibi göründüğünü doğrulayın.
Kısıtlı Profiller
Android tabletlerde kullanıcılar artık birincil kullanıcıya göre kısıtlanmış profiller oluşturabilir. Kullanıcılar kısıtlanmış bir profil oluşturduklarında, profilde hangi uygulamaların kullanılabilir olduğu gibi kısıtlamaları etkinleştirebilirler. Android 4.3'teki yeni API grubu, geliştirdiğiniz uygulamalar için ayrıntılı kısıtlama ayarları oluşturmanıza da olanak tanır. Örneğin, yeni API'leri kullanarak kullanıcıların kısıtlı profil ortamında çalışırken uygulamanızda ne tür içeriklerin kullanılabileceğini kontrol etmelerine olanak tanıyabilirsiniz.
Kullanıcıların, oluşturduğunuz kısıtlamaları kontrol etmesi için kullanılan kullanıcı arayüzü, sistemin Ayarlar uygulaması tarafından yönetilir. Uygulamanızın kısıtlama ayarlarının kullanıcıya gösterilmesi için ACTION_GET_RESTRICTION_ENTRIES
amacını alan bir BroadcastReceiver
oluşturarak uygulamanızın kısıtlamalarını beyan etmeniz gerekir. Sistem, mevcut kısıtlamalar için tüm uygulamaları sorgulamak amacıyla bu niyeti çağırır, ardından birincil kullanıcının her bir kısıtlanmış profil için kısıtlamaları yönetmesine izin verecek şekilde kullanıcı arayüzü oluşturur.
BroadcastReceiver
öğenizin onReceive()
yönteminde, uygulamanızın sağladığı her kısıtlama için bir RestrictionEntry
oluşturmanız gerekir. Her RestrictionEntry
bir kısıtlama başlığı, açıklaması ve aşağıdaki veri türlerinden birini tanımlar:
TYPE_BOOLEAN
değerine ayarlayın.- Birlikte kullanılamayan birden fazla seçeneğe (radyo düğmesi seçimleri) sahip bir kısıtlama için
TYPE_CHOICE
. - Aynı anda olmayan birden fazla seçeneğe sahip bir kısıtlama için
TYPE_MULTI_SELECT
(onay kutusu seçenekleri).
Daha sonra, tüm RestrictionEntry
nesnelerini bir ArrayList
içine yerleştiriyor ve EXTRA_RESTRICTIONS_LIST
ekstra değeri olarak yayın alıcısının sonucuna yerleştiriyorsunuz.
Sistem, Ayarlar uygulamasında uygulamanızın kısıtlamaları için kullanıcı arayüzü oluşturur ve her kısıtlamayı her RestrictionEntry
nesnesi için sağladığınız benzersiz anahtarla kaydeder. Kullanıcı uygulamanızı açtığında getApplicationRestrictions()
numaralı telefonu arayarak mevcut kısıtlamaları sorgulayabilirsiniz.
Bu işlem, RestrictionEntry
nesneleriyle tanımladığınız her kısıtlama için anahtar/değer çiftlerini içeren bir Bundle
döndürür.
Boole, tekli seçim ve çoktan seçmeli değerleri tarafından işlenemeyecek daha spesifik kısıtlamalar sağlamak istiyorsanız kullanıcının kısıtlamaları belirtebileceği ve kısıtlama ayarlarından kullanıcıların bu etkinliği açmasına izin verebileceği bir etkinlik oluşturabilirsiniz. Yayın alıcınızda Bundle
sonucuna ekstra EXTRA_RESTRICTIONS_INTENT
öğesini dahil edin. Bu ekstra öğe, başlatılacak Activity
sınıfını belirten bir Intent
belirtmelidir (amaçla EXTRA_RESTRICTIONS_INTENT
öğesini geçirmek için putParcelable()
yöntemini kullanın).
Birincil kullanıcı, özel kısıtlamalar ayarlamak için etkinliğinize girdiğinde etkinliğiniz, sırasıyla RestrictionEntry
nesneleri veya anahtar/değer çiftleri belirtip belirtmemenize bağlı olarak EXTRA_RESTRICTIONS_LIST
veya EXTRA_RESTRICTIONS_BUNDLE
anahtarını kullanarak kısıtlama değerlerini fazladan içeren bir sonuç döndürmelidir.
Kısıtlanmış bir profildeki hesapları destekleme
Birincil kullanıcıya eklenen tüm hesaplar kısıtlanmış profil tarafından kullanılabilir ancak bu hesaplara varsayılan olarak AccountManager
API'lerinden erişilemez.
Kısıtlanmış bir profildeyken AccountManager
ile bir hesap eklemeye çalışırsanız bir hata sonucu alırsınız. Bu kısıtlamalar nedeniyle
şu üç seçeneğiniz vardır:
Kısıtlanmış bir profilden bir hesaba erişim elde etmek için <application> etiketine android:restrictedAccountType
özelliğini eklemeniz gerekir:
<application ... android:restrictedAccountType="com.example.account.type" >
Dikkat: Bu özelliğin etkinleştirilmesi, uygulamanızın kısıtlanmış profillerden birincil kullanıcı hesaplarına erişmesini sağlar. Bu nedenle, buna yalnızca uygulamanız tarafından gösterilen bilgiler hassas kabul edilen kimliği tanımlayabilecek bilgileri (PII) ifşa etmiyorsa izin vermelisiniz. Sistem ayarları, birincil kullanıcıya uygulamanızın, hesaplarına kısıtlanmış profiller izni verdiği konusunda bilgi verir. Bu nedenle, hesap erişiminin uygulamanızın işlevselliği için önemli olduğu kullanıcı tarafından açıkça anlaşılabilmelidir. Mümkünse birincil kullanıcı için, uygulamanızda ne kadar hesap erişimine izin verildiğini tanımlayan yeterli kısıtlama kontrollerini de sağlamanız gerekir.
Hesapları kullanmak istiyor ancak uygulamanızın birincil işlevi için aslında bunlara ihtiyaç duymuyorsanız hesap kullanılabilirliğini kontrol edebilir ve kullanılamadığında özellikleri devre dışı bırakabilirsiniz.
Önce, kullanılabilir bir hesap olup olmadığını kontrol etmeniz gerekir. Değilse getUserRestrictions()
işlevini çağırarak yeni bir hesap oluşturmanın mümkün olup olmadığını sorgulayın ve sonuçtaki DISALLOW_MODIFY_ACCOUNTS
ekstra özelliğine bakın. true
ise uygulamanızın hesaplara erişim gerektirdiği işlevlerini devre dışı bırakmanız gerekir.
Örnek:
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 }
Not: Bu senaryoda, manifest dosyanızda yeni bir özellik bildirmemeniz gerekir.
Bunun yerine, uygulamanız bir hesaptaki hassas kişisel bilgilere dayandığı ve kısıtlanmış profiller şu anda yeni hesaplar ekleyemediği için kısıtlanmış profiller tarafından kullanılamaz olması önemliyse <application> etiketine android:requiredAccountType
özelliğini ekleyin:
<application ... android:requiredAccountType="com.example.account.type" >
Örneğin, Gmail uygulaması bu özelliği kullanarak kısıtlı profillerde kendisini devre dışı bırakır. Bunun nedeni, sahibinin kişisel e-posta adresinin kısıtlanmış profiller tarafından kullanılamamasıdır.
Kablosuz ve Bağlantı
Bluetooth Düşük Enerji (Akıllı Kullanıma Hazır)
Android artık android.bluetooth
ürünündeki yeni API'lerle Bluetooth Düşük Enerji'yi (LE) destekliyor.
Yeni API'leri kullanarak nabız monitörleri ve adımölçerler gibi Bluetooth Düşük Enerji çevre birimleri ile iletişim kuran Android uygulamaları oluşturabilirsiniz.
Bluetooth LE, Android destekli tüm cihazlarda bulunmayan bir donanım özelliği olduğundan manifest dosyanızda "android.hardware.bluetooth_le"
için bir <uses-feature>
öğesi beyan etmeniz gerekir:
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
Android'in Klasik Bluetooth API'lerine aşinaysanız Bluetooth LE API'lerini kullanmayla ilgili bazı farklılıklara dikkat edin. En önemlisi, artık BluetoothAdapter
edinme, bağlı cihazların listesini alma ve bir cihazın durumunu kontrol etme gibi bazı üst düzey işlemler için kullanmanız gereken bir BluetoothManager
sınıfının olmasıdır. Örneğin, BluetoothAdapter
öğesini şu şekilde elde etmeniz gerekir:
Kotlin
val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager bluetoothAdapter = bluetoothManager.adapter
Java
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); bluetoothAdapter = bluetoothManager.getAdapter();
Bluetooth LE çevre birimlerini keşfetmek için BluetoothAdapter
üzerinde startLeScan()
çağrısı yaparak BluetoothAdapter.LeScanCallback
arayüzünün uygulanmasını sağlayın. Bluetooth adaptörü bir Bluetooth LE çevre birimi algıladığında BluetoothAdapter.LeScanCallback
uygulamanız, onLeScan()
yöntemine bir çağrı alır. Bu yöntem size algılanan cihazı temsil eden bir BluetoothDevice
nesnesi, cihazın RSSI değeri ve cihazın reklam kaydını içeren bir bayt dizisi sağlar.
Yalnızca belirli çevre birimi türlerini taramak istiyorsanız bunun yerine startLeScan()
yöntemini çağırabilir ve uygulamanızın desteklediği GATT hizmetlerini belirten bir UUID
nesne dizisi ekleyebilirsiniz.
Not: Yalnızca Bluetooth LE cihazları veya önceki API'leri kullanarak Klasik Bluetooth cihazları tarayabilirsiniz. Hem LE hem de Classic Bluetooth cihazlarını aynı anda tarayamazsınız.
Ardından bir Bluetooth LE çevre birimine bağlanmak için karşılık gelen BluetoothDevice
nesnesinde connectGatt()
çağrısı yaparak BluetoothGattCallback
uygulamasını iletin. BluetoothGattCallback
uygulamanız, cihazla ve diğer etkinliklerle bağlantı durumu ile ilgili geri çağırmalar alır. Yöntem, STATE_CONNECTED
yeni durum olarak geçerse onConnectionStateChange()
geri çağırma işlemi sırasında cihazla iletişim kurmaya başlayabilirsiniz.
Bir cihazdaki Bluetooth özelliklerine erişebilmek için uygulamanızın belirli Bluetooth kullanıcı izinlerini istemesi de gerekir. Daha fazla bilgi için Bluetooth Düşük Enerji API kılavuzuna bakın.
Kablosuz yalnızca tarama modu
Android, kullanıcının konumunu belirlemeye çalışırken yakındaki erişim noktalarını tarayarak konumun belirlenmesine yardımcı olmak için kablosuz bağlantı kullanabilir. Ancak kullanıcılar pil tasarrufu için kablosuz bağlantıyı genellikle kapalı tutar. Bu da konum verilerinin doğruluğunda azalmaya neden olur. Android artık, bir erişim noktasına bağlanmadan konumu belirlemeye yardımcı olmak için cihazın kablosuz ağının erişim noktalarını taramasına olanak tanıyan bir salt tarama modu içeriyor; böylece pil kullanımı büyük ölçüde azaltılıyor.
Kullanıcının konumunu almak istiyorsanız ancak kablosuz ağ şu anda kapalıysa ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE
işlemiyle startActivity()
yöntemini çağırarak kullanıcıdan yalnızca kablosuz ağ tarama modunu etkinleştirmesini isteyebilirsiniz.
Kablosuz yapılandırması
Yeni WifiEnterpriseConfig
API'leri kurumsal odaklı hizmetlerin yönetilen cihazlar için kablosuz ağ yapılandırmasını otomatikleştirmesine olanak tanır.
Gelen aramalar için hızlı yanıt
Android 4.0'dan bu yana "Hızlı yanıt" adlı özellik, kullanıcıların gelen aramalara anında kısa mesajla yanıt vermelerine olanak tanır. Üstelik bu sayede kullanıcılar aramayı cevaplamaya veya cihazın kilidini açmaya gerek kalmaz.
Şimdiye kadar, bu hızlı mesajlar her zaman varsayılan Mesajlaşma uygulaması tarafından işleniyordu. Artık tüm uygulamalar, ACTION_RESPOND_VIA_MESSAGE
için intent filtresine sahip bir Service
oluşturarak bu mesajları işleyebildiğini beyan edebilir.
Kullanıcı gelen çağrıya hızlı bir yanıt verdiğinde Telefon uygulaması, ACTION_RESPOND_VIA_MESSAGE
niyetini (arayan) açıklayan bir URI ve kullanıcının göndermek istediği mesajla birlikte EXTRA_TEXT
ekstrasını içeren bir URI gönderir. Hizmetiniz niyeti aldığında mesajı iletmeli ve hemen kendini durdurmalıdır (uygulamanız bir etkinlik göstermemelidir).
Bu amacı almak için SEND_RESPOND_VIA_MESSAGE
iznini beyan etmeniz gerekir.
Multimedya
MediaExtractor ve MediaCodec geliştirmeleri
Android artık MediaCodec
ve MediaExtractor
'deki mevcut API'leri kullanarak HTTP (DASH) üzerinden kendi Dinamik Uyarlanabilir Akış oynatıcılarınızı ISO/IEC 23009-1 standardına uygun olarak yazmanızı kolaylaştırıyor. Bu API'lerin temelini oluşturan çerçeve, parçalara ayrılmış MP4 dosyalarının ayrıştırılmasını destekleyecek şekilde güncellenmiştir ancak uygulamanız MPD meta verilerinin ayrıştırılmasından ve bağımsız akışları MediaExtractor
öğesine iletmekten sorumlu olmaya devam edecektir.
DASH'i şifrelenmiş içerikle kullanmak istiyorsanız getSampleCryptoInfo()
yönteminin, her bir şifrelenmiş medya örneğinin yapısını açıklayan MediaCodec.CryptoInfo
meta verilerini döndürdüğünü unutmayın. Ayrıca, DASH medyanızın PSSH meta verilerine erişebilmeniz için MediaExtractor
öğesine getPsshInfo()
yöntemi eklenmiştir.
Bu yöntem, UUID
nesnelerinden oluşan bir eşlemeyi baytlara döndürür. UUID
değeri, şifreleme şemasını belirtir ve baytlar bu şemaya özel verileri temsil eder.
Medya DRM'si
Yeni MediaDrm
sınıfı, DRM ile ilgili endişeleri medya oynatmadan ayırarak medya içeriğinizle dijital haklar yönetimi (DRM) için modüler bir çözüm sağlar. Örneğin bu API ayırma özelliği, Widevine ile şifrelenmiş içerikleri Widevine medya biçimini kullanmak zorunda kalmadan oynatmanızı sağlar. Bu DRM çözümü, DASH Ortak Şifrelemeyi de destekler. Böylece, akış içeriğinizle çeşitli DRM şemalarını kullanabilirsiniz.
Lisans edinme ve temel hazırlık amacıyla sunucudan gelen anahtar/yanıt mesajlarını opak anahtar-istek mesajları almak ve işleyebilmek için MediaDrm
kullanabilirsiniz. Uygulamanız, sunucularla ağ iletişimini yönetmekten sorumludur; MediaDrm
sınıfı yalnızca mesaj oluşturma ve işleme yeteneği sağlar.
MediaDrm
API'lerinin, Android 4.1'de (API düzeyi 16) kullanıma sunulan MediaCodec
API'leriyle birlikte kullanılması amaçlanmıştır. Bu API'ler; içeriğinizi kodlama ve kodunu çözme için MediaCodec
, şifrelenmiş içerikleri işlemek için MediaCrypto
ve içeriğinizi çıkarıp çıkartmak için MediaExtractor
API'leri içerir.
Öncelikle MediaExtractor
ve MediaCodec
nesnelerini oluşturmanız gerekir. Ardından, DRM şemasını tanımlayan UUID
öğesine (genellikle içerikteki meta verilerden) erişebilir ve oluşturucusuyla bir MediaDrm
nesnesinin örneğini oluşturmak için bunu kullanabilirsiniz.
Bir Yüzeyden video kodlama
Android 4.1 (API düzeyi 16), medya içeriğinin alt düzey kodlaması ve kodunu çözmesi için MediaCodec
sınıfını eklemiştir. Video kodlarken Android 4.1, medyaya bir ByteBuffer
dizisi sağlamanızı gerektirirken Android 4.3 artık kodlayıcı girişi olarak Surface
kullanmanıza olanak tanıyor. Örneğin, bu, mevcut bir video dosyasından girdi kodlamanıza veya OpenGL ES'den oluşturulan kareleri kullanmanıza olanak tanır.
Kodlayıcınıza giriş olarak bir Surface
kullanmak isterseniz önce MediaCodec
için configure()
çağrısı yapın.
Ardından, üzerinden medya akış gerçekleştirebileceğiniz Surface
almak için createInputSurface()
numaralı telefonu arayın.
Örneğin, belirtilen Surface
öğesini eglCreateWindowSurface()
öğesine geçirerek OpenGL bağlamını pencere olarak kullanabilirsiniz. Ardından, yüzeyi oluştururken kareyi MediaCodec
'a geçirmek için eglSwapBuffers()
çağrısı yapın.
Kodlamayı başlatmak için MediaCodec
üzerinde start()
çağrısı yapın. Bittiğinde kodlamayı sonlandırmak için signalEndOfInputStream()
ve Surface
üzerinde release()
çağrısı yapın.
Medyayı engelleme
Yeni MediaMuxer
sınıfı, bir ses akışı ile bir video akışı arasında çoğullama yapılmasını sağlar. Bu API'ler, Android 4.2'de çoğullama (demux) kaldırma (mukslama) işlemleri için eklenen MediaExtractor
sınıfının bir eşdeğeridir.
Desteklenen çıkış biçimleri, MediaMuxer.OutputFormat
içinde tanımlanmıştır. Şu anda desteklenen tek çıkış biçimi MP4'tür ve MediaMuxer
şu anda tek seferde yalnızca bir ses akışını ve/veya video akışını desteklemektedir.
MediaMuxer
, MediaCodec
ile çalışacak şekilde tasarlanmıştır. Bu sayede MediaCodec
üzerinden video işleme gerçekleştirebilir, ardından çıkışı MediaMuxer
ile bir MP4 dosyasına kaydedebilirsiniz. Ayrıca, kodlamaya veya kodu çözmeye gerek kalmadan medya düzenleme işlemi gerçekleştirmek için MediaMuxer
öğesini MediaExtractor
ile birlikte kullanabilirsiniz.
RemoteControlClient için oynatma ilerlemesi ve ileri geri oynatma
Android 4.0'da (API düzeyi 14) kilit ekranında bulunan kontroller gibi uzaktan kumanda istemcilerinin medya oynatma kontrollerini etkinleştirmek için RemoteControlClient
eklendi. Android 4.3 artık bu tür kumandaların oynatma konumunu ve oynatmayı ileri geri oynatma kontrollerini göstermesine olanak tanır. RemoteControlClient
API'leriyle medya uygulamanız için uzaktan kumandayı etkinleştirdiyseniz iki yeni arayüz uygulayarak oynatma işlemine izin verebilirsiniz.
Öncelikle, FLAG_KEY_MEDIA_POSITION_UPDATE
işaretini setTransportControlsFlags()
öğesine geçirerek etkinleştirmeniz gerekir.
Ardından aşağıdaki iki yeni arayüzü uygulayın:
RemoteControlClient.OnGetPlaybackPositionListener
- Bu, uzaktan kumandanın kullanıcı arayüzünde ilerleme durumunu güncellemesi gerektiğinde medyanızın mevcut konumunu isteyen
onGetPlaybackPosition()
geri çağırmasını içerir. RemoteControlClient.OnPlaybackPositionUpdateListener
- Bu, kullanıcı uzaktan kumanda kullanıcı arayüzüyle oynatmayı ileri verdiğinde uygulamanıza medyanızın yeni zaman kodunu bildiren
onPlaybackPositionUpdate()
geri çağırmasını içerir.Oynatma işlemini yeni konumla güncelledikten sonra yeni oynatma durumunu, konumunu ve hızı belirtmek için
setPlaybackState()
öğesini çağırın.
Bu arayüzler tanımlandığında, sırasıyla setOnGetPlaybackPositionListener()
ve setPlaybackPositionUpdateListener()
çağrılarıyla RemoteControlClient
cihazınız için bunları ayarlayabilirsiniz.
Grafik
OpenGL ES 3.0 desteği
Android 4.3, Java arayüzleri ve OpenGL ES 3.0 için yerel destek ekler. OpenGL ES 3.0'da sağlanan yeni temel işlevler şunları içerir:
- Gelişmiş görsel efektleri hızlandırma
- Standart bir özellik olarak yüksek kaliteli ETC2/EAC doku sıkıştırması
- Tam sayı ve 32 bit kayan nokta desteğine sahip GLSL ES gölgelendirme dilinin yeni sürümü
- Gelişmiş doku oluşturma
- Doku boyutu ve oluşturma arabellek biçimleri için daha kapsamlı standartlaştırma
Android'de OpenGL ES 3.0 için Java arayüzü GLES30
ile sağlanır.
OpenGL ES 3.0 kullanırken bunu manifest dosyanızda <uses-feature> etiketi ve android:glEsVersion
özelliğiyle belirttiğinizden emin olun. Örnek:
<manifest> <uses-feature android:glEsVersion="0x00030000" /> ... </manifest>
Ayrıca, setEGLContextClientVersion()
yöntemini çağırarak OpenGL ES bağlamını belirtmeyi ve sürüm olarak 3
değerini belirtmeyi unutmayın.
Çalışma zamanında cihazın desteklenen OpenGL ES sürümünün nasıl kontrol edileceği de dahil olmak üzere, OpenGL ES'yi kullanma hakkında daha fazla bilgi için OpenGL ES API kılavuzuna bakın.
Çekilebilir öğeler için eşleme
Bit eşleminizin veya çiziminizin kaynağı olarak mipmap kullanmak, kaliteli bir görüntü ve çeşitli resim ölçekleri sağlamanın basit bir yoludur. Bu, resminizin animasyon sırasında ölçeklendirilmesini bekliyorsanız özellikle faydalı olabilir.
Bitmap
sınıfında mipmaps için Android 4.2 (API düzeyi 17) desteği eklendi. Android, mipmap kaynağı sağlayıp setHasMipMap()
özelliğini etkinleştirdiğinizde Bitmap
dosyanızdaki mip resimlerini değiştirir. Artık Android 4.3'te, mipmap öğesi sağlayarak ve bit eşlem kaynak dosyasında android:mipMap
özelliğini ayarlayarak veya hasMipMap()
yöntemini çağırarak mipmap'leri bir BitmapDrawable
nesnesi için de etkinleştirebilirsiniz.
Kullanıcı Arayüzü
Yer paylaşımlarını göster
Yeni ViewOverlay
sınıfı, View
üzerine görsel içerik ekleyebileceğiniz ve düzen hiyerarşisini etkilemeyen şeffaf bir katman sağlar. getOverlay()
numaralı telefonu arayarak herhangi bir View
karşılığında ViewOverlay
alabilirsiniz. Yer paylaşımı, her zaman ana makine görünümüyle (oluşturulduğu görünüm) aynı boyut ve konuma sahiptir. Bu sayede, ana makine görünümünün önünde görünen ancak ana makine görünümünün sınırlarını genişletemeyen içeriği ekleyebilirsiniz.
ViewOverlay
kullanmak, özellikle bir görünümü kapsayıcısının dışına kaydırma veya görünüm hiyerarşisini etkilemeden öğeleri ekranda taşıma gibi animasyonlar oluşturmak istediğinizde kullanışlıdır. Bununla birlikte, bir yer paylaşımının kullanılabilir alanı ana makine görünümüyle aynı alanla sınırlı olduğundan, düzende kendi konumunun dışına çıkan bir görünümü canlandırmak isterseniz bir üst görünümden, istenen düzen sınırlarına sahip olan bir yer paylaşımı kullanmanız gerekir.
Button
gibi bir widget görünümü için yer paylaşımı oluşturduğunuzda, add(Drawable)
yöntemini çağırarak yer paylaşımına Drawable
nesneleri ekleyebilirsiniz. RelativeLayout
gibi bir düzen görünümü için getOverlay()
yöntemini çağırırsanız döndürülen nesne ViewGroupOverlay
olur. ViewGroupOverlay
sınıfı, add(View)
yöntemini çağırarak View
nesneleri eklemenize de olanak tanıyan bir ViewOverlay
alt sınıfıdır.
Not: Bir yer paylaşımına eklediğiniz tüm çekilebilir öğeler ve görünümler yalnızca görseldir. Odak veya giriş etkinliklerini alamazlar.
Örneğin, aşağıdaki kod, görünümü üst görünümün yer paylaşımına yerleştirip ardından bu görünümde bir çeviri animasyonu gerçekleştirerek sağa kayan bir görünümü canlandırır:
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();
Optik sınır düzeni
Artık dokuz parçalı arka plan resimleri içeren görünümlerde, bu görünümlerin "klip" sınırları yerine arka plan resminin "optik" sınırları temel alınarak komşu görünümlerle hizalanmaları gerektiğini belirtebilirsiniz.
Örneğin, şekil 1 ve 2'nin her biri aynı düzeni göstermektedir. Ancak şekil 1'deki sürümde klip sınırları (varsayılan davranış), şekil 2'de ise optik sınırlar kullanılmıştır. Düğme ve fotoğraf çerçevesi için kullanılan dokuz yamalı resimlerin kenarlarında dolgu bulunduğundan dolayı, klip sınırları kullanılırken birbirleriyle veya metinle hizalı görünmüyorlar.
Not: Şekil 1 ve 2'deki ekran görüntüsünde "Düzen sınırlarını göster" geliştirici ayarı etkindir. Her görünüm için kırmızı çizgiler optik sınırları, mavi çizgiler klip sınırlarını ve pembe çizgiler kenar boşluklarını belirtir.
![](https://developer.android.google.cn/static/images/tools/clipbounds_2x.png?authuser=9&hl=tr)
Şekil 1. Klip sınırlarını kullanan düzen (varsayılan).
![](https://developer.android.google.cn/static/images/tools/opticalbounds_2x.png?authuser=9&hl=tr)
2. Şekil. Optik sınırlar kullanan düzen.
Görünümleri optik sınırlarına göre hizalamak için üst düzenlerden birinde android:layoutMode
özelliğini "opticalBounds"
olarak ayarlayın. Örnek:
<LinearLayout android:layoutMode="opticalBounds" ... >
![](https://developer.android.google.cn/static/images/tools/ninepatch_opticalbounds_2x.png?authuser=9&hl=tr)
3. Şekil. Holo düğmesinin dokuz yamanın optik sınırlara sahip yakınlaştırılmış görünümü.
Bunun işe yaraması için, görünümlerinizin arka planına uygulanan dokuz yamalık görüntünün, dokuz yama dosyasının alt ve sağ tarafı boyunca kırmızı çizgiler kullanarak optik sınırları belirtmesi gerekir (Şekil 3'te gösterildiği gibi). Kırmızı çizgiler, resmin optik sınırları dışında klip sınırlarından çıkarılması gereken bölgeyi gösterir.
Düzeninizde bir ViewGroup
için optik sınırları etkinleştirdiğinizde tüm alt görünümler, android:layoutMode
değerini "clipBounds"
olarak ayarlayıp bir grup için geçersiz kılmadığınız sürece tüm alt görünümler optik sınırlar düzen modunu devralır. Tüm düzen öğeleri, kendi alt görünümlerinin optik sınırlarını da dikkate alarak içlerindeki görünümlerin optik sınırlarına göre kendi sınırlarını uyarlar. Bununla birlikte, düzen öğeleri (ViewGroup
alt sınıfları) şu anda kendi arka planlarına uygulanan dokuz yamalık görüntüler için optik sınırları desteklememektedir.
View
, ViewGroup
veya bunların alt sınıflarını alt sınıflandırarak özel bir görünüm oluşturursanız görünümünüz bu optik bağlı davranışları devralır.
Not: Holo temasının desteklediği tüm widget'lar Button
, Spinner
, EditText
ve diğerleri de dahil olmak üzere optik sınırlarla güncellenmiştir. Yani, uygulamanız Holo teması (Theme.Holo
, Theme.Holo.Light
vb.) uyguluyorsa android:layoutMode
özelliğini "opticalBounds"
olarak ayarlayarak bu özellikten anında yararlanabilirsiniz.
9 parçalı çizim aracıyla kendi dokuz yama uygulanmış görüntüleriniz için optik sınırlar belirtmek üzere kenarlık piksellerini tıklarken Ctrl tuşunu basılı tutun.
Dikdörtgen değerleri için animasyon
Artık yeni RectEvaluator
ile iki Rect
değeri arasında animasyon oluşturabilirsiniz. Bu yeni sınıf, ValueAnimator.setEvaluator()
sınıfına geçirebileceğiniz bir TypeEvaluator
uygulamasıdır.
Pencere ekleme ve odaklama işleyicisi
Daha önce, görüntünüz pencereye eklendiğinde/çıkarıldığında veya odak noktası değiştiğinde dinleme yapmak istediğinizde, sırasıyla onAttachedToWindow()
ve onDetachedFromWindow()
ya da onWindowFocusChanged()
uygulamak için View
sınıfını geçersiz kılmanız gerekiyordu.
Artık, ekleme ve çıkarma etkinlikleri almak için ViewTreeObserver.OnWindowAttachListener
uygulayabilir ve addOnWindowAttachListener()
ile bir görünümde ayarlayabilirsiniz.
Odaklanma etkinlikleri almak için de ViewTreeObserver.OnWindowFocusChangeListener
özelliğini uygulayabilir ve addOnWindowFocusChangeListener()
ile bir görünümde ayarlayabilirsiniz.
TV fazla tarama desteği
Uygulamanızın her televizyonda ekranın tamamını doldurduğundan emin olmak için artık uygulama düzeniniz için fazla taramayı etkinleştirebilirsiniz. Taşma modu, FLAG_LAYOUT_IN_OVERSCAN
işaretiyle belirlenir. Bu işareti Theme_DeviceDefault_NoActionBar_Overscan
gibi platform temalarıyla veya windowOverscan
stilini özel bir temada etkinleştirerek etkinleştirebilirsiniz.
Ekran yönü
<activity>
etiketinin screenOrientation
özelliği artık kullanıcının otomatik rotasyon tercihini karşılamak için ek değerleri destekliyor:
"userLandscape"
- Kullanıcının otomatik döndürmeyi devre dışı bırakması dışında,
"sensorLandscape"
ile aynı şekilde davranır. Kullanıcı otomatik döndürmeyi devre dışı bırakırsa cihaz normal yatay yönde kilitlenir ve dönmez. "userPortrait"
"sensorPortrait"
ile aynı şekilde davranır. Kullanıcının otomatik döndürmeyi devre dışı bırakması dışında, cihaz normal dikey yönde kilitlenir ve dönmez."fullUser"
"fullSensor"
ile aynı şekilde davranır ve dört yönde de döndürmeye izin verir. Ancak kullanıcı otomatik döndürmeyi devre dışı bıraktığında kullanıcının tercih ettiği yönde kilitlenir.
Ayrıca, uygulamanızın yönünü ekranın mevcut yönüne kilitlemek için artık "locked"
işlevini de beyan edebilirsiniz.
Döndürme animasyonları
WindowManager
uygulamasındaki yeni rotationAnimation
alanı, sistem ekran yönlerini değiştirdiğinde kullanmak istediğiniz üç animasyondan birini seçmenize olanak tanır. Bu üç animasyon şunlardır:
Not: Bu animasyonlar yalnızca, etkinliğinizi Theme.Holo.NoActionBar.Fullscreen
gibi temalarla etkinleştirebileceğiniz "tam ekran" modunu kullanacak şekilde ayarladıysanız kullanılabilir.
Örneğin, aşağıda "geçişli" animasyonunu nasıl etkinleştirebileceğiniz gösterilmektedir:
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); ... }
Kullanıcı Girişi
Yeni sensör türleri
Yeni TYPE_GAME_ROTATION_VECTOR
sensörü, manyetik parazitler hakkında endişelenmeden cihazın dönüşlerini algılamanızı sağlar. TYPE_GAME_ROTATION_VECTOR
, TYPE_ROTATION_VECTOR
sensöründen farklı olarak manyetik kuzeyi temel almaz.
Yeni TYPE_GYROSCOPE_UNCALIBRATED
ve TYPE_MAGNETIC_FIELD_UNCALIBRATED
sensörleri, önyargı tahminlerini dikkate almadan ham sensör verileri sağlar. Yani mevcut TYPE_GYROSCOPE
ve TYPE_MAGNETIC_FIELD
sensörleri, sırasıyla jiroskop ve sert demirden kaynaklanan tahmini sapmayı hesaba katan sensör verileri sağlar. Bu sensörlerin yeni "kalibre edilmemiş" sürümleri ise ham sensör verilerini ve tahmini önyargı değerlerini ayrı olarak sunar. Bu sensörler, harici verilerle tahmini önyargıyı geliştirerek sensör verileri için kendi özel kalibrasyonunuzu sağlamanıza imkan tanır.
Bildirim Dinleyici
Android 4.3, NotificationListenerService
adlı yeni bir hizmet sınıfı ekleyerek uygulamanızın sistem tarafından yayınlanan yeni bildirimler hakkında bilgi almasını sağlar.
Uygulamanız şu anda sistem bildirimlerine erişmek için Accessibility Service API'leri kullanıyorsa uygulamanızı bu API'leri kullanacak şekilde güncellemeniz gerekir.
Contacts Provider
"İletişim kurulabilir kişiler" sorgusu
Yeni Kişi Sağlayıcı sorgusu (Contactables.CONTENT_URI
), belirtilen sorguyla eşleşen tüm kişilere ait tüm e-posta adreslerini ve telefon numaralarını içeren bir Cursor
edinmenin etkili bir yoludur.
Kişi deltaları için sorgu
Kişi verilerinde yapılan son değişiklikleri verimli bir şekilde sorgulamanıza olanak tanıyan yeni API'lar Kişi Sağlayıcı'ya eklendi. Daha önce, kişi verilerinde bir değişiklik olduğunda uygulamanıza bildirim gönderilebiliyordu. Ancak neyin değiştiğini bilmiyor ve tüm kişileri geri alıp sonradan değişikliği keşfetmek için bunları tekrarlamanız gerekiyor.
Eklemeler ve güncellemelerdeki değişiklikleri izlemek için artık CONTACT_LAST_UPDATED_TIMESTAMP
parametresini, yalnızca sağlayıcıyı en son sorguladığınızdan bu yana değişen kişileri sorgulamak için seçiminize dahil edebilirsiniz.
Hangi kişilerin silindiğini izlemek için ContactsContract.DeletedContacts
adlı yeni tablo, silinen kişilerin günlüğünü sağlar (ancak silinen her kişi sınırlı bir süre için bu tabloda tutulur). CONTACT_LAST_UPDATED_TIMESTAMP
ile benzer bir şekilde, sağlayıcıyı en son sorguladığınızdan bu yana hangi kişilerin silindiğini kontrol etmek için yeni CONTACT_DELETED_TIMESTAMP
seçim parametresini kullanabilirsiniz. Tablo, günlüğün saklanacağı gün sayısını (milisaniye cinsinden) içeren sabit DAYS_KEPT_MILLISECONDS
değerini de içerir.
Ayrıca, kullanıcı sistem ayarları menüsünden kişiler depolama alanını temizlediğinde Kişi Sağlayıcı artık CONTACTS_DATABASE_CREATED
işlemini yayınlayarak Kişiler Sağlayıcı veritabanını etkili bir şekilde yeniden oluşturur. Uygulamalara, depoladıkları tüm iletişim bilgilerini bırakmaları ve bunları yeni bir sorguyla yeniden yüklemeleri gerektiğini bildirmek için tasarlanmıştır.
Kişilerde değişiklik olup olmadığını kontrol etmek için bu API'leri kullanan örnek kod için SDK Örnekleri'nde bulunan ApiDemos örneğine bakın.
Yerelleştirme
Çift yönlü metin için iyileştirilmiş destek
Android'in önceki sürümleri, sağdan sola doğru olan (RTL) dilleri ve düzeni destekler, ancak bazen karma yönlü metinleri düzgün bir şekilde işleyemez. Bu nedenle Android 4.3, metni hiçbir bölümünü bozmadan ters yönlü içeriklerle doğru şekilde biçimlendirmenize yardımcı olan BidiFormatter
API'lerini ekler.
Örneğin, "Bunu mu demek istediniz: 15 Bay Street, Laurel, CA?" gibi dize değişkeniyle bir cümle oluşturmak istediğinizde, normalde yerelleştirilmiş bir dize kaynağını ve değişkeni şuna geçirirsiniz: 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);
Ancak yerel ayar İbraniceyse, biçimlendirilmiş dize şu şekilde ortaya çıkar:
多Potential Bay Street, Laurel, California?hl=tr adresinden erişebileceğiniz siz cesaretlendirebilirsiniz.
Bu, "Bay Street"in "15" rakamının kalması gerektiği için yanlış. Çözüm, BidiFormatter
yöntemini ve unicodeWrap()
yöntemini kullanmaktır. Örneğin, yukarıdaki kod şöyle olur:
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));
Varsayılan olarak unicodeWrap()
, metin yönü için ilk sinyal içeriğin bütünü için uygun yönü temsil etmediğinde işlerin kesintiye uğramasına yol açabilecek birinci güçlü yön tahmini sezgisel yöntemini kullanır.
Gerekirse TextDirectionHeuristic
sabit değerlerinden birini TextDirectionHeuristics
değerinden unicodeWrap()
değerine geçirerek farklı bir buluşsal yöntem belirtebilirsiniz.
Not: Bu yeni API'ler Android'in önceki sürümlerinde Android Destek Kitaplığı üzerinden BidiFormatter
sınıfı ve ilgili API'lerle kullanılabilir.
Erişilebilirlik Hizmetleri
Önemli etkinlikleri yönetme
AccessibilityService
, artık onKeyEvent()
geri çağırma yöntemiyle önemli giriş etkinlikleri için geri çağırma alabilir. Bu şekilde erişilebilirlik hizmetiniz, klavye gibi tuş tabanlı giriş cihazları için girişi işleyebilir ve bu etkinlikleri, daha önce yalnızca dokunmatik giriş veya cihazın yön tuşları ile mümkün olabilen özel işlemlere dönüştürebilir.
Metin seçme ve kopyalama/yapıştırma
AccessibilityNodeInfo
artık AccessibilityService
tarafından bir düğümde metin seçme, kesme, kopyalama ve yapıştırma işlemleri yapılmasına olanak sağlayan API'ler sunulmaktadır.
Kesilecek veya kopyalanacak metin seçimini belirtmek için erişilebilirlik hizmetiniz yeni ACTION_SET_SELECTION
işlemini kullanarak seçimin başlangıç ve bitiş konumunu ACTION_ARGUMENT_SELECTION_START_INT
ve ACTION_ARGUMENT_SELECTION_END_INT
ile geçirebilir.
Alternatif olarak, mevcut ACTION_NEXT_AT_MOVEMENT_GRANULARITY
işlemini (daha önce yalnızca imleç konumunu taşımak için) kullanıp imleç konumunu değiştirerek ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
bağımsız değişkenini ekleyerek metin seçebilirsiniz.
Ardından ACTION_CUT
ve ACTION_COPY
ile kesebilir veya kopyalayabilir ve daha sonra ACTION_PASTE
ile yapıştırabilirsiniz.
Not: Bu yeni API'ler ayrıca Android'in önceki sürümlerinde Android Destek Kitaplığı üzerinden AccessibilityNodeInfoCompat
sınıfıyla kullanılabilir.
Erişilebilirlik özelliklerini bildirme
Android 4.3'ten itibaren bir erişilebilirlik hizmetinin, belirli erişilebilirlik özelliklerini kullanmak için meta veri dosyasında erişilebilirlik özelliklerini beyan etmesi gerekir. Meta veri dosyasında bu özellik istenmemişse özellik, işlemsiz olacaktır. Hizmetinizin erişilebilirlik özelliklerini bildirmek için AccessibilityServiceInfo
sınıfındaki çeşitli "özellik" sabitlerine karşılık gelen XML özniteliklerini kullanmanız gerekir.
Örneğin, bir hizmet flagRequestFilterKeyEvents
özelliğini istemezse önemli etkinlikleri almaz.
Test ve Hata Ayıklama
Otomatik kullanıcı arayüzü testi
Yeni UiAutomation
sınıfı, test otomasyonu için kullanıcı işlemlerini simüle etmenizi sağlayan API'ler sunar. Platformun AccessibilityService
API'lerini kullanan UiAutomation
API'leri, ekran içeriğini incelemenize, rastgele klavye ve dokunma etkinlikleri eklemenize olanak tanır.
UiAutomation
örneğini almak için Instrumentation.getUiAutomation()
numaralı telefonu arayın. Bu işlemin işe yaraması için adb shell
kaynağından InstrumentationTestCase
öğenizi çalıştırırken instrument
komutuyla -w
seçeneğini sağlamanız gerekir.
UiAutomation
örneğiyle, executeAndWaitForEvent()
çağırıp, çalışması için Runnable
ileterek, işlem için zaman aşımı süresi vererek ve UiAutomation.AccessibilityEventFilter
arayüzünü uygulayarak uygulamanızı test etmek amacıyla rastgele etkinlikler yürütebilirsiniz. UiAutomation.AccessibilityEventFilter
uygulamanızda, ilgilendiğiniz etkinlikleri filtrelemenize ve belirli bir test durumunun başarılı veya başarısız olduğunu belirlemenize olanak tanıyan bir çağrı alırsınız.
Bir test sırasında tüm etkinlikleri gözlemlemek için bir UiAutomation.OnAccessibilityEventListener
uygulaması oluşturun ve setOnAccessibilityEventListener()
işlevine iletin.
Daha sonra bir etkinlik gerçekleştiğinde işleyici arayüzünüz onAccessibilityEvent()
çağrısı alır ve etkinliği açıklayan bir AccessibilityEvent
nesnesi alır.
uiautomator gibi kullanıcı arayüzü test araçlarının geliştirilmesini teşvik etmek için UiAutomation
API'lerinin çok düşük düzeyde kullanıma sunduğu çeşitli başka işlemler vardır. Örneğin, UiAutomation
şunları da yapabilir:
- Giriş etkinliklerini ekleme
- Ekranın yönünü değiştirme
- Ekran görüntüsü alma
Kullanıcı arayüzü test araçları için en önemlisi, UiAutomation
API'lerinin Instrumentation
'in aksine uygulama sınırları içinde çalışır.
Uygulamalar için Systrace etkinlikleri
Android 4.3, Trace
sınıfını iki statik yöntemle ekler: beginSection()
ve endSection()
. Bu yöntem, sistem izleme raporuna dahil edilecek kod bloklarını tanımlamanıza olanak tanır. Uygulamanızda izlenebilir kod bölümleri oluşturularak sistem izleme günlükleri, uygulamanızın içinde yavaşlamanın nerede gerçekleştiğine dair çok daha ayrıntılı bir analiz sağlar.
Systrace aracını kullanma hakkında bilgi için Systrace ile Görüntülü Reklam Ağı ve Performansı Analiz Etme başlıklı makaleyi okuyun.
Güvenlik
Uygulama özel anahtarları için Android anahtar deposu
Android artık KeyStore
tesisinde, Android Key Store adı verilen özel bir Java Güvenlik Sağlayıcısı sunuyor. Bu hizmet, yalnızca uygulamanız tarafından görülebilecek ve kullanılabilecek özel anahtarlar oluşturmanıza ve kaydetmenize olanak tanır. Android Anahtar Mağazası'nı yüklemek için "AndroidKeyStore"
uygulamasını KeyStore.getInstance()
adresine geçirin.
Android Anahtar Mağazası'nda uygulamanızın özel kimlik bilgilerini yönetmek için KeyPairGeneratorSpec
ile KeyPairGenerator
ile yeni bir anahtar oluşturun. Önce getInstance()
yöntemini çağırarak KeyPairGenerator
örneği alın. Ardından initialize()
yöntemini çağırarak bunu, KeyPairGeneratorSpec.Builder
kullanarak alabileceğiniz KeyPairGeneratorSpec
örneğinin bir örneğini iletin.
Son olarak generateKeyPair()
numaralı telefonu arayarak KeyPair
cihazınızı alın.
Donanım kimlik bilgileri deposu
Android artık KeyChain
kimlik bilgileriniz için donanım destekli depolamayı da desteklemektedir. Böylece, anahtarların ayıklanmaması amacıyla daha fazla güvenlik sağlanır. Yani anahtarlar, donanım destekli anahtar deposuna (Secure Element, TPM veya TrustZone) yer aldığında şifreleme işlemleri için kullanılabilir ancak özel anahtar materyali dışa aktarılamaz. İşletim sistemi çekirdeği bile bu anahtar materyaline erişemez. Android destekli tüm cihazlar donanımda depolamayı desteklemese de, çalışma zamanında KeyChain.IsBoundKeyAlgorithm()
numaralı telefonu arayarak donanım destekli depolama alanı olup olmadığını kontrol edebilirsiniz.
Manifest Beyanları
Tanımlanabilir gerekli özellikler
Aşağıdaki değerler artık <uses-feature>
öğesinde desteklenmektedir. Böylece uygulamanızın yalnızca uygulamanızın ihtiyaç duyduğu özellikleri sağlayan cihazlara yüklendiğinden emin olabilirsiniz.
FEATURE_APP_WIDGETS
- Uygulamanızın bir uygulama widget'ı sağladığını ve yalnızca kullanıcıların uygulama widget'ları yerleştirebileceği ana ekran veya benzer bir konuma sahip cihazlara yüklenmesi gerektiğini beyan eder.
Örnek:
<uses-feature android:name="android.software.app_widgets" android:required="true" />
FEATURE_HOME_SCREEN
- Uygulamanızın Ana ekran yedeği olarak davrandığını ve yalnızca üçüncü taraf Ana ekran uygulamalarını destekleyen cihazlara yüklenmesi gerektiğini beyan eder.
Örnek:
<uses-feature android:name="android.software.home_screen" android:required="true" />
FEATURE_INPUT_METHODS
- Uygulamanızın özel bir giriş yöntemi (
InputMethodService
ile oluşturulmuş klavye) sağladığını ve yalnızca üçüncü taraf giriş yöntemlerini destekleyen cihazlara yüklenmesi gerektiğini beyan ediyor. Örnek:<uses-feature android:name="android.software.input_methods" android:required="true" />
FEATURE_BLUETOOTH_LE
- Uygulamanızın Bluetooth Düşük Enerji API'lerini kullandığını ve yalnızca Bluetooth Düşük Enerji üzerinden diğer cihazlarla iletişim kurabilen cihazlara yüklenmesi gerektiğini beyan eder.
Örnek:
<uses-feature android:name="android.software.bluetooth_le" android:required="true" />
Kullanıcı izinleri
Aşağıdaki değerler, uygulamanızın belirli API'lere erişmek için gerektirdiği izinleri belirtmek amacıyla artık <uses-permission>
'da desteklenmektedir.
BIND_NOTIFICATION_LISTENER_SERVICE
- Yeni
NotificationListenerService
API'lerini kullanmak için gereklidir. SEND_RESPOND_VIA_MESSAGE
ACTION_RESPOND_VIA_MESSAGE
amacını almak için gereklidir.
Android 4.3'teki tüm API değişikliklerinin ayrıntılı görünümü için API Farkları Raporu'na bakın.