Android 4.4 API'leri

API Düzeyi: 19

Android 4.4 (KITKAT), kullanıcılara ve uygulama geliştiricilere yeni özellikler sunan Android platformunun yeni bir sürümüdür. Bu dokümanda, en dikkate değer yeni API'lere giriş sunulmaktadır.

Uygulama geliştirici olarak, Android 4.4 sistem imajını ve SDK platformunu en kısa sürede SDK Yöneticisi'nden indirmeniz gerekir. Uygulamanızı test edebileceğiniz Android 4.4 yüklü bir cihazınız yoksa uygulamanızı Android emülatöründe test etmek için Android 4.4 sistem görüntüsünü kullanın. Ardından, en son API'leri kullanmaya başlamak için uygulamalarınızı Android 4.4 platformu için derleyin.

Hedef API düzeyinizi güncelleme

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

minSdkVersion tarafından desteklenmeyen API'leri yürütmeden önce sistem API düzeyini kontrol eden koşullar ekleyerek Android 4.4'te API'leri kullanırken eski sürümleri de destekleyebilirsiniz. Geriye dönük uyumluluğu koruma hakkında daha fazla bilgi edinmek için Farklı Platform Sürümlerini Destekleme başlıklı makaleyi okuyun.

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.4'teki değişikliklerden etkilenebileceğini unutmayın.

Uygulamanız harici depolama alanından veri okuyorsa:

Uygulamanız READ_EXTERNAL_STORAGE iznine sahip olmadığı sürece Android 4.4'te çalışırken harici depolama alanındaki paylaşılan dosyaları okuyamaz. Yani getExternalStoragePublicDirectory() tarafından döndürülen dizindeki dosyalara artık izin olmadan erişilemez. Ancak yalnızca getExternalFilesDir() tarafından sağlanan, uygulamanıza özel dizinlerinize erişmeniz gerekiyorsa READ_EXTERNAL_STORAGE iznine ihtiyacınız yoktur.

Uygulamanız WebView kullanıyorsa...

Uygulamanız, özellikle targetSdkVersion değerini "19 " veya daha yüksek bir değere güncellediğinizde Android 4.4'te farklı davranabilir.

WebView sınıfının ve ilgili API'lerin temel aldığı kod, Chromium kaynak kodunun modern bir anlık görüntüsüne dayalı olacak şekilde yükseltildi. Bu, performansla ilgili çeşitli iyileştirmeler, yeni HTML5 özellikleri için destek ve WebView içeriğinizin uzaktan hata ayıklama desteği sağlar. Bu yükseltmenin kapsamı, uygulamanız WebView kullanıyorsa davranışının bazı durumlarda etkilenebileceği anlamına gelir. Bilinen davranış değişiklikleri belgelenmiştir ve çoğunlukla uygulamanızı yalnızca targetSdkVersion sürümünü "19" veya daha yeni bir sürüme güncellediğinizde etkiler. Yeni WebView, API düzeyi 18 ve altını hedefleyen uygulamalarda bazı eski işlevleri sağlamak için "quirks modu"nda çalışır. Uygulamanızın, WebView'ın önceki sürümüne ait bilinmeyen davranışlara bağlı olması mümkündür.

Bu nedenle, mevcut uygulamanızda WebView kullanılıyorsa en kısa sürede Android 4.4'te test yapmanız ve targetSdkVersion sürümünüzü "19" veya daha yeni bir sürüme güncellediğinizde uygulamanızın nasıl etkilenebileceği hakkında bilgi edinmek için Android 4.4'te WebView'e geçme başlıklı makaleyi incelemeniz önemlidir.

Uygulamanız AlarmManager kullanıyorsa...

Uygulamanızın targetSdkVersion değerini "19" veya daha yüksek bir değere ayarlarsanız set() veya setRepeating() kullanarak oluşturduğunuz alarmlar tam olarak doğru olmaz.

Android, güç verimliliğini artırmak için artık oldukça benzer zamanlarda gerçekleşen tüm uygulamalardan gelen alarmları bir araya getiriyor. Böylece sistem, her alarmı işlemek için cihazı birkaç kez yerine bir kez uyandırıyor.

Alarmınız tam bir saatle ilişkilendirilmemişse ancak alarmınızın belirli bir zaman aralığında (ör. 14:00 ile 16:00 arasında) tetiklenmesi önemliyse alarm için "en erken" zamanı ve sistemin alarmı tetiklemesi gereken en erken zamanı izleyen bir "pencere"yi kabul eden yeni setWindow() yöntemini kullanabilirsiniz.

Alarmınızın tam bir saate sabitlenmesi gerekiyorsa (ör. takvim etkinliği hatırlatıcısı için) yeni setExact() yöntemini kullanabilirsiniz.

Bu hatalı gruplandırma davranışı yalnızca güncellenmiş uygulamalar için geçerlidir. targetSdkVersion değerini "18 " veya daha düşük bir değere ayarlarsanız alarmlarınız Android 4.4'te çalışırken önceki sürümlerde olduğu gibi davranmaya devam eder.

Uygulamanız ContentResolver'ı kullanarak verileri senkronize ediyorsa...

Uygulamanızın targetSdkVersion değerini "19 " veya daha yüksek bir değere ayarlarsanız addPeriodicSync() ile senkronizasyon oluşturmak, senkronizasyon işlemlerinizi belirttiğiniz dönemin yaklaşık% 4'ü olan varsayılan bir esnek aralık içinde gerçekleştirir. Örneğin, anket sıklık süreniz 24 saatse senkronizasyon işleminiz her gün tam olarak aynı saatte değil, her gün yaklaşık bir saatlik bir zaman aralığında gerçekleşebilir.

Senkronizasyon işlemleri için kendi esnek aralığınızı belirtmek üzere yeni requestSync() yöntemini kullanmaya başlamanız gerekir. Daha fazla bilgi için aşağıdaki Senkronizasyon bağdaştırıcılar bölümüne bakın.

Bu esnek aralık davranışı yalnızca güncellenmiş uygulamalar için geçerlidir. targetSdkVersion değerini "18 " veya daha düşük bir değere ayarlarsanız mevcut senkronizasyon isteğiniz, Android 4.4'te çalışırken önceki sürümlerde olduğu gibi davranmaya devam eder.

