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 Jelly Bean sürümüne ait bir güncellemedir. Bu belgede en dikkat çeken 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öründe 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 oluşturun.

Hedef API düzeyinizi güncelleyin

Uygulamanızı Android 4.3 çalıştıran cihazlar için daha iyi optimize etmek istiyorsanız targetSdkVersion özelliğini "18" olarak ayarlamanız, Android 4.3 sistem görüntüsüne yüklemeniz, test etmeniz ve ardından bu değişikliği içeren bir güncelleme yayınlamanız gerekir.

Kodunuza, minSdkVersion tarafından desteklenmeyen API'leri yürütmeden önce sistem API düzeyini kontrol eden koşullar ekleyerek eski sürümleri desteklerken Android 4.3'te API'leri kullanabilirsiniz. Geriye dönük uyumluluğun sürdürülmesi hakkında daha fazla bilgi için Farklı Platform Sürümlerini Destekleme bölümünü okuyun.

Android Destek Kitaplığı'nda, yeni özellikleri platformun eski sürümlerine 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ızda dolaylı intent'ler kullanılıyorsa...

Uygulamanız kısıtlanmış profil ortamında hatalı davranabilir.

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ılmış olabilir. Dolayısıyla, uygulamanız hangi uygulamaların kullanılabilir olduğu konusunda varsayımda bulunmamalıdır. Çünkü bir uygulamanın Intent işlemini kullanmak için kullanılabilir olup olmadığını doğrulamadan startActivity() çağrısı yaparsanız uygulamanız kısıtlanmış bir profilde kilitlenebilir.

Dolaylı intent kullanırken her zaman resolveActivity() veya queryIntentActivities() yöntemini çağırarak bir uygulamanın bu niyeti yerine getirmek için kullanılabilir olduğunu doğrulamanız gerekir. Örneğin:

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ı davranabilir.

Varsayılan olarak, kısıtlı bir profil ortamındaki kullanıcılar 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 uygulamanızın hesap gerektiren özelliklerini 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.

Android'in önceki sürümlerinde VideoView widget'ı, layout_height ve layout_width için "wrap_content" değerini yanlış bir şekilde "match_parent" ile aynı olacak şekilde hesapladı. Yükseklik veya genişlik için "wrap_content" kullanıldığında, önceden istediğiniz video düzeni sağlanmış olsa da bu işlem Android 4.3 ve sonraki sürümlerde videonun çok daha küçük olmasına neden olabilir. Sorunu düzeltmek için "wrap_content" yerine "match_parent" kullanın ve videonuzun Android 4.3 ile 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şturduğunda, profilde hangi uygulamaların kullanılabileceği gibi kısıtlamaları etkinleştirebilir. 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ıtlanmış bir profil ortamında çalışırken uygulamanızda ne tür içerik sunulduğunu 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 kullanıcı arayüzünü 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ığını, açıklamasını ve aşağıdaki veri türlerinden birini tanımlar:

  • Doğru veya yanlış olan bir kısıtlama için TYPE_BOOLEAN.
  • Aynı anda kullanılamayan birden fazla seçeneğe (radyo düğmesi seçimleri) sahip bir kısıtlama için TYPE_CHOICE.
  • Birlikte birbirini dışlayan olmayan birden fazla seçeneğe (onay kutusu seçimleri) sahip bir kısıtlama için TYPE_MULTI_SELECT.

