Android 4.3 API'leri

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 sahibin hesaplarına erişime izin verme.

    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.

  • Hesaplarda değişiklik yapamadığınızda belirli işlevleri devre dışı bırakın.

    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.

  • Özel hesaplara erişemediğinizde uygulamanızı devre dışı bırakın.

    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.

    Şekil 1. Klip sınırlarını kullanan düzen (varsayılan).

    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" ... >
    

    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.