Baskı Çerçevesi

Android artık kullanıcıların kablosuz ağ, Bluetooth veya diğer hizmetler üzerinden bağlı bir yazıcı kullanarak herhangi bir belgeyi yazdırmalarına olanak tanıyan eksiksiz bir çerçeve içeriyor. Sistem, bir dokümanı yazdırmak isteyen uygulama ile yazdırma işlerini yazıcıya gönderen hizmetler arasındaki işlemi yönetir. android.print çerçevesi, bir baskı belgesini belirtmek ve baskı için sisteme iletmek için gereken tüm API'leri sağlar. Belirli bir baskı işi için hangi API'lere ihtiyacınız olduğu içeriğinize bağlıdır.

Genel içerikleri yazdırma

Kullanıcı arayüzünüzdeki içeriği doküman olarak yazdırmak istiyorsanız önce PrintDocumentAdapter sınıfının alt sınıfını oluşturmanız gerekir. Bu sınıfta, sayfa düzeninizi sağlanan baskı özelliklerine göre oluşturmak için onLayout() ve yazdırılabilir içeriğinizi ParcelFileDescriptor olarak serileştirmek için onWrite() gibi birkaç geri çağırma yöntemi uygulamanız gerekir.

İçeriğinizi ParcelFileDescriptor'e yazmak için PDF olarak göndermeniz gerekir. Yeni PdfDocument API'leri, getCanvas()'den yazdırılabilir içeriğinizi çizebileceğiniz bir Canvas sağlayarak bunu yapmanın uygun bir yolunu sunar. Ardından, writeTo() yöntemini kullanarak PdfDocument değerini ParcelFileDescriptor değerine yazın.

PrintDocumentAdapter için uygulamanızı tanımladıktan sonra, PrintDocumentAdapter bağımsız değişkenini alan PrintManager yöntemi print()'yi kullanarak kullanıcının isteği üzerine baskı işleri yürütebilirsiniz.

Resimleri yazdırma

Yalnızca bir fotoğraf veya başka bir bitmap yazdırmak istiyorsanız destek kitaplığındaki yardımcı API'ler tüm işi sizin için yapar. PrintHelper için yeni bir örnek oluşturun, ölçek modunu setScaleMode() ile ayarlayın ve Bitmap öğenizi printBitmap()'a iletin. Bu kadar basit. Kitaplık, bitmap'i yazıcıya iletmek için sistemle kalan tüm etkileşimleri yönetir.

Bina baskı hizmetleri

Yazıcı OEM'si olarak, Android cihazlardan yazıcılarınızla birlikte çalışabilirlik sağlamak için android.printservice çerçevesini kullanabilirsiniz. Baskı hizmetlerini, kullanıcıların cihazlarına yükleyebileceği APK'lar olarak oluşturabilir ve dağıtabilirsiniz . Baskı hizmeti uygulaması, sistemden baskı işleri alan ve uygun protokolleri kullanarak işleri yazıcılarına ileten PrintService sınıfını alt sınıflandırarak öncelikle başsız bir hizmet olarak çalışır.

Uygulama içeriğinizi nasıl yazdıracağınız hakkında daha fazla bilgi için İçerik yazdırma başlıklı makaleyi okuyun.

SMS Sağlayıcı

Telephony içerik sağlayıcısı ("SMS Sağlayıcısı"), uygulamaların cihazda SMS ve MMS mesajlarını okumasına ve yazmasına olanak tanır. Alınan, taslak halindeki, gönderilen, beklemede olan SMS ve MMS mesajları için tablolar içerir.

Android 4.4'ten itibaren sistem ayarları, kullanıcıların "varsayılan SMS uygulaması" seçmesine olanak tanır. Seçildikten sonra SMS sağlayıcıya yalnızca varsayılan SMS uygulaması yazabilir ve kullanıcı SMS aldığında yalnızca varsayılan SMS uygulaması SMS_DELIVER_ACTION yayınını, kullanıcı MMS aldığında ise yalnızca varsayılan SMS uygulaması WAP_PUSH_DELIVER_ACTION yayınını alır. Varsayılan SMS uygulaması, yeni bir mesaj aldığında veya gönderdiğinde SMS sağlayıcısına ayrıntıları yazmakla sorumludur.

Varsayılan SMS uygulaması olarak seçilmeyen diğer uygulamalar yalnızca SMS sağlayıcısını okuyabilir ancak yeni bir SMS geldiğinde SMS_RECEIVED_ACTION yayınını dinleyerek de bilgilendirilebilir. SMS_RECEIVED_ACTION yayını, birden fazla uygulamaya gönderilebilecek, iptal edilemez bir yayındır. Bu yayın, varsayılan SMS uygulaması olarak seçilmemiş olsa da telefon numarası doğrulaması yapmak gibi özel gelen mesajları okuması gereken uygulamalar için tasarlanmıştır.

Daha fazla bilgi için SMS Uygulamalarınızı KitKat'a Hazırlama başlıklı blog yayınını okuyun.

Kablosuz ve Bağlantı

Ana kart emülasyonu

Android uygulamaları artık veri alışverişi için APDU'ları kullanan ISO14443-4 (ISO-DEP) NFC kartlarını (ISO7816-4'te belirtildiği gibi) taklit edebilir. Bu sayede, Android 4.4 çalıştıran NFC özellikli bir cihaz aynı anda birden fazla NFC kartını taklit edebilir ve NFC ödeme terminali veya diğer NFC okuyucular, uygulama tanımlayıcısına (AID) göre uygun NFC kartıyla işlem başlatabilir.

Uygulamanızda bu protokolleri kullanan bir NFC kartını taklit etmek istiyorsanız HostApduService sınıfını temel alan bir hizmet bileşeni oluşturun. Bunun yerine uygulamanız kart emülasyonu için güvenli bir öğe kullanıyorsa OffHostApduService sınıfını temel alan bir hizmet oluşturmanız gerekir. Bu hizmet, işlemlere doğrudan dahil olmaz ancak güvenli öğe tarafından işlenmesi gereken AID'leri kaydetmek için gereklidir.

