Android 4.4 API'leri

API Düzeyi: 19

Android 4.4 (KITKAT), kullanıcılar ve uygulama geliştiriciler için yeni özellikler sunan Android platformunun yeni bir sürümüdür. Bu belgede, en önemli yeni API'ler tanıtılmaktadır.

Uygulama geliştiricisi olarak Android 4.4 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.4 çalıştıran 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 yeni API'leri kullanmaya başlamak için uygulamalarınızı Android 4.4 platformuna göre derleyin.

Hedef API düzeyinizi güncelleyin

Uygulamanızı Android 4.4 çalıştıran cihazlar için daha iyi optimize etmek amacıyla targetSdkVersion öğenizi "19" olarak ayarlamanız, bir Android 4.4 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.

Hem Android 4.4'te API'leri kullanabilir hem de kodunuza, minSdkVersion tarafından desteklenmeyen API'leri yürütmeden önce sistem API düzeyini kontrol eden koşullar ekleyerek eski sürümleri destekleyebilirsiniz. Geriye dönük uyumluluğu sağlama hakkında daha fazla bilgi için Farklı Platform Sürümlerini Destekleme bölümünü okuyun.

API düzeylerinin işleyiş şekli hakkında daha fazla bilgi için API Düzeyi nedir? başlıklı makaleyi okuyun.

Davranışla İlgili Önemli Değişiklikler

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 depolamadan veri okuyorsa...

Uygulamanız, READ_EXTERNAL_STORAGE izni olmadığı sürece Android 4.4 ile çalışırken harici depolamada paylaşılan dosyaları okuyamaz. Yani, getExternalStoragePublicDirectory() tarafından döndürülen dizinde bulunan dosyalara artık izin olmadan erişilemez. Ancak yalnızca getExternalFilesDir() tarafından sağlanan uygulamaya özel dizinlere erişmeniz gerekiyorsa READ_EXTERNAL_STORAGE iznine ihtiyacınız yoktur.

Uygulamanız Web Görünümü kullanıyorsa...

Uygulamanız Android 4.4 ile çalışırken, özellikle de uygulamanızın targetSdkVersion değerini "19" veya sonraki bir sürüme güncellediğinizde farklı davranabilir.

WebView sınıfının ve ilgili API'lerin temelini oluşturan kod, Chromium kaynak kodunun modern anlık görüntüsünü temel alacak şekilde yeni sürüme geçirildi. Bu değişiklik, performans açısından çeşitli iyileştirmeler, yeni HTML5 özellikleri için destek ve WebView içeriğinizde uzaktan hata ayıklama desteği sağlar. Bu yükseltme kapsamında, uygulamanız WebView kullanıyorsa bazı durumlarda davranışının etkilenebileceği anlamına gelir. Bilinen davranış değişiklikleri belgelenmiş olsa ve çoğunlukla uygulamanızı targetSdkVersion değerini "19" veya sonraki bir sürüme güncellediğinizde etkilese de yeni WebView, API düzeyi 18 ve altını hedefleyen uygulamalarda bazı eski işlevler sunmak için "süslemeler modunda" çalışmaktadır. Ancak uygulamanızın önceki WebView sürümünden bilinmeyen davranışlara bağlı olması mümkündür.

Bu nedenle, mevcut uygulamanız WebView kullanıyorsa mümkün olan en kısa sürede Android 4.4'te test yapmanız ve targetSdkVersion uygulamanızı "19" veya sonraki bir sürüme güncellemenizin uygulamanızın nasıl etkilenebileceği hakkında bilgi edinmek için Android 4.4'te Web Görünümü'ne taşıma makalesine bakmanız önemlidir.

Uygulamanız AlarmManager kullanıyorsa...

Uygulamanızın targetSdkVersion değerini "19" veya daha yüksek bir değere ayarladığınızda, set() veya setRepeating() kullanarak oluşturduğunuz alarmlar kesin değildir.

Android artık güç verimliliğini artırmak için tüm uygulamaların alarmlarını makul ölçüde benzer zamanlarda çalan alarmları gruplandırıyor. Böylece sistem her alarmı işlemek için birkaç kez değil, bir kez uyandırıyor.

Alarmınız tam bir saat saatiyle ilişkilendirilmese de alarmınızın belirli bir zaman aralığında (örneğin, 14:00 - 16:00 arasında) çağrılması önemliyse yeni setWindow() yöntemini kullanabilirsiniz. Bu yöntem, alarm için "en erken" zamanı ve sistemin alarmı çalıştırması gereken en erken saati izleyen bir "pencere"yi kabul eden yeni setWindow() yöntemini kullanabilirsiniz.

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

Bu toplu işleme davranışı yalnızca güncellenen uygulamalar için geçerlidir. targetSdkVersion ayarını "18" veya daha düşük olarak ayarladıysanız alarmlarınız Android 4.4 ve önceki sürümlerde olduğu gibi çalışmaya devam eder.