Daha sonra, tüm RestrictionEntry nesnelerini bir ArrayList içine yerleştirir ve ekstra EXTRA_RESTRICTIONS_LIST değeri olarak yayın alıcısının sonucuna yerleştirirsiniz.

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, 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ğerlerle işlenemeyen daha spesifik kısıtlamalar sağlamak isterseniz kullanıcının kısıtlamaları belirtebileceği ve kullanıcıların kısıtlama ayarlarından 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 dahil edin. Bu ekstra, başlatılacak Activity sınıfını belirten bir Intent belirtmelidir (amaçla EXTRA_RESTRICTIONS_INTENT parametresini 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 RestrictionEntry nesnelerini mi yoksa anahtar/değer çiftlerini mi belirttiğinize bağlı olarak EXTRA_RESTRICTIONS_LIST veya EXTRA_RESTRICTIONS_BUNDLE anahtarını kullanarak fazladan bir değerde kısıtlama değerleri 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ış bir profil tarafından kullanılabilir ancak varsayılan olarak bu hesaplara AccountManager API'lerinden erişilemez. Kısıtlanmış bir profildeyken AccountManager ile bir hesap eklemeye çalışırsanız başarısız sonuç alırsınız. Bu kısıtlamalar nedeniyle şu üç seçeneğiniz vardır:

  • Kısıtlanmış bir profilden kanal sahibinin hesaplarına erişime izin verin.

    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ği etkinleştirmek, uygulamanızın kısıtlanmış profillerden birincil kullanıcı hesaplarına erişmesini sağlar. Dolayısıyla, buna yalnızca uygulamanız tarafından görüntülenen bilgiler, hassas olarak değerlendirilen kimliği tanımlayabilecek bilgileri (PII) ortaya çıkarmıyorsa izin vermelisiniz. Sistem ayarları, birincil kullanıcıya uygulamanızın hesaplarına kısıtlanmış profiller verdiği konusunda bilgi verir. Bu nedenle kullanıcı, hesap erişiminin uygulamanızın işlevselliği için önemli olduğunu açıkça anlamalıdır. Mümkünse uygulamanızda ne kadar hesap erişimine izin verildiğini tanımlayan yeterli kısıtlama kontrollerini de birincil kullanıcı için sağlamanız gerekir.

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

    Hesapları kullanmak istiyor ancak aslında uygulamanızın birincil işlevi için ihtiyaç duymuyorsanız hesap kullanılabilirliğini kontrol edebilir ve kullanılamadığında özellikleri devre dışı bırakabilirsiniz. Öncelikle mevcut bir hesap olup olmadığını kontrol etmeniz gerekir. Değilse getUserRestrictions() yöntemini çağırarak yeni bir hesap oluşturmanın mümkün olup olmadığını sorgulayın ve sonuçtaki DISALLOW_MODIFY_ACCOUNTS ekstra durumunu kontrol edin. true ise uygulamanızın hesaplara erişim gerektirdiği işlevlerini devre dışı bırakmanız gerekir. Örneğin:

    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 özellikleri bildirmemeniz gerekir.

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

    Uygulamanız bir hesaptaki hassas kişisel bilgilere dayalı olduğu ve kısıtlanmış profiller şu anda yeni hesap ekleyemediği için uygulamanızın 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ı, sahibin kişisel e-posta adresinin kısıtlanmış profillerde kullanılamaması gerektiğinden, bu özelliği kısıtlanmış profillerde devre dışı bırakmak için kullanı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 birimleriyle 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 kullanırken bazı farklılıklar olabileceğini göz önünde bulundurun. En önemlisi, artık bir BluetoothAdapter edinmek, bağlı cihazların listesini almak ve bir cihazın durumunu kontrol etmek 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 edinebilirsiniz:

    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 üzerinden startLeScan() numaralı telefonu arayarak BluetoothAdapter.LeScanCallback arayüzünün uygulanmasını sağlayın. Bluetooth bağdaştırıcısı bir Bluetooth LE çevre birimi algıladığında BluetoothAdapter.LeScanCallback uygulamanız onLeScan() yöntemine çağrı alır. Bu yöntemde, 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ğlanır.

    Yalnızca belirli türlerdeki çevre birimleri için tarama yapmak istiyorsanız bunun yerine startLeScan() yöntemini çağırabilir ve uygulamanızın desteklediği GATT hizmetlerini belirten UUID nesneleri dizisi ekleyebilirsiniz.

    Not: Önceki API'leri kullanarak yalnızca Bluetooth LE cihazları veya Klasik Bluetooth cihazları tarayabilirsiniz. Hem LE hem de Klasik Bluetooth cihazları aynı anda tarayamazsınız.

    Ardından bir Bluetooth LE çevre birimine bağlanmak için ilgili BluetoothDevice nesnesinde connectGatt() çağrısı yaparak BluetoothGattCallback öğesini uygulayın. BluetoothGattCallback uygulamanız, cihazla ve diğer etkinliklerle olan bağlantı durumu hakkında geri çağırmalar alır. onConnectionStateChange() geri çağırması sırasında, yöntem yeni durum olarak STATE_CONNECTED değerini geçerse cihazla iletişim kurmaya başlayabilirsiniz.

    Bir cihazda Bluetooth özelliklerine erişmek 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 tanımlamaya çalışırken yakındaki erişim noktalarını tarayarak konumun belirlenmesine yardımcı olmak için kablosuz bağlantı kullanabilir. Ancak kullanıcılar pilden tasarruf etmek için genellikle kablosuz bağlantıyı kapalı tutar. Bu da konum verilerinin doğruluğunda azalmaya neden olur. Android artık, bir erişim noktasına bağlanmadan konumu elde etmek için kablosuz ağ bağlantısının erişim noktalarını taramasına olanak tanıyan bir salt tarama modu içeriyor. Böylece pil kullanımını önemli ölçüde azaltıyor.

    Kullanıcının konumunu elde etmek istiyorsanız ancak kablosuz bağlantı şu anda kapalıysa startActivity() işlemini ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE işlemi ile yaparak kullanıcıdan yalnızca kablosuz ağ tarama modunu etkinleştirmesini isteyebilirsiniz.

    Kablosuz ağ 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 beri, "Hızlı yanıt" adlı bir özellik, kullanıcıların gelen aramalara aramayı cevaplamaya veya cihazın kilidini açmaya gerek kalmadan anında kısa mesajla yanıt vermesine olanak tanır. Ş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 filtresiyle Service oluşturarak bu mesajları işleyebildiğini belirtebilir.

    Kullanıcı, gelen bir çağrıya hızlı yanıtla yanıt verdiğinde Telefon uygulaması, ACTION_RESPOND_VIA_MESSAGE niyetini alıcıyı (arayan) açıklayan bir URI ve kullanıcının göndermek istediği mesajla birlikte EXTRA_TEXT ekini de gönderir. Hizmetiniz niyeti aldığında mesajı iletmeli ve hemen kendini durdurmalıdır (uygulamanız 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 kendi HTTP (DASH) oynatıcılarınızı ISO/IEC 23009-1 standardına uygun olarak kendi Dinamik Uyarlanabilir Akış (Dinamik Uyarlanabilir Akış) 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 verilerini ayrıştırmaktan ve bağımsız akışları MediaExtractor öğesine geçirmekten sorumludur.

    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üğüne dikkat edin. Ayrıca, DASH medyanızın PSSH meta verilerine erişebilmeniz için getPsshInfo() yöntemi MediaExtractor öğesine 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 endişelerini medya oynatma işleminden ayırarak medya içeriğinizle dijital hak yönetimi (DRM) için modüler bir çözüm sağlar. Örneğin bu API ayrımı, Widevine ile şifrelenmiş içerikleri Widevine medya biçimini kullanmak zorunda kalmadan oynatmanıza olanak tanır. Bu DRM çözümü, DASH Ortak Şifreleme özelliğini de desteklediğinden akış içeriğinizle çeşitli DRM şemaları kullanabilirsiniz.

    Lisans edinme ve temel hazırlık amacıyla, opak anahtar istek mesajları almak ve sunucudan anahtar-yanıt mesajlarını işlemek için MediaDrm uygulamasını kullanabilirsiniz. Uygulamanız, sunucularla kurulan ağ iletişimini yönetmekten sorumludur. MediaDrm sınıfı yalnızca mesajları oluşturma ve işleme becerisini sağlar.

    MediaDrm API'lerinin, Android 4.1 (API düzeyi 16) sürümünde kullanıma sunulan MediaCodec API'leriyle birlikte kullanılması amaçlanmıştır. Bu API'ler, içeriğinizi kodlama ve kodunu çözmek için MediaCodec, şifrelenmiş içerikleri işlemek için MediaCrypto ve içeriğinizi çıkarıp çıkartmak için MediaExtractor API'lerini içerir.

    İlk olarak 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 kurucusuyla birlikte 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 çözme için MediaCodec sınıfını ekledi. Video kodlama sırasında, Android 4.1 medyaya bir ByteBuffer dizisi sağlamanızı gerektirir, ancak Android 4.3 artık kodlayıcıya giriş olarak Surface kullanmanıza izin verir. Örneğin bu, girişleri mevcut bir video dosyasından kodlayabilmenizi veya OpenGL ES'den oluşturulan kareleri kullanabilmenizi sağlar.

    Kodlayıcınızda giriş olarak Surface kullanmak istiyorsanız öncelikle MediaCodec için configure() çağrısı yapın. Ardından Surface numarasını almak için createInputSurface() numaralı telefonu arayın. Bu sayede medya içeriğinizi akış olarak izleyebilirsiniz.

    Örneğin, belirtilen Surface öğesini eglCreateWindowSurface() öğesine ileterek OpenGL bağlamı için 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() işlevini çağırın. Bittiğinde kodlamayı sonlandırmak için signalEndOfInputStream() ve Surface üzerinden release() çağrısı yapın.

    Medya kopyalama

    Yeni MediaMuxer sınıfı, bir ses akışı ile bir video akışı arasında çoğullama yapılmasını sağlar. Bu API'ler, medyada çoğullama (muxlama) işlemi için Android 4.2'de eklenen MediaExtractor sınıfının eşdeğeri olarak görev yapar.

    Desteklenen çıkış biçimleri MediaMuxer.OutputFormat politikasında 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, çoğunlukla MediaCodec ile çalışacak şekilde tasarlanmıştır. Bu sayede, MediaCodec üzerinden video işleme gerçekleştirebilir ve ardından çıkışı MediaMuxer aracılığıyla bir MP4 dosyasına kaydedebilirsiniz. Ayrıca, kodlama veya kodu çözmek zorunda kalmadan medya düzenlemesi yapmak 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 eklenmiştir. Android 4.3 artık bu tür kumandaların oynatma konumunu görüntülemesini ve oynatmayı ileri geri oynatma kontrollerini görüntüleme olanağı sunar. Medya uygulamanız için RemoteControlClient API'leriyle uzaktan kumandayı etkinleştirdiyseniz iki yeni arayüz uygulayarak oynatma işlemine izin verebilirsiniz.

    Öncelikle, setTransportControlsFlags() öğesine geçirerek FLAG_KEY_MEDIA_POSITION_UPDATE işaretini 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 ileri geri oynattığında uygulamanıza medyanızın yeni zaman kodunu bildiren onPlaybackPositionUpdate() geri çağırmasını da 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() yöntemini çağırarak RemoteControlClient cihazınız için bunları ayarlayabilirsiniz.

    Grafik

    OpenGL ES 3.0 desteği

    Android 4.3, OpenGL ES 3.0 için Java arayüzleri ve yerel destek ekler. OpenGL ES 3.0'da sağlanan yeni temel işlevler şunlardır:

    • Gelişmiş görsel efektlerin hızlandırılması
    • Standart bir özellik olarak yüksek kaliteli ETC2/EAC doku sıkıştırma
    • Tam sayı ve 32 bit kayan nokta destekli GLSL ES gölgelendirme dilinin yeni sürümü
    • Gelişmiş doku oluşturma
    • Doku boyutu ve oluşturma arabellek biçimlerinde 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. Örneğin:

    <manifest>
        <uses-feature android:glEsVersion="0x00030000" />
        ...
    </manifest>
    

    Ayrıca, setEGLContextClientVersion() yöntemini çağırarak ve sürüm olarak 3 ile birlikte OpenGL ES bağlamını 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 görüntü ve çeşitli resim ölçekleri sağlamanın basit bir yoludur. Bu yöntem, özellikle animasyon sırasında resminizin ölçeklendirilmesini bekliyorsanız yararlı olabilir.

    Android 4.2 (API düzeyi 17), Bitmap sınıfında mipmaps için destek ekledi. 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 öğesini BitmapDrawable nesnesi için de etkinleştirebilirsiniz.

    Kullanıcı Arayüzü

    Yer paylaşımlarını göster

    Yeni ViewOverlay sınıfı, View üzerinde görsel içerik ekleyebileceğiniz ve düzen hiyerarşisini etkilemeyen şeffaf bir katman sağlar. getOverlay() numaralı telefonu arayarak istediğiniz View için 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 kullanımı, bir görünümü kapsayıcının dışına kaydırma veya öğeleri görünüm hiyerarşisini etkilemeden ekranda taşıma gibi animasyonlar oluşturmak istediğinizde özellikle kullanışlıdır. Bununla birlikte, bir bindirmenin 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 bir bindirme 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 çizimler 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ştirerek sağa kayan bir görünümü canlandırır ve ardından bu görünümde bir çeviri animasyonu gerçekleştirir:

    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 resmi içeren görünümlerin, görünümün "klip" sınırları yerine, arka plan resminin "optik" sınırları temel alınarak komşu görünümlerle hizalanması gerektiğini belirtebilirsiniz.

    Örneğin, 1 ve 2 numaralı şekillerde aynı düzen görülmektedir, ancak Şekil 1'deki versiyonda 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, klip sınırları kullanılırken birbirleriyle veya metinle hizalı olarak görünmezler.

    Not: 1 ve 2 numaralı şekillerdeki 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ı kullanılan 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. Örneğin:

    <LinearLayout android:layoutMode="opticalBounds" ... >
    

    3. Şekil. Optik sınırlar içinde Holo düğmesi dokuz yamasının yakınlaştırılmış görünümü.

    Bunun işe yaraması için, görünümlerinizin arka planına uygulanan dokuz yama resmi, dokuz yama dosyasının alt ve sağ kısmındaki kırmızı çizgileri kullanarak optik sınırları belirtmelidir (Şekil 3'te gösterildiği gibi). Kırmızı çizgiler, klip sınırlarından çıkarılması gereken bölgeyi gösterir ve resmin optik sınırları dışına çıkar.

    Düzeninizde bir ViewGroup için optik sınırları etkinleştirdiğinizde tüm alt görünümler, android:layoutMode ayarını "clipBounds" yaparak 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 aynı zamanda alt görünümlerinin optik sınırlarını 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 yama içeren resimlerin optik sınırlarını 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ı tarafından desteklenen 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.

    Çizim 9 yama aracıyla kendi dokuz yamalı görüntüleriniz için optik sınırları belirtmek için 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() için iletebileceğiniz bir TypeEvaluator uygulamasıdır.

    Pencere ekleme ve odaklama işleyicisi

    Daha önce, görünümün pencereye eklenip eklenmediği veya odağı değiştiğinde dinlemeyi kullanmak istediğinizde, sırasıyla onAttachedToWindow() ve onDetachedFromWindow() veya onWindowFocusChanged() değerlerini uygulamak için View sınıfını geçersiz kılmanız gerekiyordu.

    Artık etkinlik ekleme ve çıkarma etkinlikleri almak için ViewTreeObserver.OnWindowAttachListener uygulamasını uygulayabilir ve addOnWindowAttachListener() ile bir görünümde ayarlayabilirsiniz. Odak etkinlikleri almak için ViewTreeObserver.OnWindowFocusChangeListener öğesini 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 amacıyla artık uygulama düzeniniz için fazla taramayı etkinleştirebilirsiniz. Fazla tarama 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 desteklemektedir:

    "userLandscape"
    "sensorLandscape" ile aynı şekilde davranır ancak kullanıcının otomatik döndürmeyi devre dışı bırakması durumunda cihaz normal yatay yönde kilitlenir ve çevirmez.
    "userPortrait"
    "sensorPortrait" ile aynı şekilde davranır ancak kullanıcı otomatik döndürmeyi devre dışı bırakırsa normal dikey yönde kilitlenir ve çevirmez.
    "fullUser"
    "fullSensor" ile aynı şekilde davranır ve dört yönde de döndürmeye izin verir. Tek fark, kullanıcı otomatik döndürmeyi devre dışı bıraktığında kullanıcının tercih ettiği yönde kilitlenir.

    Ek olarak, artık uygulamanızın yönünü ekranın mevcut yönüne kilitlemek için "locked" öğesini de belirtebilirsiniz.

    Döndürme animasyonları

    WindowManager ürünündeki yeni rotationAnimation alanı, sistem ekran yönünü değiştirdiğinde kullanmak istediğiniz üç animasyondan birini seçmenize olanak tanır. Üç 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, "çapraz geçiş" animasyonunu şu şekilde etkinleştirebilirsiniz:

    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 konusunda endişelenmeden cihazın dönüşlerini algılamanızı sağlar. TYPE_ROTATION_VECTOR sensöründen farklı olarak TYPE_GAME_ROTATION_VECTOR, manyetik kuzeye dayalı değildir.

    Yeni TYPE_GYROSCOPE_UNCALIBRATED ve TYPE_MAGNETIC_FIELD_UNCALIBRATED sensörleri, önyargı tahminleri dikkate alınmadan ham sensör verileri sağlar. Yani mevcut TYPE_GYROSCOPE ve TYPE_MAGNETIC_FIELD sensörleri, sırasıyla cihazdaki jiroskop ve sert demirden kaynaklanan tahmini sapmayı hesaba katan sensör verileri sağlar. Bu sensörlerin "kalibre edilmemiş" yeni sürümleri ise ham sensör verilerini ve tahmini önyargı değerlerini ayrı olarak sunar. Bu sensörler, tahmini önyargıyı harici verilerle iyileştirerek sensör verileri için kendi özel kalibrasyonunuzu sağlamanıza olanak tanır.

    Bildirim Dinleyici

    Android 4.3, uygulamanızın sistem tarafından yayınlanan yeni bildirimler hakkında bilgi almasına olanak tanıyan yeni bir hizmet sınıfı (NotificationListenerService) ekler.

    Uygulamanız şu anda sistem bildirimlerine erişmek için erişilebilirlik hizmeti API'lerini kullanıyorsa uygulamanızı bu API'leri kullanacak şekilde güncellemeniz gerekir.

    Contacts Provider

    "iletişim kurulabilir" 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 Verilerine yapılan son değişiklikleri verimli şekilde sorgulamanıza olanak tanıyan yeni API'lar Kişi Sağlayıcı'ya eklendi. Önceden, kişi verilerinde bir değişiklik olduğunda uygulamanız bilgilendirilebilirdi, ancak neyin değiştiğini tam olarak bilemeyebilirsiniz ve değişikliği keşfetmek için tüm kişileri alıp bu değişiklikleri tekrarlamanız gerekirdi.

    Eklemelerde ve güncellemelerde yapılan değişiklikleri izlemek için artık yalnızca sağlayıcıyı son sorguladığınızdan bu yana değişen kişileri sorgulamak için CONTACT_LAST_UPDATED_TIMESTAMP parametresini seçiminize dahil edebilirsiniz.

    Yeni ContactsContract.DeletedContacts tablosu, hangi kişilerin silindiğini izlemek için silinen kişilerin günlüğünü sağlar (ancak silinen her kişi sınırlı bir süre boyunca bu tabloda tutulur). CONTACT_LAST_UPDATED_TIMESTAMP özelliğine benzer şekilde, sağlayıcıyı en son sorguladığınızdan bu yana hangi kişilerin silindiğini kontrol etmek için yeni seçim parametresini (CONTACT_DELETED_TIMESTAMP) 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ınlar ve böylece Kişiler Sağlayıcı veritabanı etkin bir şekilde yeniden oluşturulur. 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 üzere bu API'leri kullanan örnek kod için SDK Örnekleri bölümünde bulunan ApiDemos örneğine bakın.

    Yerelleştirme

    İki 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, zıt yönlü içerikle metinleri hiçbir bölümünü bozmadan doğru şekilde biçimlendirmenize yardımcı olan BidiFormatter API'lerini ekler.

    Örneğin, "15 Bay Street, Laurel, CA"yı mı demek istediniz? gibi dize değişkeni içeren bir cümle oluşturmak istediğinizde, normalde yerelleştirilmiş bir dize kaynağını ve değişkeni String.format() öğesine iletirsiniz:

    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 İbranice ise, biçimlendirilmiş dize şu şekilde çıkar:

    "/> Australia "/> छट \n Tören 15 Bay Street, Laurel, CA

    "Bay Street"in sonunda "15" kalmaması gerektiği için bu yanlış. Çözüm, BidiFormatter 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(), birinci güçlü yön tahminini kullanır. Bu da metin yönü için ilk sinyal, bütün olarak içeriğin uygun yönünü temsil etmediğinde işleri yanlış sonuçlandırabilir. 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 Destek Kitaplığı aracılığıyla Android'in önceki sürümleri için 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öntemi ile önemli giriş etkinlikleri için geri çağırma alabilir. Bu, erişilebilirlik hizmetinizin klavye gibi tuş tabanlı giriş cihazları için girişi işlemesini ve bu etkinlikleri daha önce yalnızca dokunmatik giriş veya cihazın yön tuşlarıyla yapılabilen özel işlemlere dönüştürmesini sağlar.

    Metin seçme ve kopyalayıp yapıştırma

    AccessibilityNodeInfo artık AccessibilityService ürününün metni seçmesine, kesmesine, kopyalamasına ve bir düğüme yapıştırmasına olanak tanıyan API'ler sunuyor.

    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 kullanarak (daha önce yalnızca imleç konumunu hareket ettirmek için) imleç konumunu değiştirerek ve 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, Android Destek Kitaplığı aracılığıyla AccessibilityNodeInfoCompat sınıfıyla Android'in önceki sürümleri için de kullanılabilir.

    Erişilebilirlik özelliklerini beyan etme

    Android 4.3'ten itibaren bir erişilebilirlik hizmetinin, belirli erişilebilirlik özelliklerini kullanabilmesi için meta veri dosyasında erişilebilirlik özelliklerini beyan etmesi gerekir. Meta veri dosyasında bu özellik istenmezse özellik "işlemsiz" olur. Hizmetinizin erişilebilirlik özelliklerini bildirmek için AccessibilityServiceInfo sınıfındaki çeşitli "özellik" sabitlerine karşılık gelen XML özellikleri 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. UiAutomation API'leri, platformun AccessibilityService API'lerini kullanarak 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. Bunu gerçekleştirmek için, adb shell üzerinde InstrumentationTestCase öğenizi çalıştırırken instrument komutuyla -w seçeneğini sağlamanız gerekir.

    UiAutomation örneğiyle executeAndWaitForEvent() yöntemini çağırıp uygulama 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 bunu setOnAccessibilityEventListener() ürününe iletin. Daha sonra işleyici arayüzünüz bir etkinlik her gerçekleştiğinde 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 bir düzeyde sunduğu çeşitli başka işlemler vardır. Örneğin UiAutomation şunları da yapabilir:

    • Giriş etkinliklerini ekle
    • Ekranın yönünü değiştirin
    • Ekran görüntüsü alma

    En önemlisi de kullanıcı arayüzü test araçları için UiAutomation API'leri Instrumentation API'lerinin 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 sayede systrace raporuna dahil edilecek kod blokları tanımlayabilirsiniz. Uygulamanızda izlenebilir kod bölümleri oluşturarak systrace 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 adlı ö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 gizli 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 KeyPairGeneratorSpec öğesinin bir örneğini iletin. Bunu KeyPairGeneratorSpec.Builder kullanarak alabilirsiniz. Son olarak generateKeyPair() numaralı telefonu arayarak KeyPair cihazınızı alın.

    Donanım kimlik bilgisi deposu

    Android artık KeyChain kimlik bilgileriniz için donanım destekli depolamayı da desteklemektedir. Bu sayede, anahtarların çıkartılmasını engelleyerek daha fazla güvenlik sağlanır. Diğer bir deyişle, anahtarlar donanım destekli anahtar deposuna (Secure Element, TPM veya TrustZone) yerleştirildikten sonra kriptografi işlemleri için kullanılabilir ancak özel anahtar materyali dışa aktarılamaz. İşletim sistemi çekirdeği bile bu anahtar materyaline erişemez. Tüm Android destekli 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ı

    Beyan edilebilir 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 konum bulunan 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 değişimi 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şturulan klavye) sağladığını ve yalnızca üçüncü taraf giriş yöntemlerini destekleyen cihazlara yüklenmesi gerektiğini beyan eder. Örnek:
    <uses-feature android:name="android.software.input_methods" android:required="true" />
    
    FEATURE_BLUETOOTH_LE
    Uygulamanızın Bluetooth Düşük Enerji API'leri 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

    Uygulamanızın belirli API'lere erişmek için ihtiyaç duyduğu izinleri belirtmek amacıyla artık <uses-permission>'te aşağıdaki değerler desteklenmektedir.

    BIND_NOTIFICATION_LISTENER_SERVICE
    Yeni NotificationListenerService API'lerinin kullanımı için gereklidir.
    SEND_RESPOND_VIA_MESSAGE
    ACTION_RESPOND_VIA_MESSAGE niyetini almak için gereklidir.

    Android 4.3'teki tüm API değişikliklerinin ayrıntılı görünümü için API Farklılıkları Raporu'na bakın.