Daha fazla bilgi için NFC Kart Emülasyonu kılavuzunu okuyun.

NFC okuyucu modu

Yeni NFC okuyucu modu, bir etkinliğin tüm NFC etkinliğini yalnızca etkinliğin ön planda olduğu sırada ilgilendiği etiket türlerini okumakla kısıtlamasına olanak tanır. Yeni etiketler algılandığında geri çağırma alan bir NfcAdapter.ReaderCallback uygulaması sağlayarak enableReaderMode() ile etkinliğiniz için okuyucu modunu etkinleştirebilirsiniz.

Ana makine kartı emülasyonuyla birlikte bu yeni özellik, Android'in bir mobil ödeme arayüzünün her iki ucunda da çalışmasını sağlar: Bir cihaz ödeme terminali (okuyucu modu etkinliği çalıştıran bir cihaz) olarak çalışır, diğer cihaz ise ödeme istemcisi (NFC kartı taklit eden bir cihaz) olarak çalışır.

Kızılötesi vericiler

Kızılötesi (IR) verici içeren bir cihazda çalışırken artık ConsumerIrManager API'lerini kullanarak IR sinyalleri iletebilirsiniz. ConsumerIrManager örneği almak için bağımsız değişken olarak CONSUMER_IR_SERVICE ile getSystemService()'yi çağırın. Ardından, cihazın desteklenen kızılötesi frekanslarını getCarrierFrequencies() ile sorgulayabilir ve istediğiniz frekansı ve sinyal desenini transmit() ile ileterek sinyal gönderebilirsiniz.

Her zaman önce hasIrEmitter()'ü çağırarak bir cihazın kızılötesi verici içerip içermediğini kontrol etmeniz gerekir. Ancak uygulamanız yalnızca kızılötesi verici içeren cihazlarla uyumluysa "android.hardware.consumerir" (FEATURE_CONSUMER_IR) için manifest dosyanıza bir <uses-feature> öğesi eklemeniz gerekir.

Multimedya

Uyarlanabilir oynatma

Uyarlanabilir video oynatma desteği artık MediaCodec API'lerinde kullanılabilir. Bu sayede, oynatma sırasında çözünürlüğü Surface'a sorunsuz bir şekilde değiştirebilirsiniz. Çözücüye yeni çözünürlükte giriş kareleri besleyebilir ve çıkış arabelleklerinin çözünürlüğünü önemli bir boşluk olmadan değiştirebilirsiniz.

MediaFormat alanına, uygulamanızın codec'den gerektirdiği maksimum çözünürlüğü belirten iki anahtar ekleyerek (KEY_MAX_WIDTH ve KEY_MAX_HEIGHT) uyarlanabilir oynatmayı etkinleştirebilirsiniz. MediaFormat'ünüze eklediğiniz bu bilgilerle configure() kullanarak MediaFormatMediaCodec örneğinize iletin.

Kodek, bu değerlerle aynı veya bu değerlerden daha düşük çözünürlükler arasında sorunsuz bir şekilde geçiş yapar. Kodek, belirtilen maksimum çözünürlüklerden daha yüksek çözünürlükleri de destekleyebilir (desteklenen profillerin sınırları dahilinde olduğu sürece), ancak daha yüksek çözünürlüklere geçişler sorunsuz olmayabilir.

H.264 videosunun kod çözme işlemi sırasında çözünürlüğü değiştirmek için MediaCodec.queueInputBuffer() işlevini kullanarak kareleri sıraya almaya devam edin ancak anlık kod çözücü yenileme (IDR) karesiyle birlikte yeni sıra parametresi grubu (SPS) ve resim parametresi grubu (PPS) değerlerini tek bir arabelleğe eklediğinizden emin olun.

Ancak, codec'inizi uyarlanabilir oynatma için yapılandırmaya çalışmadan önce FEATURE_AdaptivePlayback ile isFeatureSupported(String) çağrısını yaparak cihazın uyarlanabilir oynatmayı desteklediğini doğrulamanız gerekir.

Not: Uyarlanabilir oynatma desteği tedarikçiye özeldir. Bazı codec'ler, daha yüksek çözünürlük ipuçları için daha fazla bellek gerektirebilir. Bu nedenle, çözünürlüğün maksimum değerlerini, kodlarını çözdüğünüz kaynak materyale göre ayarlamanız gerekir.

İsteğe bağlı ses zaman damgaları

Yeni AudioTimestamp sınıfı, ses-video senkronizasyonunu kolaylaştırmak için AudioTrack tarafından yönetilen bir ses akışındaki belirli bir "kare" ile ilgili zaman çizelgesi ayrıntıları sağlar. Mevcut en son zaman damgasını almak için bir AudioTimestamp nesnesi oluşturun ve bunu getTimestamp()'a iletin. Zaman damgası isteği başarılı olursa AudioTrack örneği, ilgili karenin gösterildiği veya gösterileceği tahmini zamanla birlikte kare birimlerinde bir konumla doldurulur.

framePosition ile ilişkili en yakın video karesini bulmak için AudioTimestamp'daki nanoTime değerini (monotonik) kullanabilirsiniz. Böylece, video karelerini sesle eşleşecek şekilde bırakabilir, kopyalayabilir veya enterpolasyon yapabilirsiniz. Alternatif olarak, bir video karesiyle aynı anda hangi işitsel karenin beklendiğini tahmin etmek için nanoTime değeri ile gelecekteki bir video karesinin beklenen zamanı (örnek hızı dikkate alınarak) arasındaki fark zamanını belirleyebilirsiniz.

Yüzey görüntü okuyucu

Yeni ImageReader API, Surface olarak oluşturulan resim arabelleklerine doğrudan erişim sağlar. newInstance() statik yöntemiyle bir ImageReader edinebilirsiniz. Ardından, yeni bir Surface oluşturmak ve resim verilerinizi MediaPlayer veya MediaCodec gibi bir üreticiyle yayınlamak için getSurface()'ü arayın. Platformda yeni resimler kullanıma sunulduğunda bildirim almak için ImageReader.OnImageAvailableListener arayüzünü uygulayın ve setOnImageAvailableListener()'a kaydedin.

