Android 4.3 API'leri

API Düzeyi: 18

Android 4.3 (JELLY_BEAN_MR2) kullanıcılar ve uygulama için yeni özellikler sunan Jelly Bean sürümünün güncellemesidir. birlikte çalışır. Bu dokümanda, en dikkate değer yeni API'lere giriş sunulmaktadır.

Uygulama geliştirici olarak, Android 4.3 sistem imajını ve SDK platformunu en kısa sürede SDK Yöneticisi'nden indirmeniz gerekir. Android 4.3 çalıştıran bir cihazınız yoksa uygulamanızı test etme, Android 4.3 sistemini kullanma görselini kullanarak uygulamanızı Android emülatöründe test edebilirsiniz. Ardından, en son API'leri kullanmaya başlamak için uygulamalarınızı Android 4.3 platformu için derleyin.

Hedef API düzeyinizi güncelleme

Uygulamanızı Android 4.3 çalıştıran cihazlar için daha iyi optimize etmek amacıyla targetSdkVersion dosyanızı "18" olarak ayarlamanız, Android 4.3 sistem resmine yüklemeniz, test etmeniz ve ardından bu değişikliği içeren bir güncelleme yayınlamanız gerekir.

Android 4.3'te API'leri kullanırken eski sürümleri de destekleyebilirsiniz. Bunun için çalıştırmadan önce sistem API düzeyini kontrol eden kodunuza koşullar minSdkVersion cihazınızın desteklemediği API'ler. Geriye dönük uyumluluğun korunması hakkında daha fazla bilgi edinmek için Farklı Destekleri Destekleme Platform Sürümleri.

Ayrıca Android Destek Kitaplığı'nda bulunan ve yapmanıza olanak tanıyan çeşitli API'ler yeni özellikleri kullanıma sunduk.

API düzeylerinin işleyiş şekli hakkında daha fazla bilgi için API nedir? Düzey mi?

Ö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 örtülü niyet kullanıyorsa

Uygulamanız, kısıtlanmış profil ortamında hatalı davranıyor olabilir.

Kısıtlı profil ortamındaki kullanıcılar tüm standart Android uygulamalarını içeriyor. Örneğin, web tarayıcısı ve kamera uygulaması kısıtlanmış bir profilde devre dışı bırakılmış olabilir. Yani uygulamanız, hangi uygulamaların hangi cihazlarda kullanılabilir, çünkü startActivity() hattını Intent için bir uygulamanın kullanılabilir olup olmadığını doğrularsa, uygulamanız kısıtlanmış bir profilde kilitlenebilir.

Örtük intent kullanırken resolveActivity() veya queryIntentActivities() çağrısını yaparak intent'i işleyebilecek bir uygulamanın her zaman mevcut 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 bağlıysa...

Uygulamanız, kısıtlanmış profil ortamında hatalı davranıyor olabilir.

Kısıtlı profil ortamındaki kullanıcılar varsayılan olarak kullanıcı hesaplarına erişemez. Uygulamanız bir Account kullanıyorsa kısıtlanmış bir profilde kullanıldığında 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şturamamasına rağmen 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 daha fazla bilgi için Kısıtlı profilde hesapları destekleme hakkında daha fazla bilgi edinin.

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 "match_parent" ile aynı olacak şekilde yanlış hesapladı. Yükseklik veya genişlik için "wrap_content" kullanılırken istediğiniz video düzeni daha önce sağlanmış olabilir Android 4.3 ve sonraki sürümlerde çok daha küçük bir video alabilirsiniz. Sorunu düzeltmek için "match_parent" ile "wrap_content" ve videonuzun şurada beklendiği gibi göründüğünü doğrulayın: Android 4.3 ve daha eski sürümler.

Kısıtlanmış 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ıtlı profil oluşturduklarında, hangi uygulamaların profil tarafından kullanılabilir. Android 4.3'teki yeni API seti, ayrıntılı ve ayrıntılı analizler kısıtlama ayarlarınızı kontrol edin. Örneğin, yeni API'leri kullanarak kullanıcıların uygulamanız kısıtlanmış profil ortamında çalışırken uygulamanızda hangi tür içeriklerin kullanılabileceğini kontrol etmesine izin verebilirsiniz.

Kullanıcıların oluşturduğunuz kısıtlamaları kontrol etmesine olanak tanıyan 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 sağladığı kısıtlamaları beyan etmeniz gerekir. Sistem, kullanıcının ne istediğini sorgulamak için tüm uygulamaları kullanılabilir kısıtlamalar için uygular, ardından kullanıcı arayüzünü birincil kullanıcının Her kısıtlanmış profilin kısıtlamalarını yönetme

onReceive() yönteminde BroadcastReceiver cihazınızda, 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:

  • Geçerli kısıtlama için TYPE_BOOLEAN doğru veya yanlış olabilir.
  • Şu kısıtlama için TYPE_CHOICE: birbirlerini dışlayan çoklu seçimler (radyo düğmesi seçenekleri)
  • TYPE_MULTI_SELECT, birbirini dışlamayan birden fazla seçeneğe (onay kutusu seçenekleri) sahip kısıtlamalar için kullanılır.

Daha sonra tüm RestrictionEntry nesnelerini bir ArrayList içine koyuyor ve EXTRA_RESTRICTIONS_LIST ekstra.