Uygulamanız ContentSolutionr kullanarak verileri senkronize ediyorsa...

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

Senkronizasyon işlemleri için kendi esnek aralığınızı belirtmek istiyorsanız yeni requestSync() yöntemini kullanmaya başlamanız gerekir. Daha fazla ayrıntı için aşağıdaki Senkronizasyon Bağdaştırıcıları ile ilgili bölüme bakın.

Bu esnek aralık davranışı yalnızca güncellenen uygulamalar için geçerlidir. targetSdkVersion değerini "18" veya daha düşük olarak ayarladıysanız mevcut senkronizasyon istekleriniz Android 4.4 ile çalışırken önceki sürümlerde olduğu gibi çalışmaya 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 dokümanları yazdırmalarına olanak tanıyan eksiksiz bir çerçeve içeriyor. Doküman yazdırmak isteyen bir uygulama ile yazıcıya yazdırma işleri gönderen hizmetler arasındaki işlemleri sistem yürütür. android.print çerçevesi, bir yazdırma dokümanını belirtmek ve bu belgeyi yazdırma amacıyla sisteme teslim etmek için gerekli tüm API'leri sağlar. Belirli bir yazdırma işi için hangi API'lere ihtiyaç duyduğunuz içeriğe bağlıdır.

Genel içerik yazdırma

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

İçeriğinizi ParcelFileDescriptor platformuna yazabilmeniz için önce PDF olarak iletmeniz gerekir. Yeni PdfDocument API'leri, getCanvas() ürününden yazdırılabilir içeriğinizi çizebileceğiniz bir Canvas sağlayarak bunu yapmanın kolay bir yolunu sunar. Ardından, writeTo() yöntemini kullanarak PdfDocument öğesini ParcelFileDescriptor öğesine yazın.

PrintDocumentAdapter için uygulamanızı tanımladıktan sonra, PrintManager yöntemini (print()) kullanarak kullanıcının isteği üzerine yazdırma işleri yürütebilirsiniz. Bu yöntem, PrintDocumentAdapter yöntemini bağımsız değişkenlerinden biri olarak alır.

Görüntüleri yazdırma

Sadece bir fotoğraf veya başka bir bit eşlem yazdırmak istiyorsanız destek kitaplığındaki yardımcı API'lar tüm işleri sizin için yapar. Yeni bir PrintHelper örneği oluşturup setScaleMode() ile ölçek modunu ayarlayıp Bitmap öğesini printBitmap() öğesine iletmeniz yeterlidir. Bu kadar basit. Kitaplık, bit eşlemi yazıcıya göndermek için sistemle kurulan geri kalan tüm etkileşimleri işler.

Yazdırma hizmetleri oluşturma

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

Uygulama içeriğinizi yazdırma hakkında daha fazla bilgi için İçeriği Yazdırma bölümünü okuyun.

SMS Sağlayıcı

Telephony içerik sağlayıcısı ("SMS Sağlayıcı"), uygulamaların cihazda SMS ve MMS mesajlarını okumasına ve yazmasına izin verir. Alınan, taslağı oluşturulan, gönderilen, beklemede olan ve benzeri SMS ve MMS mesajları için tablolar bulunur.

Android 4.4'ten itibaren sistem ayarları, kullanıcıların bir "varsayılan SMS uygulaması" seçmesine olanak tanır. Bir kez seçildiğinde, yalnızca varsayılan SMS uygulaması SMS Sağlayıcısı'na veri yazabilir ve kullanıcı bir SMS aldığında SMS_DELIVER_ACTION yayınını yalnızca varsayılan SMS uygulaması veya kullanıcı bir MMS aldığında WAP_PUSH_DELIVER_ACTION yayı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ı yazmaktan sorumludur.

Varsayılan SMS uygulaması olarak seçilmeyen diğer uygulamalar, yalnızca SMS Sağlayıcı'yı okuyabilir, ancak birden çok uygulamaya teslim edilebilecek, iptal edilemeyen bir yayın olan SMS_RECEIVED_ACTION yayınını dinleyerek yeni bir SMS geldiğinde de bilgilendirilebilir. Bu yayın, varsayılan SMS uygulaması olarak seçilmemiş olsa da, telefon numarası doğrulaması yapmak gibi işlemler için gelen özel mesajları okuması gereken uygulamalar için tasarlanmıştır.