Artık Surface'ünüze içerik çizerken her yeni resim karesi kullanıma sunulduğunda ImageReader.OnImageAvailableListener'ünüz onImageAvailable()'e bir çağrı alır ve size karşılık gelen ImageReader'ı sağlar. acquireLatestImage() veya acquireNextImage()'ı çağırarak karenin resim verilerini Image nesnesi olarak almak için ImageReader'ü kullanabilirsiniz.

Image nesnesi, ByteBuffer içinde resmin zaman damgasına, biçimine, boyutlarına ve piksel verilerine doğrudan erişim sağlar. Ancak Image sınıfının resimlerinizi yorumlayabilmesi için resimlerin ImageFormat veya PixelFormat'de sabitlerle tanımlanan türlerden birine göre biçimlendirilmesi gerekir.

Tepe ve RMS ölçümü

Artık Visualizer.MeasurementPeakRms örneği oluşturarak ve getMeasurementPeakRms()'ye ileterek mevcut ses akışının tepe noktasını ve RMS değerini Visualizer'ten sorgulayabilirsiniz. Bu yöntemi çağırdığınızda, belirtilen Visualizer.MeasurementPeakRms değerinin tepe ve RMS değerleri en son ölçülen değerlere ayarlanır.

Ses yükseltici

LoudnessEnhancer, AudioEffect'un yeni bir alt sınıfıdır ve MediaPlayer veya AudioTrack cihazınızın ses düzeyini artırmanıza olanak tanır. Bu, özellikle diğer medya oynatılırken konuşma ses parçalarının sesini artırmak için yukarıda bahsedilen yeni getMeasurementPeakRms() yöntemiyle birlikte kullanışlı olabilir.

Uzaktan kumandalar

Android 4.0 (API düzeyi 14), medya uygulamalarının uzak istemcilerden medya denetleyici etkinliklerini (ör. kilitli ekrandaki medya kontrolleri) kullanmasına olanak tanıyan RemoteControlClient API'lerini kullanıma sundu. Artık yeni RemoteController API'leri kendi uzaktan kumandanızı oluşturmanıza olanak tanıyarak RemoteControlClient ile entegre olan tüm medya uygulamalarının oynatılmasını kontrol edebilecek yeni ve yenilikçi uygulamalar ile çevre birimleri oluşturmanızı sağlıyor.

Uzaktan kumanda oluşturmak için kullanıcı arayüzünüzü istediğiniz şekilde uygulayabilirsiniz ancak medya düğmesi etkinliklerini kullanıcının medya uygulamasına iletmek için NotificationListenerService sınıfını genişleten ve RemoteController.OnClientUpdateListener arayüzünü uygulayan bir hizmet oluşturmanız gerekir. NotificationListenerService temel olarak kullanıldığında, kullanıcıların sistem güvenlik ayarlarında uygulamanızı bildirim dinleyici olarak etkinleştirmesini gerektiren uygun gizlilik kısıtlamaları sağlanır. Bu nedenle, NotificationListenerService temel olarak kullanmak önemlidir.

NotificationListenerService sınıfı, uygulamanız gereken birkaç soyut yöntem içerir. Ancak yalnızca medya oynatmayı yönetmek için medya denetleyici etkinlikleriyle ilgileniyorsanız bu etkinlikler için uygulamanızı boş bırakabilir ve bunun yerine RemoteController.OnClientUpdateListener yöntemlerine odaklanabilirsiniz.

Uzaktan kumandalardan gelen derecelendirmeler

Android 4.4, kullanıcıların uzaktan kumandadan mevcut parçayı derecelendirmesine olanak tanıyarak uzaktan kumanda istemcileri (RemoteControlClient ile medya kontrol etkinlikleri alan uygulamalar) için mevcut özellikleri temel alır.

Yeni Rating sınıfı, kullanıcı puanıyla ilgili bilgileri kapsar. Derecelendirmeler, derecelendirme stili (RATING_HEART, RATING_THUMB_UP_DOWN, RATING_3_STARS, RATING_4_STARS, RATING_5_STARS veya RATING_PERCENTAGE) ve bu stile uygun derecelendirme değeri ile tanımlanır.

Kullanıcıların parçalarınızı uzaktan kumandadan derecelendirmesine izin vermek için:

Kullanıcı uzaktan kumandadan derecelendirmeyi değiştirdiğinde geri çağırma almak için yeni RemoteControlClient.OnMetadataUpdateListener arayüzünü uygulayın ve setMetadataUpdateListener()'a bir örnek iletin. Kullanıcı derecelendirmeyi değiştirdiğinde RemoteControlClient.OnMetadataUpdateListener, onMetadataUpdate() çağrısı alır. Bu çağrıda RATING_KEY_BY_USER anahtar olarak, Rating nesnesi ise değer olarak iletilir.

Altyazılar

VideoView artık HTTP Canlı Yayını (HLS) videolarını oynatırken WebVTT altyazı parçalarını destekliyor. Altyazı parçasını, kullanıcının sistem ayarlarında tanımladığı altyazı tercihlerine göre gösteriyor.

addSubtitleSource() yöntemini kullanarak WebVTT altyazı parçalarınızı VideoView ile de sağlayabilirsiniz. Bu yöntem, altyazı verilerini taşıyan bir InputStream ve altyazı verilerinin biçimini belirten bir MediaFormat nesnesi kabul eder. createSubtitleFormat() kullanarak bu biçimi belirtebilirsiniz. Bu altyazılar, kullanıcının tercihlerine göre videonun üzerinde de gösterilir.

Video içeriğinizi göstermek için VideoView kullanmıyorsanız altyazı yer paylaşımınızı, kullanıcının altyazı tercihiyle mümkün olduğunca eşleşecek şekilde ayarlamanız gerekir. Yeni CaptioningManager API, CaptioningManager.CaptionStyle tarafından tanımlanan yazı tipi ve renk gibi stiller de dahil olmak üzere kullanıcının altyazı tercihlerini sorgulamanıza olanak tanır. Kullanıcı, videonuz başladıktan sonra bazı tercihleri ayarlarsa tercihlerden herhangi biri değiştiğinde geri arama almak için bir CaptioningManager.CaptioningChangeListener örneği kaydederek tercihlerdeki değişiklikleri dinlemeniz ve ardından altyazılarınızı gerektiği gibi güncellemeniz gerekir.