Sistem, Ayarlar uygulamasında uygulamanızın kısıtlamaları için kullanıcı arayüzünü oluşturur ve her kısıtlamayı, her RestrictionEntry obje için sağladığınız benzersiz anahtarla kaydeder. Kullanıcı, uygulamanızı açtığında mevcut kısıtlamaları getApplicationRestrictions() aranıyor. Bu işlev, RestrictionEntry nesneleriyle tanımladığınız her kısıtlamanın anahtar/değer çiftlerini içeren bir Bundle döndürür.

Boole tarafından işlenemeyen daha spesifik kısıtlamalar sağlamak istiyorsanız ve çoktan seçmeli değerleri kullanıyorsanız kullanıcının, tercihe bağlı olarak bu etkinliği kısıtlama ayarlarından açabilir. Yayın alıcınıza EXTRA_RESTRICTIONS_INTENT ek sonucunu Bundle sonucuna ekleyin. Bu ek öğe bir Intent belirtmelidir Activity sınıfının başlatılmasını belirten ( EXTRA_RESTRICTIONS_INTENT öğesini niyetle iletmek için putParcelable() yöntemini) kullanın. Birincil kullanıcı, özel kısıtlamalar belirlemek üzere etkinliğinize girdiğinde etkinliği, Belirttiğinize bağlı olarak EXTRA_RESTRICTIONS_LIST veya EXTRA_RESTRICTIONS_BUNDLE tuşu sırasıyla RestrictionEntry nesne veya anahtar/değer çiftleri.

Kısıtlanmış profildeki hesapları destekleme