Daha fazla bilgi edinmek üzere KitKat için SMS Uygulamalarınızı 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 kullanan ISO14443-4 (ISO-DEP) NFC kartlarını emüle edebilir (ISO7816-4'te belirtildiği gibi). Bu şekilde, Android 4.4 çalıştıran ve NFC özellikli bir cihazın aynı anda birden fazla NFC kartını taklit etmesine izin verilir ve NFC ödeme terminali veya başka bir NFC okuyucu, 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ı emülasyonu yapmak istiyorsanız HostApduService sınıfına göre bir hizmet bileşeni oluşturun. Ancak uygulamanız bunun yerine kart emülasyonu için bir güvenlik unsuru kullanıyorsa OffHostApduService sınıfına dayalı 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 bir NFC okuyucu modu, bir etkinliğin tüm NFC etkinliğini, ön plandayken yalnızca etkinliğin ilgilendiği etiket türlerini okuyacak şekilde kısıtlamasına olanak tanır. enableReaderMode() ile etkinliğiniz için okuyucu modunu etkinleştirebilirsiniz. Böylece, yeni etiketler algılandığında geri arama alan NfcAdapter.ReaderCallback uygulaması sağlayabilirsiniz.

Bu yeni özellik, ana kart emülasyonuyla birlikte, Android'in mobil ödeme arayüzünün her iki ucunda da çalışabilmesini sağlar: Cihazlardan biri ödeme noktası (okuyucu modu etkinliği çalıştıran bir cihaz), diğeri ise ödeme istemcisi (NFC kartı emülasyonu yapan bir cihaz) olarak çalışır.

Kızılötesi vericiler

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

Her zaman hasIrEmitter() çağrısı yaparak bir cihazın kızılötesi kızılötesi içerip içermediğini kontrol etmeniz gerekir. Ancak uygulamanız yalnızca bu sinyale sahip 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'leriyle de sağlanmaktadır. Bu API, oynatma sırasında çözünürlüğü kesintisiz bir şekilde Surface üzerinde değiştirir. Kod çözücü giriş karelerini yeni bir çözünürlükte besleyebilir ve çıkış arabelleklerinin çözünürlüğü önemli bir boşluk olmadan değişir.

MediaFormat işlevine, uygulamanızın codec'ten gerektirdiği maksimum çözünürlüğü belirten iki anahtar ekleyerek uyarlanabilir oynatmayı etkinleştirebilirsiniz: KEY_MAX_WIDTH ve KEY_MAX_HEIGHT. Bu öğeler MediaFormat öğelerinize eklendikten sonra MediaFormat öğesini configure() ile MediaCodec örneğinize iletin.

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

H.264 videonun kodunu çözerken çözünürlüğü değiştirmek için MediaCodec.queueInputBuffer() kullanarak kareleri sıraya eklemeye devam edin ancak yeni Sıra Parametresi Kümesi (SPS) ve Resim Parametresi Grubu (PPS) değerlerini Anında Kod Çözücü Yenileme (IDR) çerçevesiyle birlikte tek bir arabelleğe sağladığınızdan emin olun.

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

Not: Uyarlanabilir oynatma desteği satıcıya özeldir. Bazı codec'ler daha yüksek çözünürlük ipuçları için daha fazla bellek gerektirebilir. Bu nedenle, maksimum çözünürlük değerlerini, kodunu çözdüğünüz kaynak malzemeye 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 işlenen bir ses akışındaki belirli bir "kare" ile ilgili zaman çizelgesi ayrıntıları sağlar. Mevcut en güncel zaman damgasını elde etmek için bir AudioTimestamp nesnesini örneklendirin ve getTimestamp() öğesine iletin. Zaman damgası isteği başarılı olursa AudioTrack örneği, kare birimlerindeki bir konumla birlikte bu karenin sunulduğu veya sunulmasının taahhüt edildiği tahmini süre ile birlikte doldurulur.

framePosition ile karşılaştırıldığında en yakın ilişkili video karesini bulmak için AudioTimestamp öğesinde (monoton) nanoTime değerini kullanabilirsiniz. Böylece, sesle eşleştirmek için video karelerini bırakabilir, çoğaltabilir veya ara değer ekleyebilirsiniz. Alternatif olarak, video karesiyle aynı anda hangi ses karesinin beklendiğini tahmin etmek için nanoTime değeri ile gelecekteki bir video karesinin beklenen süresi arasındaki delta süresini belirleyebilirsiniz (örnek hızı dikkate alınarak).

Yüzey görüntü okuyucu

Yeni ImageReader API, Surface olarak oluşturulan görüntü arabelleklerine doğrudan erişim sunar. newInstance() statik yöntemiyle bir ImageReader edinebilirsiniz. Ardından, yeni bir Surface oluşturmak ve resim verilerinizi MediaPlayer veya MediaCodec gibi bir üreticiye iletmek için getSurface() işlevini çağırın. Ekranda yeni görüntüler olduğunda bildirim almak için ImageReader.OnImageAvailableListener arayüzünü uygulayın ve setOnImageAvailableListener() ile kaydedin.

Artık Surface öğenize içerik çizdikçe, her yeni resim çerçevesi kullanılabilir olduğunda ImageReader.OnImageAvailableListener cihazınız bir onImageAvailable() çağrısı alır ve size karşılık gelen ImageReader değerini sağlar. acquireLatestImage() veya acquireNextImage() yöntemini çağırarak çerçevenin görüntü verilerini Image nesnesi olarak almak için ImageReader kullanabilirsiniz.

Image nesnesi resmin zaman damgası, biçimi, boyutları ve piksel verilerine ByteBuffer içinde doğrudan erişim sağlar. Bununla birlikte, Image sınıfının resimlerinizi yorumlayabilmesi için resimlerinizin, ImageFormat veya PixelFormat değerlerinde sabit değerlerle tanımlanan türlerden birine göre biçimlendirilmesi gerekir.

Zirve ve RMS ölçümü

Artık Visualizer kaynağından gelen mevcut ses akışının tepe noktasını ve RMS'sini, yeni bir Visualizer.MeasurementPeakRms örneği oluşturup getMeasurementPeakRms() öğesine ileterek sorgulayabilirsiniz. Bu yöntemi çağırdığınızda belirli Visualizer.MeasurementPeakRms için tepe ve RMS değerleri en son ölçülen değerlere ayarlanır.

Ses yüksekliği artırıcı

LoudnessEnhancer, AudioEffect ürününün yeni bir alt sınıfıdır. MediaPlayer veya AudioTrack cihazınızın duyulabilir sesini artırmanıza olanak tanır. Bu, özellikle yukarıda bahsedilen yeni getMeasurementPeakRms() yöntemi ile birlikte kullanıldığında, diğer medyalar çalınırken söylenen ses parçalarının ses düzeyini artırmak için yararlı olabilir.

Uzaktan kumandalar

Android 4.0 (API düzeyi 14), medya uygulamalarının kilit ekranındaki medya denetimleri gibi uzak istemcilerden medya denetleyicisi etkinliklerini tüketmesine olanak tanıyan RemoteControlClient API'lerini kullanıma sunmuştur. Artık yeni RemoteController API'leri kendi uzaktan kumandanızı oluşturmanıza olanak tanıyarak, RemoteControlClient ile entegre olan herhangi bir medya uygulamasının oynatılmasını kontrol edebilen yenilikçi yeni uygulamalar ve çevre birimleri oluşturmanıza olanak tanır.

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 göndermek için NotificationListenerService sınıfını genişleten ve RemoteController.OnClientUpdateListener arayüzünü uygulayan bir hizmet oluşturmalısınız. Kullanıcıların uygulamanızı sistem güvenlik ayarlarında bildirim dinleyicisi olarak etkinleştirmelerini gerektiren uygun gizlilik kısıtlamaları sağladığından NotificationListenerService temeli olarak kullanmak önemlidir.

NotificationListenerService sınıfı, uygulamanız gereken birkaç soyut yöntem içerir ancak yalnızca medya oynatmayı işlemeye yönelik medya denetleyicisi etkinlikleriyle ilgileniyorsanız, bunları boş bırakıp bunun yerine RemoteController.OnClientUpdateListener yöntemlerine odaklanabilirsiniz.

Uzaktan kumandaların verdiği puanlar

Android 4.4, uzaktan kumanda istemcilerinin (RemoteControlClient ile medya kontrolü etkinliklerini alan uygulamalar) mevcut özelliklerini temel alarak, kullanıcıların mevcut parçayı uzaktan kumandadan derecelendirmelerine olanak tanır.

Yeni Rating sınıfı, kullanıcı puanıyla ilgili bilgileri içerir. Bir derecelendirme, derecelendirme stili (RATING_HEART, RATING_THUMB_UP_DOWN, RATING_3_STARS, RATING_4_STARS, RATING_5_STARS veya RATING_PERCENTAGE) ve söz konusu stil için uygun olan puan değerine göre tanımlanır.

Kullanıcıların parkurlarınızı uzaktan kumandadan derecelendirmelerine 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() öğesine bir örnek iletin. Kullanıcı puanı değiştirdiğinde, RemoteControlClient.OnMetadataUpdateListener öğeniz anahtar olarak RATING_KEY_BY_USER ve değer olarak bir Rating nesnesi iletilerek onMetadataUpdate() çağrısı alır.

Altyazılar

VideoView, artık HTTP Canlı Yayın (HLS) videoları oynatılırken WebVTT altyazı parçalarını desteklemektedir. Böylece, altyazı parçası kullanıcının sistem ayarlarında tanımladığı altyazı tercihlerine göre görüntülenir.

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

Video içeriğinizi görüntülemek için VideoView kullanmazsanız, altyazı yer paylaşımınızın kullanıcının altyazı tercihiyle mümkün olduğunca yakından eşleşmesi gerekir. Yeni CaptioningManager API'si, 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. Videonuz başladıktan sonra kullanıcının bazı tercihleri değiştirmesi durumunda, tercihlerden herhangi biri değiştiğinde geri arama almak için CaptioningManager.CaptioningChangeListener öğesinin bir örneğini kaydederek tercihlerde yapılan 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ı kolaylaştıran API'ler sunar. En önemli özelliklerden biri, her biri için ayrı bir düzen oluşturarak kullanıcı arayüzünüzde "sahneler" olarak bilinen farklı durumları tanımlayabilmenizdir. Bir sahneden diğerine animasyon uygulamak istediğinizde, düzeni geçerli sahneden sonraki sahneye 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 gerçekleştirmeniz 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. Düzen değişikliğini canlandırması gereken geçiş türünü belirtin.
  4. Geçişi yürütün.

1. ve 2. adımları uygulamak için bir Scene nesnesi kullanabilirsiniz. Scene öğesi, bir düzenin geçiş gerçekleştirmek için gerekli özelliklerini (ör. sahnenin üst görünümü ve sahne düzeni) açıklayan meta verileri içerir. Bir sınıf kurucuyu veya getSceneForLayout() statik yöntemini kullanarak bir Scene oluşturabilirsiniz.

Ardından 3. ve 4. adımları uygulamak için TransitionManager kullanmanız gerekir. Bunun bir yolu, Scene öğenizi go() statik yöntemine geçirmektir. Bu işlem, sahnenin geçerli 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 bir geçiş gerçekleştirir.

Alternatif olarak, bir Scene nesnesi oluşturmanız gerekmez. Bunun yerine, değiştirmek istediğiniz görünümleri içeren bir ViewGroup belirterek beginDelayedTransition() öğesini çağırabilirsiniz. Ardından, hedef görünümleri ekleyin, kaldırın veya yeniden yapılandırın. Sistem gerekli değişiklikleri yaptıktan sonra, etkilenen tüm görünümlerin animasyonunu içeren bir geçiş başlar.

Daha fazla denetim için projenizin res/transition/ dizinindeki bir XML dosyasını kullanarak önceden tanımlanmış sahneler arasında gerçekleşmesi gereken geçiş grupları tanımlayabilirsiniz. Bir <transitionManager> öğesinin içinde, her biri bir sahneyi (bir düzen dosyasına referans) belirten bir veya daha fazla <transition> etiketi ve o sahneye girerken ve/veya bu düzenden çıkarken uygulanacak geçişi belirtin. Daha sonra inflateTransitionManager() kullanarak bu geçiş grubunu artırın. <transition> etiketlerinden biriyle temsil edilen bir Scene ileterek transitionTo() ile her geçişi yürütmek için döndürülen TransitionManager öğesini kullanın. Ayrıca, TransitionManager API'leriyle geçiş gruplarını programatik olarak tanımlayabilirsiniz.

Bir geçiş belirtirken Transition alt sınıfları tarafından tanımlanan, Fade ve ChangeBounds gibi önceden tanımlanmış çeşitli türleri kullanabilirsiniz. Bir geçiş türü belirtmezseniz sistem varsayılan olarak AutoTransition kullanır. Bu işlem gerektiğinde görünümleri otomatik olarak karartır, taşır ve yeniden boyutlandırır. Ayrıca, animasyonları istediğiniz gibi gerçekleştirmek için bu sınıflardan herhangi birini genişleterek özel geçişler oluşturabilirsiniz. Özel geçiş, istediğiniz tüm özellik değişikliklerini izleyebilir ve bu değişikliklere dayalı olarak istediğiniz animasyonları oluşturabilir. Örneğin, bir görünümün "rotasyon" özelliğinde yapılan değişiklikleri izleyen ve ardından tüm değişiklikleri canlandıran bir Transition alt sınıfı sağlayabilirsiniz.

Daha fazla bilgi için TransitionManager dokümanlarına bakın.

Animatör duraklatılıyor

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

Bir animasyonun durumunu izlemek için bir animasyon duraklatılıp devam ettirildiğinde geri çağırma sağlayan Animator.AnimatorPauseListener arayüzünü uygulayabilirsiniz: pause() ve resume(). Ardından işleyiciyi addPauseListener() ile bir Animator nesnesine ekleyin.

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

Yeniden kullanılabilir bit eşlemler

Artık yeni bit eşlem farklı boyutta olsa bile, kodu çözülmüş bit eşlemin elde edilen bayt sayısının (getByteCount()'dan itibaren sunulur), yeniden kullanılan bit eşlemin ayrılan bayt sayısından (getAllocationByteCount() tarihinden itibaren) küçük veya ona eşit olduğu sürece, artık başka bir bit eşlemin kodunu çözmek için BitmapFactory içinde her türlü değişken bit eşlemi yeniden kullanabilirsiniz. Daha fazla bilgi için inBitmap başlıklı makaleyi inceleyin.

Bitmap için yeni API'ler, BitmapFactory dışında yeniden kullanım için benzer şekilde yeniden yapılandırmaya olanak tanır (manuel bit eşlem oluşturma veya özel kod çözme mantığı için). Artık setHeight() ve setWidth() yöntemleriyle bit eşlemin boyutlarını ayarlayabilir ve temel bit eşlem ayırmayı etkilemeden setConfig() ile yeni bir Bitmap.Config belirtebilirsiniz. reconfigure() yöntemi, bu değişiklikleri tek bir çağrıda birleştirmek için kolay bir yol sunar.

Bununla birlikte, temeldeki piksel arabelleği öngörülebilir bir şekilde yeniden eşlenmeyeceğinden görüntüleme sistemi tarafından kullanılmakta olan bir bit eşlemi yeniden yapılandırmamalısınız.

Kullanıcı İçeriği

Depolama erişimi çerçevesi

Android'in önceki sürümlerinde, uygulamanızın başka bir uygulamadaki belirli bir dosya türünü almasını istiyorsanız ACTION_GET_CONTENT işlemiyle bir amaç çağırması gerekir. Bu işlem, uygulamanıza aktarmak istediğiniz bir dosyayı istemek için yine de uygun bir yöntemdir. Ancak Android 4.4, kullanıcının belirli bir türde bir dosya seçmesine ve dosyayı uygulamanıza aktarmadan uygulamanıza bu dosya için uzun süreli okuma erişimi (muhtemelen yazma erişimiyle) vermesine olanak tanıyan ACTION_OPEN_DOCUMENT işlemini sunar.

Dosyalar için depolama hizmetleri (bulut kaydetme hizmeti gibi) sağlayan bir uygulama geliştiriyorsanız, yeni DocumentsProvider sınıfının alt sınıfı olarak bir içerik sağlayıcı uygulayarak dosya 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 amaç filtresi içermelidir. Ardından DocumentsProvider öğesinde dört soyut yöntemi uygulamanız gerekir:

queryRoots()
Bu, DocumentsContract.Root içinde tanımlanan sütunlar kullanılarak 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 kullanılarak belirtilen dizindeki tüm dosyaları açıklayan bir Cursor döndürmelidir.
queryDocument()
Bu, DocumentsContract.Document içinde tanımlanan sütunlar kullanılarak belirtilen dosyayı açıklayan bir Cursor döndürmelidir.
openDocument()
Bu, belirtilen dosyayı temsil eden bir ParcelFileDescriptor döndürmelidir. Kullanıcı bir dosya seçtiğinde ve istemci uygulaması openFileDescriptor() yöntemini çağırarak bu dosyaya erişim isteğinde bulunduğunda sistem bu yöntemi çağırır.

Daha fazla bilgi için Depolama Erişim Çerçevesi kılavuzuna bakın.

Harici depolama erişimi

Artık ikincil harici depolama ortamlarında (örneğin, bir cihaz hem emüle edilmiş depolama alanı hem de SD kart sağladığında) uygulamaya özel dosyaları okuyup yazabilirsiniz. Yeni getExternalFilesDirs() yöntemi, File nesne dizisi döndürmesi dışında mevcut getExternalFilesDir() yöntemiyle aynı şekilde çalışır. Bu yöntemin döndürdüğü yollardan herhangi birini okumadan veya yazmadan önce depolama alanının şu anda kullanılabilir olduğunu doğrulamak için File nesnesini yeni getStorageState() yöntemine iletin.

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

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ının yalnızca uygulamaya özel bölgelerine erişmeniz gerektiğinde artık uygulamanızın WRITE_EXTERNAL_STORAGE veya READ_EXTERNAL_STORAGE öğelerini edinmesini gerektirmemektedir. Ancak, harici depolama alanının getExternalStoragePublicDirectory() tarafından sağlanan 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 dahil ederek ContentProvider için senkronizasyon isteğini tanımlama prosedürünün bir kısmını basitleştirir. SyncRequest özelliğindeki özellikler, mevcut ContentProvider senkronizasyon çağrılarıyla aynı işlevi sunar ancak ağ ölçülüyorsa senkronizasyonun iptal edilmesi gerektiğini belirtmek için setDisallowMetered() özelliğini etkinleştirir.

Kullanıcı Girişi

Yeni sensör türleri

Yeni TYPE_GEOMAGNETIC_ROTATION_VECTOR sensörü, manyetometreye dayalı döndürme vektör verileri sağlar. Bu, jiroskop bulunmadığı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 cihazından daha az güç gerektirir ancak gürültülü etkinlik verilerine açık olabilir ve en yüksek performansı kullanıcı dışarıdayken gösterir.

Android artık donanımlardaki yerleşik adım sensörlerini de desteklemektedir:

TYPE_STEP_DETECTOR
Bu sensör, kullanıcı her adım attığınızda bir etkinliği tetikler. Bu sensör, her kullanıcı adımı için 1,0 değerinde bir etkinlik ve adımın ne zaman gerçekleştiğini belirten bir zaman damgası yayınlar.
TYPE_STEP_COUNTER
Bu sensör ayrıca, algılanan her adım için bir etkinliği tetikler ancak bu sensör, bir uygulama tarafından ilk kez kaydedildiğinden beri toplam adım sayısını gösterir.

Bu iki adımlı sensörlerin her zaman aynı sonuçları vermediğini unutmayın. TYPE_STEP_COUNTER etkinlikleri, TYPE_STEP_DETECTOR etkinliklerinden daha yüksek bir gecikmeyle gerçekleşir. Ancak bunun nedeni, TYPE_STEP_COUNTER algoritmasının yanlış pozitifleri elemek için daha fazla işleme yapmasıdır. Bu nedenle, TYPE_STEP_COUNTER daha yavaş etkinlikleri yayınlayabilir ancak sonuçları daha doğru olacaktır.

Her iki adım sensörü de donanıma bağlıdır (Bunları destekleyen ilk cihaz Nexus 5'tir). Bu nedenle, FEATURE_SENSOR_STEP_DETECTOR ve FEATURE_SENSOR_STEP_COUNTER sabit değerlerini kullanarak hasSystemFeature() ile kullanılabilirlik durumunu kontrol etmelisiniz.

Toplu sensör etkinlikleri

Cihaz gücünü daha iyi yönetebilmeniz için SensorManager API'leri artık sistemin, sensör etkinliği gruplarını uygulamanıza ne sıklıkta göndermesini istediğinizi belirtmenize olanak tanır. Bu, belirli bir süre boyunca uygulamanızda kullanılabilen gerçek sensör etkinliklerinin sayısını azaltmaz. Ancak, bunun yerine sistemin, sensör güncellemeleriyle SensorEventListener cihazınızı çağırma sıklığını azaltır. Yani sistem, her etkinliği gerçekleştiği anda uygulamanıza yayınlamak yerine, belirli bir sürede gerçekleşen tüm etkinlikleri kaydedip uygulamanıza tek seferde gönderir.

Gruplandırma sağlamak için SensorManager sınıfı, "maksimum rapor gecikmesini" belirtmenize olanak tanıyan registerListener() yönteminin iki yeni sürümünü ekler. Bu yeni parametre, yeni sensör etkinliklerinin iletilmesi için SensorEventListener cihazınızın tolere edebileceği maksimum gecikmeyi belirtir. Örneğin, bir dakikalık toplu gecikme belirtirseniz sistem, onSensorChanged() yönteminize art arda çağrı yaparak (toplu haldeki her etkinlik için bir kez) en son toplu etkinlik grubunu bir dakikadan uzun olmayan bir aralıklarla teslim eder. Sensör etkinlikleri hiçbir zaman maksimum rapor gecikme değerinizden daha uzun gecikmez ancak diğer uygulamalar aynı sensör için daha kısa bir gecikme süresi istediyse daha erken alabilirsiniz.

Ancak sensörün, rapor gecikmenize göre toplu etkinlikleri uygulamanıza yalnızca CPU uyanıkken ileteceğini unutmayın. Toplu işlemi destekleyen bir donanım sensörü, CPU uyku modundayken sensör etkinliklerini toplamaya devam edecek olsa da, uygulamanıza toplu etkinlikler sunmak için CPU'yu uyandırmaz. Sensörün etkinlikler için belleği tükendiğinde, en yeni etkinlikleri kaydetmek için en eski etkinlikleri çıkarmaya başlar. Sensör, belleği doldurmadan önce cihazı uyandırarak ve ardından en son etkinlik grubunu kaydetmek için flush() çağırarak etkinlik kaybını önleyebilirsiniz. Belleğin ne zaman dolacağını ve boşaltılması gerektiğini tahmin etmek için getFifoMaxEventCount() numaralı telefonu arayıp kaydedebileceği maksimum sensör etkinliği sayısını öğrenin ve bu sayıyı uygulamanızın her bir etkinliği istediği hıza bölün. Bu hesaplamayı, sensörü boşaltmak üzere Service cihazınızı çağıran (SensorEventListener uygular) AlarmManager ile uyanık kalma alarmları ayarlamak için kullanın.

Not: Sensör etkinliklerini toplu hale getirmek için donanım sensörünün desteği gerektiğinden tüm cihazlar desteklenmez. Bununla birlikte, Android 4.4'ten itibaren her zaman yeni registerListener() yöntemlerini kullanmanız gerekir. Çünkü cihaz, grup işlemeyi desteklemiyorsa sistem toplu gecikme bağımsız değişkenini yok sayar ve sensör etkinliklerini gerçek zamanlı olarak iletir.

Denetleyici kimlikleri

Android artık her bağlı kumandayı getControllerNumber() ile sorgulayabileceğiniz benzersiz bir tam sayıyla tanımlıyor. Böylece oyundaki her kumandayı farklı bir oyuncuyla daha kolay ilişkilendirebilirsiniz. Her kumandanın numarası, kumandaların bağlantısının kesilmesi, bağlanması veya kullanıcı tarafından yeniden yapılandırılması nedeniyle değişebilir. Bu nedenle, InputManager.InputDeviceListener örneğini kaydederek her giriş cihazına hangi kumanda numarasının karşılık geldiğini takip etmeniz gerekir. Ardından, değişiklik gerçekleştiğinde her InputDevice için getControllerNumber() işlevini çağırın.

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

Kullanıcı Arayüzü

Yoğun içerik tam ekran modu

Uygulamanıza ekranın tamamını kaplayan bir düzen sağlamak amacıyla setSystemUiVisibility() için yeni SYSTEM_UI_FLAG_IMMERSIVE işareti (SYSTEM_UI_FLAG_HIDE_NAVIGATION ile birlikte) yeni bir yoğunluk tam ekran modunu etkinleştirir. Kapsamlı tam ekran modu etkinken etkinliğiniz tüm dokunma etkinliklerini almaya devam eder. Kullanıcı, normalde sistem çubuklarının göründüğü alan boyunca içeri doğru hızlıca kaydırarak sistem çubuklarını ortaya çıkarabilir. Bu işlem, SYSTEM_UI_FLAG_HIDE_NAVIGATION işaretini (ve varsa SYSTEM_UI_FLAG_FULLSCREEN işaretini) temizleyerek sistem çubuklarının görünür kalmasını sağlar. Ancak, sistem çubuklarının birkaç saniye sonra tekrar gizlenmesini isterseniz, bunun yerine SYSTEM_UI_FLAG_IMMERSIVE_STICKY işaretini kullanabilirsiniz.

Şeffaf sistem çubukları

Artık yeni temalar (Theme.Holo.NoActionBar.TranslucentDecor ve Theme.Holo.Light.NoActionBar.TranslucentDecor) ile sistem çubuklarını kısmen yarı saydam hale getirebilirsiniz. Yarı 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 kaplamaması gereken kısmı için de fitsSystemWindows özelliğ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, uygulamaların sistem tarafından yayınlanan yeni bildirimler hakkında bilgi almasına olanak tanıyan NotificationListenerService API'lerini ekledi. Android 4.4'te, bildirim dinleyiciler bildirim için ek meta verileri alabilir ve bildirim işlemleriyle ilgili ayrıntıları tamamlayabilir:

Yeni Notification.extras alanı, bildirim oluşturucunuz için EXTRA_TITLE ve EXTRA_PICTURE gibi ek meta verileri yayınlamak üzere bir Bundle içerir. Yeni Notification.Action sınıfı, bildirime eklenmiş bir işlemin özelliklerini tanımlar. Bu sınıfı yeni actions alanından alabilirsiniz.

RTL düzenleri için çekilebilir yansıtma

Android'in önceki sürümlerinde, uygulamanız sağdan sola düzenler için yatay yönlerini tersine çevirmesi gereken resimler içeriyorsa yansıtılan resmi bir drawables-ldrtl/ kaynak dizinine eklemeniz gerekir. Artık sistem, çekilebilir bir kaynakta autoMirrored özelliğini etkinleştirerek veya setAutoMirrored() yöntemini çağırarak görüntüleri sizin yerinize otomatik olarak yansıtabilir. Etkinleştirildiğinde, düzen yönü sağdan sola olduğunda Drawable otomatik olarak yansıtılır.

Erişilebilirlik

View sınıfı artık XML düzeninize yeni accessibilityLiveRegion özelliğini ekleyerek veya setAccessibilityLiveRegion() yöntemini ç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, metin alanında "yanlış şifre" bildirimi gösteren bir giriş ekranının canlı bölge olarak işaretlenmesi gerekir. Böylece, ekran okuyucu değiştiğinde mesajı okur.

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

Uygulama İzinleri

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

INSTALL_SHORTCUT
Bir uygulamanın Başlatıcı'ya kısayol yüklemesine izin verir
UNINSTALL_SHORTCUT
Uygulamanın Başlatıcı'daki bir kısayolu kaldırmasına izin verir
TRANSMIT_IR
Uygulamaların, varsa cihazın IR vericisini kullanmasına izin verir

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

Cihaz Özellikleri

Uygulama gereksinimlerinizi bildirmek ve Google Play'de filtrelemeyi etkinleştirmek veya çalışma zamanında kontrol etmek için <uses-feature> etiketiyle beyan edebileceğiniz yeni cihaz özellikleri aşağıda verilmiştir:

FEATURE_CONSUMER_IR
Cihaz, tüketici IR cihazlarıyla iletişim kurabiliyor.
FEATURE_DEVICE_ADMIN
Cihaz, cihaz yöneticileri aracılığıyla cihaz politikası uygulamayı destekler.
FEATURE_NFC_HOST_CARD_EMULATION
Cihaz, ana makineye dayalı NFC kart emülasyonunu destekliyor.
FEATURE_SENSOR_STEP_COUNTER
Cihazda bir donanım adım sayacı vardır.
FEATURE_SENSOR_STEP_DETECTOR
Cihazda bir donanım adım algılayıcısı vardır.

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.