Animasyon ve Grafik

Sahneler ve geçişler

Yeni android.transition çerçevesi, kullanıcı arayüzünüzün farklı durumları arasında animasyonlar yapmayı kolaylaştıran API'ler sağlar. Temel özelliklerden biri, her biri için ayrı bir düzen oluşturarak kullanıcı arayüzünüzün "sahne" olarak bilinen farklı durumlarını tanımlayabilmenizdir. Bir sahneden diğerine animasyon eklemek istediğinizde, mevcut sahnenin düzenini sonraki sahnenin düzeniyle değiştirmek için gerekli animasyonu hesaplayan bir "geçiş" gerçekleştirin.

İki sahne arasında geçiş yapmak için genellikle aşağıdakileri yapmanız gerekir:

  1. Değiştirmek istediğiniz kullanıcı arayüzü bileşenlerini içeren ViewGroup öğesini belirtin.
  2. Değişikliğin nihai sonucunu (sonraki sahne) temsil eden düzeni belirtin.
  3. Sayfa düzeni değişikliğinin animasyonlu olarak gösterilmesi için geçiş türünü belirtin.
  4. Geçişi yürütün.

1. ve 2. adımları tamamlamak için bir Scene nesnesi kullanabilirsiniz. Scene, sahnenin üst görünümü ve sahnenin düzeni dahil olmak üzere bir geçiş gerçekleştirmek için gerekli olan düzen özelliklerini açıklayan meta veriler içerir. Sınıf kurucu veya statik getSceneForLayout() yöntemini kullanarak Scene oluşturabilirsiniz.

Ardından 3. ve 4. adımları tamamlamak için TransitionManager'ü kullanmanız gerekir. Bunun bir yolu, Scene öğenizi go() statik yöntemine iletmektir. Bu işlem, sahnenin mevcut düzendeki üst görünümünü bulur ve Scene tarafından tanımlanan düzene ulaşmak için alt görünümlerde geçiş gerçekleştirir.

Alternatif olarak, hiç Scene nesnesi oluşturmanız gerekmez. Bunun yerine, değiştirmek istediğiniz görünümleri içeren bir ViewGroup belirterek beginDelayedTransition()'ü çağırabilirsiniz. Ardından hedef görünümleri ekleyin, kaldırın veya yeniden yapılandırın. Sistem, değişiklikleri gerektiği gibi düzenledikten sonra etkilenen tüm görünümler animasyonlu bir geçişle değiştirilir.

Daha fazla kontrol için projenizin res/transition/ dizininde bir XML dosyası kullanarak önceden tanımlanmış sahneler arasında gerçekleşmesi gereken geçiş gruplarını tanımlayabilirsiniz. Bir <transitionManager> öğesinin içinde, her biri bir sahneyi (bir düzen dosyasına referans) ve bu sahneye girerken ve/veya çıkarken uygulanacak geçişi belirten bir veya daha fazla <transition> etiketi belirtin. Ardından, inflateTransitionManager() kullanarak bu geçiş grubunu şişirin. Her geçişi transitionTo() ile yürütmek için döndürülen TransitionManager değerini kullanın. Bu işlem için <transition> etiketlerinden biriyle temsil edilen bir Scene gönderin. Geçiş gruplarını TransitionManager API'leriyle programatik olarak da tanımlayabilirsiniz.

Geçiş belirtirken Transition alt sınıfları tarafından tanımlanan Fade ve ChangeBounds gibi çeşitli önceden tanımlanmış türleri kullanabilirsiniz. Geçiş türü belirtmezseniz sistem varsayılan olarak AutoTransition kullanır. Bu geçiş türü, gerektiğinde görünümleri otomatik olarak karartır, taşır ve yeniden boyutlandırır. Ayrıca, bu sınıflardan herhangi birini genişleterek animasyonlarınızı istediğiniz şekilde gerçekleştirecek özel geçişler oluşturabilirsiniz. Özel geçişler, istediğiniz tüm mülk değişikliklerini izleyebilir ve bu değişikliklere göre istediğiniz animasyonu oluşturabilir. Örneğin, bir görünümün "rotation" mülkünde yapılan değişiklikleri dinleyen ve ardından değişiklikleri animasyonlu olarak gösteren bir Transition alt sınıfı sağlayabilirsiniz.

Daha fazla bilgi için TransitionManager belgelerini inceleyin.

Animasyon duraklatma

Animator API'leri artık pause() ve resume() yöntemleriyle devam eden bir animasyonu duraklatmanıza ve devam ettirmenize olanak tanır.

Bir animasyonun durumunu izlemek için Animator.AnimatorPauseListener arayüzünü uygulayabilirsiniz. Bu arayüz, animasyon duraklatıldığında ve devam ettirildiğinde geri çağırma sağlar: pause() ve resume(). Ardından dinleyiciyi addPauseListener() ile bir Animator nesnesine ekleyin.

Alternatif olarak, AnimatorListenerAdapter soyut sınıfını alt sınıfa alabilirsiniz. Bu sınıf artık Animator.AnimatorPauseListener tarafından tanımlanan duraklatma ve devam ettirme geri çağırma işlevleri için boş uygulamalar içeriyor.

Yeniden kullanılabilir bit eşlemleri

Artık, yeni bit eşlem farklı bir boyutta olsa bile, kodu çözülen bit eşlemin (getByteCount() üzerinden kullanılabilir) elde edilen bayt sayısı, yeniden kullanılan bit eşlemin ayrılan bayt sayısından (getAllocationByteCount() üzerinden kullanılabilir) az veya ona eşit olduğu sürece, BitmapFactory'teki herhangi bir değişken bit eşlemini diğer bit eşlemelerin kodunu çözmek için yeniden kullanabilirsiniz. Daha fazla bilgi için inBitmap sayfasına bakın.