Birincil kullanıcıya eklenen tüm hesaplar, kısıtlanmış profil tarafından kullanılabilir ancak varsayılan olarak AccountManager API'lerinden hesaplara erişilemez. Kısıtlanmış bir durumdayken AccountManager ile bir hesap eklemeye çalışırsanız profilinizde hata sonucu alırsınız. Bu kısıtlamalar nedeniyle: üç seçenek sunulur:

  • Kısıtlı bir profilden sahibin hesaplarına erişime izin verme

    Kısıtlanmış bir profilden hesaba erişmek için <application> etiketine android:restrictedAccountType özelliğini eklemeniz gerekir:

    <application ...
        android:restrictedAccountType="com.example.account.type" >

    Dikkat: Bu özelliği etkinleştirdiğinizde kısıtlanmış profillerden birincil kullanıcının hesaplarına uygulama erişimi. Bu nedenle, yalnızca uygulamanızın gösterdiği bilgiler hassas kabul edilen kimliği tanımlayabilecek bilgileri (PII) içermiyorsa buna izin vermelisiniz. Sistem ayarları, birincil kullanıcıyı uygulamanızın hesaplarına kısıtlanmış profiller verdiğini bilgilendirir. Bu nedenle, kullanıcının hesap erişiminin uygulamanızın işlevi için önemli olduğu açıkça anlaşılmalıdır. Mümkünse birincil kullanıcı için uygulamanızda ne kadar hesap erişimine izin verildiğini tanımlayan yeterli kısıtlama kontrolleri de sunmalısınız.

  • Hesaplarda değişiklik yapılamadığında belirli işlevleri devre dışı bırakın.

    Hesapları kullanmak istiyorsanız, ancak uygulamanızın birincil hesabı için bunlara gerçekten 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. Aksi takdirde, getUserRestrictions() işlevini çağırarak yeni hesap oluşturmanın mümkün olup olmadığını sorgulayın ve sonuçta DISALLOW_MODIFY_ACCOUNTS ekstrasını kontrol edin. Değer true ise uygulamanızdaki hesap erişimi gerektiren tüm işlevleri 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 özellik belirtmemeniz gerekir.

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

    Bunun yerine uygulamanızın kısıtlanmış profiller tarafından kullanılamaması Uygulamanız bir hesaptaki hassas kişisel bilgilere bağımlı olduğu için (ve kullanıcıların şu anda yeni hesap eklenemiyor), <application> etiketine android:requiredAccountType özelliğini ekleyin:

    <application ...
        android:requiredAccountType="com.example.account.type" >

    Örneğin, Gmail uygulaması kısıtlanmış profillerde kendisini devre dışı bırakmak için bu özelliği kullanır. çünkü kullanıcının kişisel e-posta adresi kısıtlanmış profillerde mevcut olmamalıdır.

  • Kablosuz ve Bağlantı

    Bluetooth Düşük Enerji (Akıllı Hazır)

    Android artık android.bluetooth'teki yeni API'lerle Bluetooth Düşük Enerji'yi (LE) destekliyor. Yeni API'lerle Bluetooth Düşük Enerji ile iletişim kuran Android uygulamaları oluşturabilirsiniz. nabız monitörleri ve adım ölçer gibi çevre birimleri

    Bluetooth LE, Android işletim sistemli tüm cihazlarda kullanılamayan bir donanım özelliği olduğundan manifest dosyanızda "android.hardware.bluetooth_le" için bir <uses-feature> öğesi belirtmeniz gerekir:

    <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />

    Android'in Klasik Bluetooth API'lerini zaten biliyorsanız Bluetooth LE API'lerinin kullanımında bazı farklılıklar olduğunu unutmayın. En önemlisi, 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ı olmasıdır. Örneğin, şimdi bu hesaplara nasıl ulaşacağınız BluetoothAdapter:

    Kotlin

    val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
    bluetoothAdapter = bluetoothManager.adapter

    Java

    final BluetoothManager bluetoothManager =
            (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    bluetoothAdapter = bluetoothManager.getAdapter();

    Bluetooth LE çevre birimlerini keşfetmek için BluetoothAdapter üzerinde startLeScan() adlı cihazı çağırarak bir uygulama gerçekleştirin her şeyi BluetoothAdapter.LeScanCallback arayüzününde görebilirsiniz. Bluetooth adaptör bir Bluetooth LE çevre birimi algıladığında BluetoothAdapter.LeScanCallback uygulamanız onLeScan() yöntemini çağırın. Bu yöntemi, değeri temsil eden bir BluetoothDevice nesnesi sağlar algılanan cihaz, cihazın RSSI değeri ve cihazın unutmayın.

    Yalnızca belirli türde çevre birimleri taramak istiyorsanız bunun yerine startLeScan() işlevini çağırabilir ve uygulamanızın desteklediği GATT hizmetlerini belirten bir UUID nesnesi dizisi ekleyebilirsiniz.

    Not: Yalnızca Bluetooth LE cihazları veya önceki API'leri kullanarak Klasik Bluetooth cihazlarını tarayabilirsiniz. Hem LE hem de Classic için tarama yapamazsınız Aynı anda Bluetooth cihazları.

    Daha sonra bir Bluetooth LE çevre birimine bağlanmak için ilgili numaradan connectGatt() adlı cihazı arayın BluetoothDevice nesnesini iletir. BluetoothGattCallback. BluetoothGattCallback uygulamanız, bağlantıyla ilgili geri çağırmalar alır cihazın durumuyla ilgili bilgi verir. onConnectionStateChange() geri çağırması için, yöntem yeni durum olarak STATE_CONNECTED değerini geçerse cihazla iletişim kurmaya başlayabilirsiniz.

    Bir cihazdaki 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ılavuzunu inceleyin.

    Yalnızca kablosuz ağ tarama modu

    Android, kullanıcının konumunu belirlemeye çalışırken yakındaki erişim noktalarını tarayarak konumu belirlemeye yardımcı olmak için kablosuz bağlantıyı kullanabilir. Ancak kullanıcılar genellikle pili korumak için kablosuz bağlantıyı kapalı tutar. Bu da konum verilerinin daha az doğru olmasına neden olur. Android artık cihazın kablosuz bağlantısının, erişim noktasına bağlanmadan konum bilgisi elde etmek için erişim noktalarını taramasına olanak tanıyan ve böylece pil kullanımını büyük ölçüde azaltan yalnızca tarama modunu içeriyor.

    Kullanıcının konumunu öğrenmek istiyorsanız ancak kablosuz bağlantı şu anda kapalıysa kullanıcı, startActivity() öğesini ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE işlemiyle çağırarak yalnızca kablosuz ağ tarama modunu etkinleştirmesini istiyor.

    Kablosuz yapılandırması

    Yeni WifiEnterpriseConfig API'leri, kurumsal hizmetlere yönetilen cihazlar için kablosuz ağ yapılandırmasını otomatikleştirme olanağı tanır.

    Gelen aramalar için hızlı yanıt

    Android 4.0'tan beri "Hızlı yanıt" adlı bir özellik, kullanıcıların gelen aramaları yanıtlamak veya cihazın kilidini açmak zorunda kalmadan anında kısa mesajla yanıtlamasına olanak tanır. Bu hızlı mesajlar şimdiye kadar her zaman varsayılan Mesajlar uygulaması tarafından ele alınıyordu. Artık her uygulama, ACTION_RESPOND_VIA_MESSAGE için intent filtresi içeren bir Service oluşturarak bu mesajları işleyebileceğini belirtebilir.

    Kullanıcı, gelen aramaya hızlı yanıt vererek yanıt verdiğinde Telefon uygulaması URI ile ACTION_RESPOND_VIA_MESSAGE niyeti alıcıyı (arayan) ve EXTRA_TEXT ek açıklamasını açıklayan mesajıyla birlikte görünür. Hizmetiniz, intent'i aldığında mesajı göndermeli ve hemen kendisini durdurmalıdır (uygulamanız bir etkinlik göstermemelidir).

    Bu intent'i almak için SEND_RESPOND_VIA_MESSAGE iznini belirtmeniz gerekir.

    Multimedya

    MediaExtractor ve MediaCodec iyileştirmeleri

    Android artık kendi Dynamic Adaptive'ınızı yazmanızı kolaylaştırıyor ISO/IEC 23009-1 standardına uygun olarak HTTP (DASH) oynatıcıları üzerinden akış, (MediaCodec ve MediaExtractor ürünlerindeki mevcut API'leri kullanarak) Bu API'lerin temel aldığı çerçeve, parçalara ayrılmış MP4 dosyalarının ayrıştırılmasını desteklemek için güncellendi ancak MPD meta verilerini ayrıştırmak ve ayrı ayrı akışları MediaExtractor'e iletmek yine uygulamanızın sorumluluğundadır.

    DASH'i şifrelenmiş içerikle kullanmak istiyorsanız getSampleCryptoInfo() yönteminin, şifrelenmiş her medyanın yapısını açıklayan MediaCodec.CryptoInfo meta verilerini döndürdüğüne dikkat edin. örneklem. Ayrıca, DASH medyanızın PSSH meta verilerine erişebilmeniz için getPsshInfo() yöntemi MediaExtractor işlevine eklendi. Bu yöntem, UUID nesnelerinden oluşan bir eşlemeyi baytlarla dönüştürür. UUID şifreleme şemasını ve veriye özgü baytları belirtir olabileceğini unutmayın.

    Medya DRM

    Yeni MediaDrm sınıfı, DRM sorunlarını medya oynatmadan ayırarak medya içeriğinizle dijital hak yönetimi (DRM) için modüler bir çözüm sunar. Örneğin, bu API ayırımı, Widevine medya biçimini kullanmak zorunda kalmadan Widevine şifrelenmiş içeriği oynatmanıza olanak tanır. Bu DRM çözümü, DASH Ortak Şifrelemesini de destekler. Böylece Akış içeriğinizde çeşitli DRM şemaları kullanabilirsiniz.

    Lisans edinme ve temel hazırlığı için sunucudan opak anahtar isteği mesajları almak ve anahtar yanıtı mesajlarını işlemek üzere MediaDrm'ü kullanabilirsiniz. Sunucularla ağ iletişimini yönetmek uygulamanızın sorumluluğundadır; MediaDrm sınıfı yalnızca mesajları oluşturma ve işleme olanağı sağlar.

    MediaDrm API'lerinin, içeriğinizi kodlamak ve kodlarını çözmek için MediaCodec, şifrelenmiş içeriği işlemek için MediaCrypto ve içeriğinizi ayıklamak ve kanallarını ayırmak için MediaExtractor dahil olmak üzere Android 4.1'de (API düzeyi 16) kullanıma sunulan MediaCodec API'leriyle birlikte kullanılması amaçlanmıştır.

    Önce MediaExtractor ve MediaCodec nesne. Ardından, DRM şemasıyla kimlik tanımlama UUID kullanır ve bunu bir kurucusuyla birlikte MediaDrm nesnesinin örneğidir.

    Bir yüzeyden video kodlama

    Android 4.1 (API düzeyi 16), medya içeriğinin düşük düzeyde kodlanması ve kodunun çözülmesi için MediaCodec sınıfını ekledi. Android 4.1'de video kodlarken medyaya bir ByteBuffer dizisi sağlamanız gerekirdi ancak Android 4.3 artık kodlayıcının girişi olarak Surface kullanmanıza olanak tanır. Örneğin, mevcut bir video dosyasından veya OpenGL ES'den oluşturulan kareleri kullanarak girişi kodlayabilirsiniz.

    Kodlayıcınızda giriş olarak Surface kullanmak için önce MediaCodec cihazınız için configure() çağrısı yapın. Ardından, medyanızı akış olarak aktarabileceğiniz Surface hizmetini almak için createInputSurface() numaralı telefonu arayın.

    Örneğin, verilen Surface öğesini bir OpenGL için pencere olarak kullanabilirsiniz bağlamını eglCreateWindowSurface() öğesine iletebilirsiniz. Ardından, yüzeyi oluştururken kareyi MediaCodec'a iletmek için eglSwapBuffers() işlevini çağırın.

    Kodlamayı başlatmak için MediaCodec cihazında start() kodunu arayın. İşlem tamamlandığında, kodlamayı sonlandırmak için signalEndOfInputStream()'ü, Surface'de release()'u arayın.

    Medya birleştirme

    Yeni MediaMuxer sınıfı, bir ses akışı ile bir video akışı arasında çoklu yayın yapılmasını sağlar. Bu API'ler, MediaExtractor ile eşdeğer işlevi görür sınıfının çoğullama (devre dışı bırakma) medyası için Android 4.2'de eklendi.

    Desteklenen çıkış biçimleri MediaMuxer.OutputFormat içinde tanımlanır. Şu anda, MediaMuxer şu anda desteklenen tek çıkış biçimi ve MP4'tür. Aynı anda yalnızca bir ses akışı ve/veya bir video akışı.

    MediaMuxer, çoğunlukla MediaCodec ile çalışacak şekilde tasarlanmıştır. Böylece MediaCodec aracılığıyla video işleme gerçekleştirebilir, ardından MediaMuxer üzerinden bir MP4 dosyasına dönüştürün. Kodlama veya kod çözme işlemi yapmadan medya düzenlemesi yapmak için MediaMuxerMediaExtractor ile birlikte de kullanabilirsiniz.

    RemoteControlClient için oynatma ilerleme durumu ve sarma

    Android 4.0'da (API düzeyi 14), kilit ekranında bulunan kontroller gibi uzaktan kumanda istemcilerinden medya oynatma denetimlerini etkinleştirmek için RemoteControlClient eklendi. Android 4.3 artık bu tür kumandalara, oynatmayı görüntüleme imkanı sunuyor. oynatma konumunu ve ileri geri oynatma kontrollerini içerir. RemoteControlClient API'leri ile bir medya uygulamanız varsa oynatmaya izin verebilirsiniz proje zaman çizelgesinde ilerleme kaydetti.

    Öncelikle FLAG_KEY_MEDIA_POSITION_UPDATE işaretini setTransportControlsFlags().

    Ardından aşağıdaki iki yeni arayüzü uygulayın:

    RemoteControlClient.OnGetPlaybackPositionListener
    Buna, uzaktan kumandanın kullanıcı arayüzündeki ilerlemeyi güncellemesi gerektiğinde medyanızın mevcut konumunu isteyen geri çağırma işlevi onGetPlaybackPosition() de dahildir.
    RemoteControlClient.OnPlaybackPositionUpdateListener
    Buna, kullanıcı uzaktan kumanda kullanıcı arayüzüyle oynatmayı kaydırdığında uygulamanıza medyanızın yeni zaman kodunu bildiren geri çağırma işlevi onPlaybackPositionUpdate() de dahildir.

    Oynatmanızı yeni konumla güncelledikten sonra, şunu belirtmek için setPlaybackState() öğesini çağırın: yeni oynatma durumu, konum ve hız

    Bu arayüzler tanımlandıktan sonra sırasıyla setOnGetPlaybackPositionListener() ve setPlaybackPositionUpdateListener() çağrılarını yaparak RemoteControlClient için ayarlayabilirsiniz.

    Grafik

    OpenGL ES 3.0 desteği

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

    • Gelişmiş görsel efektlerin hızlandırılması
    • Standart özellik olarak yüksek kaliteli ETC2/EAC doku sıkıştırması
    • GLSL ES gölgelendirme dilinin tam sayı ve 32 bit kayan nokta desteğiyle yeni sürümü
    • Gelişmiş doku oluşturma
    • Doku boyutu ve oluşturma arabellek biçimlerinin daha kapsamlı standartlaştırılması

    Android'de OpenGL ES 3.0 için Java arayüzü GLES30 ile sağlanır. OpenGL ES 3.0'ı kullanırken manifest dosyanızda <uses-feature> etiketi ve android:glEsVersion özelliğiyle beyan ettiğinizden emin olun. Örnek:

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

    Son olarak, setEGLContextClientVersion() kodunu çağırarak OpenGL ES bağlamını belirtmeyi unutmayın, sürüm olarak 3 iletiliyor.

    Cihazın desteklenen OpenGL ES sürümünü çalışma zamanında nasıl kontrol edeceğiniz de dahil olmak üzere OpenGL ES'i kullanma hakkında daha fazla bilgi için OpenGL ES API kılavuzunu inceleyin.

    Çekilebilir öğeler için gizleme

    Bit eşleminizin veya çekilebilirinizin kaynağı olarak bir mipmap kullanmak, resim ve çeşitli resim ölçekleri içerir. Bu, özellikle her zaman animasyon sırasında ölçeklendirilecek resim.

    Android 4.2 (API düzeyi 17), Bitmap sınıfında mipmap desteği ekledi. Android, bir mipmap kaynağı sağladığınızda ve setHasMipMap()'yi etkinleştirdiğinizde Bitmap'daki mipmap resimlerini değiştirir. Artık Android 4.3'te, bir mipmap öğesi sağlayıp android:mipMap özelliğini bir bitmap kaynak dosyasında ayarlayarak veya hasMipMap() işlevini çağırarak BitmapDrawable nesneleri için de mipmap'leri etkinleştirebilirsiniz.

    Kullanıcı Arayüzü

    Yer paylaşımlarını görüntüleme

    Yeni ViewOverlay sınıfı, View öğesinin üzerine görsel içerik ekleyebileceğiniz ve düzen hiyerarşisini etkilemeyen şeffaf bir katman sağlar. getOverlay() numaralı telefonu arayarak View için ViewOverlay alabilirsiniz. Yer paylaşımı, her zaman ana görünümüyle (oluşturulduğu görünüm) aynı boyuta ve konuma sahiptir. Bu sayede, ana görünümün önünde görünen ancak ana görünümün sınırlarını aşmayan içerikler 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 yararlıdır. Ancak, bir bindirmenin kullanılabilir alanı ana makine görünümüyle aynı alanla sınırlandırılmıştır. yerine yerleştirmeyi seçerseniz, üst görünümden istediğiniz sınırları vardır.

    Button gibi bir widget görünümü için yer paylaşımı oluşturduğunuzda add(Drawable)'yi ç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 bir ViewGroupOverlay. ViewGroupOverlay sınıfı, ViewOverlay sınıfının bir alt sınıfıdır ve add(View) çağrısı yaparak View nesneleri eklemenize de olanak tanır.

    Not: Yer paylaşımına eklediğiniz tüm çekilebilir içerikler ve görünümler yalnızca görseldir. Odak veya giriş etkinlikleri alamaz.

    Örneğin, aşağıdaki kodda görünümü ebeveyn görünümün yer paylaşımına yerleştirip bu görünümde bir kaydırma animasyonu gerçekleştirerek görünümün sağa kayması animasyonu oluşturulur:

    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ırlar düzeni

    Dokuz yama arka plan resmi içeren görünümler için artık görünümün "klip" sınırları yerine arka plan resminin "optik" sınırlarına göre komşu görünümlerle hizalanmaları gerektiğini belirtebilirsiniz.

    Örneğin, 1. ve 2. şekillerde aynı düzen gösterilmektedir ancak 1. şekildeki sürümde kırpma sınırları (varsayılan davranış) kullanılırken 2. şekilde optik sınırlar kullanılmaktadır. Düğme ve fotoğraf çerçevesi için kullanılan dokuz yama resimleri kenarların etrafında dolgu içerdiğinden, kırpma sınırları kullanıldığında bunlar birbirine veya metne hizalanmış görünmez.

    Not: Şekil 1 ve 2'deki ekran görüntüsünde "Göster" düzen sınırları" geliştirici ayarı etkin. Her görünümde kırmızı çizgiler optik sınırları, mavi çizgiler kırpma sınırlarını ve pembe çizgiler kenar boşluklarını gösterir.

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

    Şekil 2. 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" ... >

    Şekil 3. Yakınlaştırılmış Holo düğmesinin dokuz noktalı görünümü optik sınırların aşılmasına yol açar.

    Bunun çalışması için görünümlerinizin arka planına uygulanan dokuz yama resim, dokuz yama dosyasının alt ve sağ tarafındaki kırmızı çizgilerle optik sınırları Şekil 3'te gösterilmiştir). Kırmızı çizgiler, resmin optik sınırlarını bırakarak klip sınırlarını aşar.

    Düzeninizde bir ViewGroup için optik sınırları etkinleştirdiğinizde alt görünümler, bir gruplandırma ölçütü için geçersiz kılmadığınız sürece optik sınır düzen modunu devralır ayarını android:layoutMode olarak "clipBounds" yapın. Tüm düzen öğeleri, alt görünümlerinin optik sınırlarını da dikkate alır ve kendi sınırlarını, içindeki görünümlerin optik sınırlarına göre uyarlar. Ancak, düzen öğeleri (ViewGroup alt sınıfları) şu anda kendi arka planlarına uygulanan dokuz yamalı resimler için optik sınırları desteklemez.

    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 dahil olmak üzere optik sınırlarla güncellendi. Bu nedenle, uygulamanız Holo teması (Theme.Holo, Theme.Holo.Light vb.) uyguluyorsa android:layoutMode özelliğini "opticalBounds" olarak ayarlayarak hemen avantaj elde edebilirsiniz.

    9 yama çizin aracıyla kendi dokuz yama görüntünüz için optik sınırları belirlemek için tıklayın.

    Rect 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 odaklanma dinleyicisi

    Daha önce, görünümünüzün pencereye eklenip eklenmediğini veya odağının değişip değişmediğini dinlemek istiyorsanız 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 bunun yerine ViewTreeObserver.OnWindowAttachListener öğesini uygulayabilir ve şunu içeren bir görünümde ayarlayabilirsiniz: addOnWindowAttachListener(). Odaklanma etkinlikleri almak için ViewTreeObserver.OnWindowFocusChangeListener'ü uygulayabilir ve addOnWindowFocusChangeListener() ile bir görünümde ayarlayabilirsiniz.

    TV'de aşırı tarama desteği

    Uygulamanızın her televizyonda ekranın tamamını doldurduğundan emin olmak için artık fazla taramayı etkinleştirebilirsiniz en iyi uygulamaları paylaşacağız. Aşırı tarama modu, FLAG_LAYOUT_IN_OVERSCAN işaretiyle belirlenir. Bu işareti Theme_DeviceDefault_NoActionBar_Overscan gibi platform temalarıyla veya özel bir temada windowOverscan stilini etkinleştirerek etkinleştirebilirsiniz.

    Ekran yönü

    <activity> etiketinin screenOrientation özelliği artık kullanıcının otomatik döndürme tercihini yerine getirmek için ek değerleri destekliyor:

    "userLandscape"
    Kullanıcı otomatik döndürmeyi devre dışı bırakırsa normal yatay yönde kilitlenir ve dönmez. Bu durum dışında "sensorLandscape" ile aynı şekilde çalışır.
    "userPortrait"
    Kullanıcı otomatik döndürme özelliğini devre dışı bırakırsa normal dikey yönde kilitlenir ve dönmez. Bu durum dışında "sensorPortrait" ile aynı şekilde çalışır.
    "fullUser"
    "fullSensor" ile aynı şekilde çalışır ve dört yönde de döndürmeye izin verir. Kullanıcı otomatik döndürmeyi devre dışı bırakırsa ekran, kullanıcının tercih ettiği yönde kilitlenir.

    Ayrıca, artık uygulamanızın yönünü kilitlemek için "locked" olarak da beyan edebilirsiniz. ekranın geçerli yönünü gösterir.

    Döndürme animasyonları

    Şu sayfadaki yeni rotationAnimation alanı: WindowManager, istediğiniz üç animasyondan birini seçmenize olanak tanır başka bir ekran görüntüsüne sahip olun. Üç animasyon şunlardır:

    Not: Bu animasyonlar yalnızca etkinliğinizi "tam ekran" modunu kullanacak şekilde ayarladıysanız kullanılabilir modudur. Bu modu Theme.Holo.NoActionBar.Fullscreen gibi temalarla etkinleştirebilirsiniz.

    Örneğin, "artı geçişi" animasyon:

    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, Google Analytics 4'te tarama yapmaksızın göz önünde bulundurmalısınız. Yani mevcut TYPE_GYROSCOPE ve TYPE_MAGNETIC_FIELD sensörleri, sırasıyla cihazdaki jiroskop kayması ve sert demirden kaynaklanan tahmini önyargıyı hesaba katan sensör verileri sağlar. Bu sensörlerin yeni "kalibre edilmemiş" sürümleri ise ham sensör verilerini sağlar ve tahmini önyargı değerlerini ayrı olarak sunar. Bu sensörler, tahmini önyargıyı harici verilerle geliş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ınlandığı anda yeni bildirimler hakkında bilgi almasına olanak tanıyan yeni bir hizmet sınıfı NotificationListenerService ekler.

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

    Contacts Provider

    "İletiş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 elde etmek için etkili bir yol sağlar.

    Kişi deltaları için sorgu

    Kişi Sağlayıcı'ya, kişi verilerindeki son değişiklikleri verimli bir şekilde sorgulamanıza olanak tanıyan yeni API'ler eklendi. Önceden, kişi verilerinde bir değişiklik olduğunda uygulamanız bilgilendirilebiliyordu ancak tam olarak neyin değiştiğini bilmiyordunuz ve değişikliği bulmak için tüm kişileri almanız ve ardından bu kişileri incelemeniz gerekiyordu.

    Ekleme ve güncellemelerdeki değişiklikleri izlemek için artık yalnızca sağlayıcıyı son sorgulamanızdan bu yana değişen kişileri sorgulamak üzere seçiminize CONTACT_LAST_UPDATED_TIMESTAMP parametresini ekleyebilirsiniz.

    Hangi kişilerin silindiğini takip etmek için yeni ContactsContract.DeletedContacts tablosunda silinen kişilerin günlüğü sağlanır (ancak silinen her kişi bu tabloda sınırlı bir süre boyunca tutulur). CONTACT_LAST_UPDATED_TIMESTAMP'e 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 parametresi CONTACT_DELETED_TIMESTAMP'ü kullanabilirsiniz. Tabloda, günlük tutulacak gün sayısını (milisaniye cinsinden) içeren DAYS_KEPT_MILLISECONDS sabit de yer alır.

    Ayrıca Contacts Provider, kullanıcı sistem ayarları menüsünden kişi depolama alanını temizlediğinde artık CONTACTS_DATABASE_CREATED işlemini yayınlayarak Contacts Provider veritabanını etkili bir şekilde yeniden oluşturur. Bu istek, uygulamalara depolamış oldukları tüm iletişim bilgilerini bırakmaları ve yeni bir sorgu ile yeniden yüklemeleri gerektiğini bildirmek için kullanılır.

    Kişilerdeki değişiklikleri kontrol etmek için bu API'leri kullanan örnek kod için SDK Örnekleri indirme dosyasında 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 (RTL) dilleri ve düzeni desteklemektedir. ancak bazen karma yönlü metinleri düzgün bir şekilde işleyemiyor. Bu nedenle Android 4.3, herhangi bir bölümünü bozmadan ters yönde içerik içeren metni düzgün bir şekilde biçimlendirmenize yardımcı olan BidiFormatter API'lerini ekler.

    Örneğin, "15 Bay Street, Laurel, CA'yı mı kastettiniz?" gibi bir dize değişkeni içeren bir cümle oluşturmak istediğinizde genellikle yerelleştirilmiş bir dize kaynağını ve değişkeni String.format()'ye 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 görünür:

    האם התכוונת ל 15 Bay Street, Laurel, CA?

    "15", "Bay Street"in solunda olduğu için bu yanlıştır. Çözüm, BidiFormatter ve unicodeWrap() yöntemini kullanmaktır. Örneğin, yukarıdaki kod şu şekilde 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() ilk güçlü yön tahmini bulma yöntemidir; ilk yöntem, ilk kez metin yönü sinyali, içeriğin bütünü için uygun yönü temsil etmiyor. Gerekirse TextDirectionHeuristics öğesindeki TextDirectionHeuristic sabitlerinden birini ileterek farklı bir buluşsal yöntem belirtebilirsiniz. alıcı: unicodeWrap().

    Not: Bu yeni API'ler, Android Destek Kitaplığı aracılığıyla Android'in önceki sürümlerinde de 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 sayede erişilebilirlik hizmetiniz, klavye gibi tuş tabanlı giriş cihazlarının girişini işleyebilir ve bu etkinlikleri daha önce yalnızca dokunma girişi veya cihazın yön tuşlarıyla mümkün olabilecek özel işlemlere dönüştürebilir.

    Metin seç ve kopyala/yapıştır

    AccessibilityNodeInfo, artık izin verilen API'ler sunar. seçmek, kesmek, kopyalamak ve yapıştırmak için bir AccessibilityService bir düğümdeki metindir.

    Erişilebilirlik hizmetiniz, kesilecek veya kopyalanacak metin seçimini belirtmek için yeni ACTION_SET_SELECTION işlemini kullanabilir. Bu işlemle birlikte, ACTION_ARGUMENT_SELECTION_START_INT ve ACTION_ARGUMENT_SELECTION_END_INT ile seçim başlangıç ve bitiş konumunu da iletebilir. Alternatif olarak mevcut işlem, ACTION_NEXT_AT_MOVEMENT_GRANULARITY (daha önce yalnızca imleç konumunu hareket ettirmek için kullanılır) ve ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN bağımsız değişkenini eklemek için kullanılır.

    Daha sonra ACTION_CUT ile kesebilir veya kopyalayabilirsiniz. ACTION_COPY, daha sonra şununla yapıştırın: ACTION_PASTE.

    Not: Bu yeni API'ler, Android Destek Kitaplığı'ndaki AccessibilityNodeInfoCompat sınıfı aracılığıyla Android'in önceki sürümlerinde de kullanılabilir.

    Erişilebilirlik özelliklerini bildirme

    Android 4.3'ten itibaren, erişilebilirlik hizmetlerinin belirli erişilebilirlik özelliklerini kullanabilmesi için meta veri dosyasında erişilebilirlik özelliklerini beyan etmesi gerekir. Özellik meta veri dosyasında istediği takdirde, özellik kullanılamaz. Hizmetinizle ilgili özellikleri için farklı işlevlere karşılık gelen XML özelliklerini "özellik" AccessibilityServiceInfo içindeki sabit değerler sınıfını kullanır.

    Ö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 etmenize olanak tanıyan API'ler sağlar. Platformun AccessibilityService API'leri kullanılarak UiAutomation, API'ler ekran içeriğini incelemenize, rastgele klavye ve dokunma etkinlikleri eklemenize olanak tanır.

    UiAutomation örneği almak için Instrumentation.getUiAutomation() işlevini çağırın. Bunun işe yaraması için InstrumentationTestCase dosyanızı adb shell'ten çalıştırırken instrument komutuyla birlikte -w seçeneğini sağlamanız gerekir.

    UiAutomation örneğiyle, executeAndWaitForEvent()'u çağırarak, uygulamanızı test etmek için rastgele etkinlikler yürütebilirsiniz. Bu sırada executeAndWaitForEvent()'a gerçekleştirilecek bir Runnable, işlem için bir zaman aşımı süresi ve UiAutomation.AccessibilityEventFilter arayüzünün bir uygulamasını iletebilirsiniz. UiAutomation.AccessibilityEventFilter uygulamanız dahilinde telefonla aranırsınız ilgilendiğiniz etkinlikleri filtrelemenizi ve başarı veya başarı ya da başarısız olduğunu gösterir.

    Bir test sırasında tüm etkinlikleri gözlemlemek için UiAutomation.OnAccessibilityEventListener uygulamasını oluşturun ve setOnAccessibilityEventListener()'a iletin. Ardından, dinleyici arayüzünüz her etkinlik gerçekleştiğinde onAccessibilityEvent() çağrısı alır ve etkinliği açıklayan bir AccessibilityEvent nesnesi alır.

    UiAutomation API'lerinin, uiautomator gibi kullanıcı arayüzü test araçlarının geliştirilmesini teşvik etmek için çok düşük düzeyde sunduğu başka işlemler de vardır. Örneğin, UiAutomation şunları da yapabilir:

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

    En önemlisi, kullanıcı arayüzü test araçları için UiAutomation API'leri uygulama sınırlarının ötesine geçer.Instrumentation

    Uygulamalar için Systrace etkinlikleri

    Android 4.3, Trace sınıfını iki statik yöntemle ekler: beginSection() ve endSection(), Bunlar, sistem izleme raporuna dahil edilecek kod bloklarını tanımlamanıza olanak tanır. İçerik üreterek takip edilebilir kod bölümlerinin bulunması gibi, sistem izleme günlükleri size çok daha ayrıntılı uygulamanızda yavaşlamanın olduğu yerlerin analizi.

    Systrace aracını kullanma hakkında bilgi için Systrace ile Görüntü ve Performansı Analiz Etme bölümünü okuyun.

    Güvenlik

    Uygulama özel anahtarları için Android anahtar mağazası

    Android artık KeyStore tesisinde Android Key Store adlı özel bir Java Güvenlik Sağlayıcısı sunuyor. Bu sağlayıcı, yalnızca uygulamanız tarafından görülebilen ve kullanılabilen özel anahtarlar oluşturmanıza ve kaydetmenize olanak tanır. Android Key Store'u yüklemek için "AndroidKeyStore" öğesini KeyStore.getInstance() öğesine iletin.

    Uygulamanızın özel kimlik bilgilerini Android Key Store'da yönetmek için yeni bir anahtar oluşturun: KeyPairGeneratorSpec ile KeyPairGenerator. Öncelikle getInstance()'u çağırarak KeyPairGenerator örneği alın. Ardından initialize()'ü çağırın ve KeyPairGeneratorSpec.Builder kullanarak elde edebileceğiniz bir KeyPairGeneratorSpec örneğini iletin. Son olarak, generateKeyPair() numaralı telefonu arayarak KeyPair kartınızı alın.

    Donanım kimlik bilgisi depolama

    Android artık KeyChainkimlik bilgileriniz için donanım destekli depolama alanını da destekliyor. Bu sayede anahtarlar ayıklanamayacak ve daha fazla güvenlik sağlanacak. Yani anahtarlar donanım destekli bir anahtar deposunda (Secure Element, TPM veya TrustZone) bulunduktan sonra kriptografik işlemler için kullanılabilir ancak özel anahtar materyali dışa aktarılamaz. OS çekirdeği bile bu önemli materyale erişemez. Android destekli tüm cihazlar donanım üzerinde depolama alanını desteklemese de KeyChain.IsBoundKeyAlgorithm() çağrısını yaparak donanım destekli depolama alanının kullanılabilir olup olmadığını çalışma zamanında kontrol edebilirsiniz.

    Manifest Beyanları

    Beyan edilen gerekli özellikler

    Aşağıdaki değerler artık <uses-feature>'nda desteklenmektedir öğesi ile, uygulamanızın yalnızca bu özellikleri sunan cihazlara yüklenmesini sağlayabilirsiniz. en iyi uygulamaları paylaşacağız.

    FEATURE_APP_WIDGETS
    Uygulamanızın bir uygulama widget'ı sağladığını ve yalnızca şu özelliğe sahip cihazlara yüklenmesi gerektiğini beyan eden: Kullanıcıların uygulama widget'ları yerleştirebileceği bir Ana ekran veya benzer bir konum eklemelidir. Örnek:
    <uses-feature android:name="android.software.app_widgets" android:required="true" />
    FEATURE_HOME_SCREEN
    Uygulamanızın ana ekranın yerini alacak şekilde davrandığını ve yalnızca üçüncü taraf ana ekran uygulamalarını destekleyen cihazlara yükleneceğini belirtir. Ö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ş bir klavye) sağladığını ve yalnızca şu cihazlarda yüklenmesi gerektiğini beyan eden: üçüncü taraf giriş yöntemlerini destekler. Ö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 cihazlara yüklenmesi gerektiğini beyan ediyor Bluetooth Düşük Enerji aracılığıyla diğer cihazlarla iletişim kurabilen cihazlar. Örnek:
    <uses-feature android:name="android.software.bluetooth_le" android:required="true" />

    Kullanıcı izinleri

    Aşağıdaki değerler artık <uses-permission>'nda desteklenmektedir bu şartın uygulamanızın belirli API'lere erişebilmesi için gereken izinler.

    BIND_NOTIFICATION_LISTENER_SERVICE
    Yeni NotificationListenerService API'lerinin kullanılması için gereklidir.
    SEND_RESPOND_VIA_MESSAGE
    ACTION_RESPOND_VIA_MESSAGE intent'ini 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.