Bitmap için yeni API'ler, BitmapFactory dışında yeniden kullanım için benzer yeniden yapılandırmalara (manuel bitmap oluşturma veya özel kod çözme mantığı için) olanak tanır. Artık setHeight() ve setWidth() yöntemleriyle bir bitmap'in boyutlarını ayarlayabilir ve temel bitmap tahsisini etkilemeden setConfig() ile yeni bir Bitmap.Config belirtebilirsiniz. reconfigure() yöntemi, bu değişiklikleri tek bir çağrıyla birleştirmek için de kullanışlı bir yöntemdir.

Ancak, temel piksel arabelleği tahmin edilebilir bir şekilde yeniden eşlenmeyeceği için görüntü sistemi tarafından kullanılan bir bitmap'i yeniden yapılandırmayın.

Kullanıcı İçeriği

Depolama erişim çerçevesi

Android'in önceki sürümlerinde, uygulamanızın başka bir uygulamadan belirli bir dosya türünü almasını istiyorsanız ACTION_GET_CONTENT işlemini içeren bir intent çağırması gerekir. Bu işlem, uygulamanıza içe aktarmak istediğiniz bir dosyayı istemenin uygun bir yolu olmaya devam etmektedir. Ancak Android 4.4, kullanıcının belirli bir türde bir dosya seçmesine ve dosyayı uygulamanıza aktarmadan uygulamanıza bu dosyaya uzun süreli okuma erişimi (muhtemelen yazma erişimi ile birlikte) vermesine olanak tanıyan ACTION_OPEN_DOCUMENT işlemini kullanıma sunmuştur.

Dosyalar için depolama hizmetleri sağlayan bir uygulama (ör. buluttaki kayıt hizmeti) geliştiriyorsanız yeni DocumentsProvider sınıfının alt sınıfı olarak bir içerik sağlayıcı uygulayarak dosyaları seçmek için bu birleşik kullanıcı arayüzüne katılabilirsiniz. DocumentsProvider alt sınıfınız, PROVIDER_INTERFACE işlemini ("android.content.action.DOCUMENTS_PROVIDER") kabul eden bir intent filtresi içermelidir. Ardından DocumentsProvider sınıfında dört soyut yöntemi uygulamanız gerekir:

queryRoots()
Bu işlem, DocumentsContract.Root içinde tanımlanan sütunları kullanarak doküman depolama alanınızın tüm kök dizinlerini açıklayan bir Cursor döndürmelidir.
queryChildDocuments()
Bu, DocumentsContract.Document içinde tanımlanan sütunları kullanarak belirtilen dizindeki tüm dosyaları açıklayan bir Cursor döndürmelidir.
queryDocument()
Bu işlev, DocumentsContract.Document içinde tanımlanan sütunları kullanarak belirtilen dosyayı açıklayan bir Cursor döndürmelidir.
openDocument()
Bu, belirtilen dosyayı temsil eden bir ParcelFileDescriptor döndürmelidir. Sistem, kullanıcı bir dosya seçtikten ve istemci uygulaması openFileDescriptor()'ü çağırarak dosyaya erişim istediğinde bu yöntemi çağırır.

Daha fazla bilgi için Depolama Alanı Erişim Çerçevesi kılavuzunu inceleyin.

Harici depolama alanına erişim

Artık ikincil harici depolama ortamlarında (ör. bir cihaz hem taklit depolama alanı hem de SD kart sağladığında) uygulamaya özgü dosyaları okuyabilir ve yazabilirsiniz. Yeni getExternalFilesDirs() yöntemi, File nesne dizisi döndürmesi dışında mevcut getExternalFilesDir() yöntemiyle aynı şekilde çalışır. Bu yöntem tarafından döndürülen yollardan herhangi birini okumadan veya yazmadan önce, depolama alanının şu anda kullanılabilir olup olmadığını doğrulamak için File nesnesini yeni getStorageState() yöntemine iletin.

Uygulamaya özel önbelleğe alma dizininize ve OBB dizininize erişmek için kullanılan diğer yöntemler de artık ikincil depolama cihazlarına erişim sağlayan ilgili sürümlere (sırasıyla getExternalCacheDirs() ve getObbDirs()) sahiptir.

Döndürülen File dizisindeki ilk giriş, cihazın birincil harici depolama alanı olarak kabul edilir. Bu, getExternalFilesDir() gibi mevcut yöntemler tarafından döndürülen File ile aynıdır.

Not: Android 4.4'ten itibaren platform, yukarıdaki yöntemleri kullanarak harici depolama alanındaki yalnızca uygulamanıza özel bölgelere erişmeniz gerektiğinde uygulamanızın WRITE_EXTERNAL_STORAGE veya READ_EXTERNAL_STORAGE almasını artık zorunlu tutmamaktadır. Ancak, getExternalStoragePublicDirectory() tarafından sağlanan harici depolama alanının paylaşılabilir bölgelerine erişmek istiyorsanız izinler gereklidir.

Senkronizasyon adaptörleri

ContentResolver içindeki yeni requestSync() yöntemi, istekleri SyncRequest.Builder ile oluşturabileceğiniz yeni SyncRequest nesnesine sarmalayarak ContentProvider için senkronizasyon isteği tanımlama işleminin bazı adımlarını basitleştirir. SyncRequest içindeki özellikler, mevcut ContentProvider senkronizasyon çağrılarıyla aynı işlevi sağlar ancak setDisallowMetered() etkinleştirilerek ağ ücretliyse senkronizasyonun bırakılması gerektiğini belirtme olanağı ekler.

Kullanıcı Girişi

Yeni sensör türleri

Yeni TYPE_GEOMAGNETIC_ROTATION_VECTOR sensörü, manyetometreye dayalı dönme vektörü verileri sağlar. Bu sensör, jiroskop kullanılamadığında veya telefon uykudayken cihazın yönünü kaydetmek için toplu sensör etkinlikleriyle kullanıldığında TYPE_ROTATION_VECTOR sensörüne yararlı bir alternatiftir. Bu sensör, TYPE_ROTATION_VECTOR'ten daha az güç gerektirir ancak gürültülü etkinlik verilerine eğilimli olabilir ve en etkili olduğu durum kullanıcının açık havada olmasıdır.

Android artık donanımda yerleşik adım sensörlerini de destekliyor:

TYPE_STEP_DETECTOR
Bu sensör, kullanıcı her adım attığında bir etkinlik tetikler. Bu sensör, her kullanıcı adımı için 1,0 değerine ve adımın ne zaman gerçekleştiğini belirten bir zaman damgasına sahip bir etkinlik yayınlar.
TYPE_STEP_COUNTER
Bu sensör, algılanan her adımda bir etkinlik de tetikler ancak bunun yerine, bu sensör bir uygulama tarafından ilk kez kaydedildikten sonra atılan toplam adım sayısını sağlar.

Bu iki adım sensörünün her zaman aynı sonuçları vermediğini unutmayın. TYPE_STEP_COUNTER etkinlikleri, TYPE_STEP_DETECTOR etkinliklerine kıyasla daha yüksek gecikmeli olarak gerçekleşir. Bunun nedeni, TYPE_STEP_COUNTER algoritmasının yanlış pozitifleri ortadan kaldırmak için daha fazla işlem yapmasıdır. Bu nedenle, TYPE_STEP_COUNTER'ün etkinlikleri yayınlaması daha yavaş olabilir ancak sonuçları daha doğru olur.

Her iki adım sensörü de donanıma bağlıdır (Nexus 5, bunları destekleyen ilk cihazdır). Bu nedenle, FEATURE_SENSOR_STEP_DETECTOR ve FEATURE_SENSOR_STEP_COUNTER sabitlerini kullanarak hasSystemFeature() ile kullanılabilirliğini kontrol etmeniz gerekir.

Toplu sensör etkinlikleri

Cihaz gücünü daha iyi yönetmek için SensorManager API'leri artık sistemin uygulamanıza sensör etkinliği grupları gönderme sıklığını belirtmenize olanak tanır. Bu, belirli bir süre boyunca uygulamanızın kullanabileceği gerçek sensör etkinliği sayısını azaltmaz. Bunun yerine, sistemin sensör güncellemeleriyle SensorEventListener'inizi çağırma sıklığını azaltır. Yani sistem, her etkinliği gerçekleştiği anda uygulamanıza göndermek yerine bir süre boyunca gerçekleşen tüm etkinlikleri kaydeder ve ardından bunları uygulamanıza tek seferde gönderir.

Gruplandırma sağlamak için SensorManager sınıfı, "maksimum rapor gecikmesi"ni belirtmenize olanak tanıyan registerListener() yönteminin iki yeni sürümünü ekler. Bu yeni parametre, SensorEventListener cihazınızın yeni sensör etkinliklerinin yayınlanması için tolere edeceği maksimum gecikmeyi belirtir. Örneğin, bir dakikalık bir toplu gecikme süresi belirtirseniz sistem, onSensorChanged() yönteminize art arda çağrılar yaparak (her toplu etkinlik için bir kez) son toplu etkinlik grubunu bir dakikadan uzun olmayan bir aralıkta yayınlar. Sensör etkinlikleri hiçbir zaman maksimum rapor gecikmesi değerinizden daha uzun süre gecikmez ancak diğer uygulamalar aynı sensör için daha kısa bir gecikme isteğinde bulunmuşsa daha erken gelebilir.

Ancak sensörün, rapor gecikmenize göre toplu etkinlikleri uygulamanıza yalnızca CPU etkinken ileteceğini unutmayın. Gruplandırmayı destekleyen bir donanım sensörü, CPU uykudayken sensör etkinliklerini toplamaya devam etse de uygulamanıza gruplandırılmış etkinlikleri sunmak için CPU'yu uyandırmaz. Sensörün etkinlikle ilgili belleği dolduğunda, en yeni etkinlikleri kaydetmek için en eski etkinlikleri silmeye başlar. Sensör hafızasını doldurmadan önce cihazı uyandırarak etkinlikleri kaybetmekten kaçınabilir ve en son etkinlik grubunu yakalamak için flush() işlevini çağırabilirsiniz. Belleğin ne zaman dolacağını ve temizlenmesi gerektiğini tahmin etmek için getFifoMaxEventCount() işlevini çağırarak kaydedebileceği maksimum sensör etkinliği sayısını alın ve bu sayıyı uygulamanızın her etkinliği istediği hıza bölün. Sensörü temizlemek için AlarmManager ile uyandırma alarmları ayarlamak üzere bu hesaplamayı kullanın. Bu hesaplama, Service'unuzu (SensorEventListener'yi uygulayan) çağırarak AlarmManager'ü tetikler.

Not: Donanım sensörünün desteğini gerektirdiği için sensör etkinliklerinin gruplandırılmasını tüm cihazlar desteklemez. Ancak Android 4.4'ten itibaren her zaman yeni registerListener() yöntemlerini kullanmanız gerekir. Bunun nedeni, cihaz gruplandırmayı desteklemiyorsa sistemin grup gecikmesi bağımsız değişkenini nazikçe yoksayıp sensör etkinliklerini gerçek zamanlı olarak yayınlamasıdır.

Denetleyici kimlikleri

Android artık bağlı her bir kumandayı, getControllerNumber() ile sorgulayabileceğiniz benzersiz bir tam sayı ile tanımlar. Bu sayede her bir kumandayı oyundaki farklı bir oyuncuyla ilişkilendirmeniz kolaylaşır. Her bir kontrol cihazının numarası, kullanıcı tarafından bağlantısının kesilmesi, bağlanması veya yeniden yapılandırılması nedeniyle değişebilir. Bu nedenle, InputManager.InputDeviceListener örneği kaydederek her giriş cihazına hangi kontrol cihazı numarasının karşılık geldiğini izlemeniz gerekir. Ardından, bir değişiklik olduğunda her InputDevice için getControllerNumber() işlevini çağırın.

Bağlı cihazlar artık getProductId() ve getVendorId()'den kullanılabilen ürün ve tedarikçi kimlikleri de sağlar. Tuş eşlemelerinizi bir cihazdaki mevcut tuş grubuna göre değiştirmeniz gerekiyorsa belirli tuşların kullanılıp kullanılamadığını kontrol etmek için cihazı hasKeys(int...) ile sorgulayabilirsiniz.

Kullanıcı Arayüzü

Tam ekran modu

Uygulamanıza ekranın tamamını dolduran bir düzen sağlamak için setSystemUiVisibility() için yeni SYSTEM_UI_FLAG_IMMERSIVE işaretçisi (SYSTEM_UI_FLAG_HIDE_NAVIGATION ile birlikte kullanıldığında) yeni bir sürükleyici tam ekran modu etkinleştirir. Tam ekran modu etkinken etkinliğiniz tüm dokunma etkinliklerini almaya devam eder. Kullanıcı, sistem çubuklarının normalde göründüğü bölgeyi içe doğru kaydırarak sistem çubuklarını gösterebilir. Bu işlem, sistem çubuklarının görünür kalması için SYSTEM_UI_FLAG_HIDE_NAVIGATION işaretini (ve uygulanmışsa SYSTEM_UI_FLAG_FULLSCREEN işaretini) temizler. Ancak sistem çubuklarının birkaç saniye sonra tekrar gizlenmesini istiyorsanız bunun yerine SYSTEM_UI_FLAG_IMMERSIVE_STICKY işaretini kullanabilirsiniz.

Saydam sistem çubukları

Artık Theme.Holo.NoActionBar.TranslucentDecor ve Theme.Holo.Light.NoActionBar.TranslucentDecor temalarıyla sistem çubuklarını kısmen yarı saydam hale getirebilirsiniz. Saydam sistem çubuklarını etkinleştirdiğinizde düzeniniz, sistem çubuklarının arkasındaki alanı doldurur. Bu nedenle, düzeninizin sistem çubukları tarafından kapatılmaması gereken kısmı için de fitsSystemWindows seçeneğini etkinleştirmeniz gerekir.

Özel bir tema oluşturuyorsanız bu temalardan birini üst tema olarak ayarlayın veya temanıza windowTranslucentNavigation ve windowTranslucentStatus stil özelliklerini ekleyin.

Gelişmiş bildirim dinleyici

Android 4.3'te, uygulamaların sistem tarafından yayınlandıkça yeni bildirimler hakkında bilgi almasına olanak tanıyan NotificationListenerService API'leri eklendi. Android 4.4'te bildirim dinleyicileri, bildirim için ek meta verileri ve bildirimin işlemleriyle ilgili tüm ayrıntıları alabilir:

Yeni Notification.extras alanı, bildirim oluşturucunuza EXTRA_TITLE ve EXTRA_PICTURE gibi ek meta veriler sunmak için bir Bundle içerir. Yeni Notification.Action sınıfı, bildirime ekli bir işlemin özelliklerini tanımlar. Bu özellikleri yeni actions alanından alabilirsiniz.

RTL düzenler için çizilebilir öğe yansıtma

Android'in önceki sürümlerinde, uygulamanızda sağdan sola düzenler için yatay yönlerinin tersine çevrilmesi gereken resimler varsa yansıyan resmi bir drawables-ldrtl/ kaynak dizine eklemeniz gerekir. Artık sistem, çizilebilir bir kaynakta autoMirrored özelliğini etkinleştirerek veya setAutoMirrored() işlevini çağırarak resimleri sizin için otomatik olarak yansıtabilir. Etkinleştirildiğinde, Drawable, düzen yönü sağdan sola olduğunda otomatik olarak yansıtılır.

Erişilebilirlik

View sınıfı artık XML düzeninize yeni accessibilityLiveRegion özelliğini ekleyerek veya setAccessibilityLiveRegion() işlevini çağırarak kullanıcı arayüzünüzün yeni metin içeriğiyle dinamik olarak güncellenen bölümleri için "canlı bölgeler" tanımlamanıza olanak tanır. Örneğin, "yanlış şifre" bildirimi gösteren bir metin alanı içeren bir giriş ekranı, canlı bölge olarak işaretlenmelidir. Böylece ekran okuyucu, mesaj değiştiğinde mesajı okur.

Erişilebilirlik hizmeti sunan uygulamalar artık AccessibilityNodeInfo.CollectionInfo ve AccessibilityNodeInfo.CollectionItemInfo kullanarak liste veya ızgara görünümleri gibi görünüm koleksiyonları hakkında bilgi sağlayan yeni API'lerle de özelliklerini geliştirebilir.

Uygulama İzinleri

Uygulamanızın belirli yeni API'leri kullanabilmek için <uses-permission> etiketiyle istemesi gereken yeni izinler aşağıda verilmiştir:

INSTALL_SHORTCUT
Uygulamanın Başlatıcı'ya kısayol yüklemesine izin verir
UNINSTALL_SHORTCUT
Uygulamaların, Başlatıcı'daki kısayolları kaldırmasına izin verir
TRANSMIT_IR
Uygulamanın, varsa cihazın kızılötesi vericisini kullanmasına izin verir

Not: Android 4.4'ten itibaren platform, getExternalFilesDir() gibi yöntemler kullanarak harici depolama alanındaki uygulamanıza özel bölgelere erişmek istediğinizde uygulamanızın WRITE_EXTERNAL_STORAGE veya READ_EXTERNAL_STORAGE almasını artık zorunlu tutmamaktadır. Ancak getExternalStoragePublicDirectory() tarafından sağlanan harici depolama alanının paylaşılabilir bölgelerine erişmek istiyorsanız izinler yine de gereklidir.

Cihaz Özellikleri

Aşağıda, uygulama gereksinimlerinizi beyan etmek ve Google Play'de filtrelemeyi etkinleştirmek ya da çalışma zamanında kontrol etmek için <uses-feature> etiketiyle tanımlayabileceğiniz yeni cihaz özellikleri verilmiştir:

FEATURE_CONSUMER_IR
Cihaz, tüketici kızılötesi cihazlarla iletişim kurabilir.
FEATURE_DEVICE_ADMIN
Cihaz, cihaz yöneticileri aracılığıyla cihaz politikasının uygulanmasını destekler.
FEATURE_NFC_HOST_CARD_EMULATION
Cihaz, ana makineye dayalı NFC kart emülasyonunu destekler.
FEATURE_SENSOR_STEP_COUNTER
Cihazda donanım adım sayacı bulunur.
FEATURE_SENSOR_STEP_DETECTOR
Cihaz, donanım adım algılayıcı içerir.

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