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ştirici 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 üzere targetSdkVersion uygulamanızı "19" olarak ayarlamalı, bir Android 4.4 sistem görüntüsüne yüklemeli, test etmeli ve ardından bu değişikliği içeren bir güncelleme yayınlamalısınız.

Hem Android 4.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ğun sürdürülmesi hakkında daha fazla bilgi edinmek 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.

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

Uygulamanız, READ_EXTERNAL_STORAGE izni olmadığı sürece Android 4.4 üzerinde çalışırken harici depolama alanında paylaşılan dosyaları okuyamaz. Yani dizinde, getExternalStoragePublicDirectory() tarafından döndürülen dosyalara artık izin olmadan erişilemiyor. 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 üzerinde ç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ı ve ilgili API'leri temel alan kod, Chromium kaynak kodunun modern anlık görüntüsünü temel alacak şekilde yeni sürüme geçirildi. Bu; performans için ç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ükseltmenin kapsamı, uygulamanızın WebView kullanıyorsa davranışı bazı durumlarda etkilenebileceği anlamına gelir. Bilinen davranış değişiklikleri belgelenmiş olsa da ve çoğunlukla uygulamanızı targetSdkVersion sürümünü "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şlevleri sunmak için "süslemeler modunda" çalışı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 en kısa sürede Android 4.4'te test yapmanız ve targetSdkVersion uygulamanızı "19" veya sonraki bir sürüme güncellediğinizde 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 konusuna 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.

Güç verimliliğini artırmak için Android artık makul ölçüde benzer zamanlarda meydana gelen tüm uygulamaların alarmlarını toplu hale getirir. Böylece sistem, her alarmı işlemek için birkaç kez değil, bir kez uyandırır.

Alarmınız tam saat saatiyle ilişkilendirilmediyse ancak yine de belirli bir zaman aralığında (örneğin 14:00 - 16:00 arasında) çağrılması önemliyse, 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 tam olmayan toplu işlem davranışı yalnızca güncellenen uygulamalar için geçerlidir. targetSdkVersion ayarını "18 " veya daha düşük olarak ayarlarsanız alarmlarınız Android 4.4'te çalışırken önceki sürümlerde olduğu gibi çalışmaya devam eder.

Uygulamanız Content Çözümleyici'yi 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şlemleriniz, belirttiğiniz dönemin yaklaşık% 4'ü olan varsayılan esnek aralık dahilinde gerçekleştirilecektir. Ö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ı belirlemek üzere 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 ayarlarsanız mevcut senkronizasyon istekleriniz 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 başka hizmetler üzerinden bağlı bir yazıcı kullanarak herhangi bir dokümanı yazdırmalarına olanak tanıyan eksiksiz bir çerçeve sunuyor. Doküman yazdırmak isteyen bir uygulama ile bir yazıcıya yazdırma işleri teslim eden hizmetler arasındaki işlemi sistem yürütür. android.print çerçevesi, bir yazdırma dokümanını belirtmek ve bu dokümanı yazdırılmak üzere sisteme teslim etmek için gerekli tüm API'leri sağlar. Belirli bir yazdırma işi için gerçekte hangi API'lere ihtiyaç duyduğunuz, içeriğinize bağlıdır.

Genel içeriği yazdırma

Kullanıcı arayüzünüzdeki içeriği doküman olarak yazdırmak istiyorsanız öncelikle 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öntemini uygulamanız gerekir.

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

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

Görüntüleri yazdırma

Yalnızca 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 yerinize halleder. Yeni bir PrintHelper örneği oluşturup setScaleMode() ile ölçek modunu ayarlayıp Bitmap parametresini printBitmap() öğesine iletin. Bu kadar basit. Kitaplık, bit eşlemi yazıcıya göndermek için sistemle kurulan tüm diğer etkileşimleri işler.

Baskı hizmetleri oluşturma

Yazıcı OEM'si olarak, Android cihazlardan yazıcılarınızla birlikte çalışabilme özelliği sağlamak için android.printservice çerçevesini kullanabilirsiniz. Yazdırma hizmetlerini, kullanıcıların cihazlarına yükleyebileceği APK olarak oluşturabilir ve dağıtabilirsiniz . Bir yazdırma hizmeti uygulaması, sistemden yazdırma işlerini alan ve işleri uygun protokolleri kullanarak yazıcılarına ileten PrintService sınıfının alt sınıfına girerek esasen gözetimsiz bir hizmet işlevi görü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ısı"), uygulamaların cihazda SMS ve MMS mesajlarını okumasına ve yazmasına izin verir. Burada alınan SMS ve MMS mesajları, taslakları, gönderilenler, beklemede ve daha fazlası için tablolar bulunur.

Android 4.4'ten itibaren, sistem ayarları kullanıcıların "varsayılan SMS uygulaması" seçmesine izin vermektedir. Seçildikten sonra, yalnızca varsayılan SMS uygulaması SMS Sağlayıcısı'na 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 yeni bir SMS geldiğinde, birden fazla uygulamaya dağıtılabilen ve iptal edilemeyen bir yayın olan SMS_RECEIVED_ACTION yayınını dinleyerek bildirim alabilir. Bu yayın, varsayılan SMS uygulaması olarak seçilmediği halde, telefon numarası doğrulaması yapmak gibi gelen özel mesajları okuması gereken uygulamalar için tasarlanmıştır.

Daha fazla bilgi için SMS Uygulamalarınızı KitKat için 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) emüle edebilir. Bu şekilde, Android 4.4 çalıştıran ve NFC özellikli bir cihazın aynı anda birden fazla NFC kartı emüle etmesine ve bir NFC ödeme terminalinin veya başka bir NFC okuyucunun, uygulama tanımlayıcısına (AID) dayalı olarak uygun NFC kartıyla işlem başlatmasına olanak tanır.

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. 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 doğrudan işlemlere dahil olmaz ancak güvenlik unsuru 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 bir NfcAdapter.ReaderCallback uygulaması sağlarsınız.

Bu yeni özellik, ana makine kartı emülasyonuyla birlikte, Android'in mobil ödeme arayüzünün her iki ucunda da çalışabilmesini sağlar: Cihazlardan biri ödeme terminali (okuyucu modu etkinliği çalıştıran bir cihaz) ve başka bir cihaz da ödeme istemcisi olarak (NFC kartı emüle eden bir cihaz) çalışır.

Kızılötesi vericiler

Kızılötesi (IR) vericisi bulunan 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 birlikte 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.

Öncelikle hasIrEmitter() yöntemini çağırarak bir cihazda kızılötesi vericisi olup olmadığını kontrol etmeniz gerekir. Ancak uygulamanız yalnızca bu sinyale sahip cihazlarla uyumluysa manifest dosyanıza "android.hardware.consumerir" (FEATURE_CONSUMER_IR) için bir <uses-feature> öğesi eklemeniz gerekir.

Multimedya

Uyarlanabilir oynatma

MediaCodec API'leriyle artık uyarlanabilir video oynatma desteği de sunulmaktadır. Bu sayede, Surface üzerinde oynatma sırasında çözünürlük sorunsuz şekilde değiştirilir. Kod çözücü giriş karelerini yeni bir çözünürlüğe besleyebilir ve çıkış arabelleklerinin çözünürlüğü önemli bir boşluk olmadan değişir.

MediaFormat öğesine, 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 özellikler MediaFormat öğelerinize eklendikten sonra, MediaFormat öğesini configure() ile MediaCodec örneğinize iletin.

Codec, bu değerlerle aynı veya daha küçük çö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 almaya devam edin ancak yeni Sıra Parametresi Grubu (SPS) ve Resim Parametresi Grubu (PPS) değerlerini Anında Kod Çözücü Yenileme (IDR) çerçevesiyle birlikte tek bir arabellekte sağladığınızdan emin olun.

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

Not: Uyarlanabilir oynatma desteği, satıcıya bağlıdır. Bazı codec'ler daha yüksek çözünürlüklü ipuçları için daha fazla bellek gerektirebilir. Bu nedenle, maksimum çözünürlük değerlerini, kodunu çözdüğünüz kaynak materyale göre ayarlamalısınız.

İ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" hakkında zaman çizelgesi ayrıntıları sunar. Kullanılabilir en son zaman damgasını elde etmek için bir AudioTimestamp nesnesi örnek oluşturun ve getTimestamp() nesnesine iletin. Zaman damgası isteği başarılı olursa AudioTrack örneği, kare birimleri cinsinden 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 nanoTime değerini kullanabilirsiniz (monoton). Alternatif olarak, bir 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üsü okuyucu

Yeni ImageReader API, Surface haline getirilen 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() yöntemini çağırın. Yüzeyden yeni görüntüler sunulduğunda bildirim almak için ImageReader.OnImageAvailableListener arayüzünü uygulayın ve setOnImageAvailableListener() ile kaydedin.

Artık Surface öğenize içerik çizerken, ImageReader.OnImageAvailableListener her yeni resim çerçevesi kullanılabilir olduğunda onImageAvailable() numaralı telefona bir çağrı alır ve size karşılık gelen ImageReader öğesini sağlar. acquireLatestImage() veya acquireNextImage() yöntemini çağırarak karenin görüntü verilerini Image nesnesi olarak almak için ImageReader kullanılabilir.

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 resimleriniz ImageFormat veya PixelFormat içinde sabit değerlerle tanımlanan türlerden birine göre biçimlendirilmiş olmalıdır.

Zirve ve RMS ölçümü

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

Ses 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 ses düzeyini artırmanıza olanak sağlar. Bu, özellikle yukarıda bahsedilen yeni getMeasurementPeakRms() yöntemiyle birlikte kullanıldığında, başka 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 gelen medya denetleyicisi etkinliklerini kullanmasına izin veren 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 tüm medya uygulamalarının oynatılmasını kontrol edebilen yenilikçi yeni uygulamaların ve çevre birimlerinin oluşturulmasını sağlar.

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ını sağladığı için NotificationListenerService'i temel olarak kullanmak önemlidir.

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

Uzaktan kumandaların derecelendirmeleri

Android 4.4, kullanıcıların mevcut parçayı uzaktan kumandadan değerlendirmelerine olanak tanıyarak uzaktan kumanda istemcilerinin (RemoteControlClient ile medya kontrolü etkinliklerini alan uygulamalar) mevcut özelliklerinin üzerine kurulmuştur.

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

Kullanıcıların parkurları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() öğesine bir örnek iletin. Kullanıcı puanı değiştirdiğinde, RemoteControlClient.OnMetadataUpdateListener cihazınız, 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 Live Stream (HLS) videolarını oynatırken WebVTT altyazı parçalarını desteklemektedir. Böylece altyazı parçasını kullanıcının sistem ayarlarında tanımladığı altyazı tercihlerine göre görüntüler.

Ayrıca, addSubtitleSource() yöntemini kullanarak VideoView adlı sağlayıcıya WebVTT altyazı parçalarınızı sağlayabilirsiniz. Bu yöntem, altyazı verilerini taşıyan bir InputStream ve createSubtitleFormat() kullanarak belirtebileceğiniz altyazı verilerinin biçimini belirten bir MediaFormat nesnesini kabul eder. Bu altyazılar ayrıca kullanıcının tercihlerine göre videonun üzerinde görünür.

Video içeriğinizi görüntülemek için VideoView kullanmıyorsanız, altyazı yer paylaşımınızın kullanıcının altyazı tercihiyle mümkün olduğunca eşleşmesi gerekir. Yeni CaptioningManager API'si, CaptioningManager.CaptionStyle tarafından tanımlanan yazı tipi ve renk gibi stiller dahil olmak üzere kullanıcının altyazı tercihlerini sorgulamanıza olanak tanır. Videonuz başlatıldıktan sonra kullanıcının bazı tercihleri ayarlaması 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 Grafikler

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 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 uygulamak istediğinizde, düzeni geçerli sahneden bir sonraki sahneye değiştirmek için gerekli animasyonu hesaplayan bir "geçiş"i yürütün.

İ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 gerçekleştirin.

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

Ardından 3. ve 4. adımları uygulamak için TransitionManager kullanmanız gerekir. Bunlardan biri, Scene öğenizi go() statik yöntemine geçirmektir. Bu işlem, mevcut düzende sahnenin ü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() yöntemini ç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 kontrol 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 başvuru) ve o sahneye girerken ve/veya sahneden çıkarken uygulanacak geçişi belirten bir veya daha fazla <transition> etiketi belirtin. Daha sonra, inflateTransitionManager() kullanarak bu geçiş grubunu şişirin. Her geçişi transitionTo() ile yürütmek için <transition> etiketlerinden biriyle temsil edilen bir Scene ileterek döndürülen TransitionManager öğesini kullanın. Geçiş gruplarını TransitionManager API'leriyle programatik olarak da tanımlayabilirsiniz.

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

Daha fazla bilgi için TransitionManager belgelerine 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() içeren bir Animator nesnesine ekleyin.

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

Yeniden kullanılabilir bit eşlemler

Kodu çözülmüş bit eşlemin elde edilen bayt sayısının (getByteCount() tarihinden itibaren kullanılabilir) yeniden kullanılan bit eşlemin ayrılan bayt sayısından (getAllocationByteCount() tarihinden itibaren kullanılabilir) az veya buna eşit olduğu sürece, artık başka bir bit eşlemin kodunu çözmek için BitmapFactory içindeki herhangi bir değişken bit eşlemi yeniden kullanabilirsiniz. Bu durum, yeni bit eşlem farklı boyutta olsa bile geçerlidir. 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ıyla birleştirmek için kolay bir yol da sunar.

Bununla birlikte, temel piksel arabelleği tahmin edilebilir bir şekilde yeniden eşleştirilmeyeceği için 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 uygulamadan 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ı istemenin hâlâ uygun yoludur. Ancak Android 4.4'te, kullanıcının belirli bir türde dosya seçmesine ve dosyayı uygulamanıza aktarmadan uygulamanıza söz konusu dosya için uzun süreli okuma erişimi (muhtemelen yazma erişimi ile) izni veren ACTION_OPEN_DOCUMENT işlemi vardır.

Dosyalar için depolama hizmetleri sağlayan bir uygulama (ör. buluta kaydetme hizmeti) 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 içindeki dört soyut yöntemi uygulamanız gerekir:

queryRoots()
Bu, DocumentsContract.Root içinde tanımlanan sütunlar kullanılarak belge depolama alanınızın tüm kök dizinlerini açıklayan bir Cursor döndürmelidir.
queryChildDocuments()
Bu işlev, 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ı kullanarak 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 geçirin.

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 giriş, getExternalFilesDir() gibi mevcut yöntemler tarafından döndürülen File ile aynıdır.

Not: Android 4.4 sürümünden itibaren, yukarıdaki yöntemleri kullanarak harici depolamanın yalnızca uygulamaya özel bölgelerine erişmeniz gerektiğinde platform artık uygulamanızın WRITE_EXTERNAL_STORAGE veya READ_EXTERNAL_STORAGE'yi edinmesini gerektirmemektedir. Ancak harici depolama alanının getExternalStoragePublicDirectory() tarafından sağlanan paylaşılabilir bölgelerine erişmek istiyorsanız izinler gereklidir.

Adaptörleri senkronize etme

ContentResolver ürünündeki yeni requestSync() yöntemi, istekleri SyncRequest.Builder ile oluşturabileceğiniz yeni SyncRequest nesnesine dahil ederek ContentProvider için senkronizasyon isteği tanımlama işleminin bir kısmını basitleştirir. SyncRequest içindeki özellikler, mevcut ContentProvider senkronizasyon çağrılarıyla aynı işlevi sağlar, ancak setDisallowMetered() etkinleştirilerek ağ ölçülüyorsa senkronizasyonun atlanması gerektiğini belirtme olanağı ekler.

Kullanıcı Girişi

Yeni sensör türleri

Yeni TYPE_GEOMAGNETIC_ROTATION_VECTOR sensörü, manyetometreye dayalı dönüş vektör verileri sağlar. Bu, jiroskop bulunmadığında veya telefon uykudayken cihazın yönünü kaydetmek için toplu sensör etkinlikleri ile kullanıldığında TYPE_ROTATION_VECTOR sensörüne faydalı bir alternatiftir. Bu sensör, TYPE_ROTATION_VECTOR cihazından daha az güç gerektirir, ancak gürültülü etkinlik verilerine de 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ığında bir etkinliği tetikler. Bu sensör, kullanıcının her adımında, 1,0 değerinde bir etkinlik ve adımın ne zaman gerçekleştiğini belirten bir zaman damgası gönderir.
TYPE_STEP_COUNTER
Bu sensör, algılanan her adımda da bir etkinliği tetikler ancak bu sensör, bir uygulama tarafından ilk kez kaydedildiğinden beri toplam adım sayısını iletir.

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 gecikmeyle gerçekleşir. Ancak bunun nedeni, TYPE_STEP_COUNTER algoritmasının yanlış pozitifleri elemek için daha fazla işlem yapmasıdır. Bu nedenle TYPE_STEP_COUNTER, etkinlikleri daha yavaş 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 etmeniz gerekir.

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 iletmesini 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 sensör güncellemeleriyle sistemin SensorEventListener cihazınızı çağırma sıklığını azaltır. Yani sistem, her etkinliği gerçekleştiği anda uygulamanıza iletmek yerine, belirli bir süre içinde gerçekleşen tüm etkinlikleri kaydeder ve ardından bunları tek seferde uygulamanıza sunar.

Grup işlemeyi sağlamak için SensorManager sınıfı, "maksimum rapor gecikmesini" belirtmenize olanak tanıyan iki yeni registerListener() yöntemi sürümü ekler. Bu yeni parametre, yeni sensör etkinliklerinin iletilmesi için SensorEventListener cihazınızın tolerans göstereceği maksimum gecikmeyi belirtir. Örneğin, bir dakikalık toplu gecikme değeri belirtirseniz sistem, onSensorChanged() yönteminize ardışık olarak yapılan her etkinlik için bir kez olmak üzere ardışık olarak bir çağrıda bulunarak en son toplu etkinlik grubunu bir dakikadan uzun olmayan bir aralıkla teslim eder. Sensör etkinlikleri hiçbir zaman rapor gecikme değerinizden daha uzun süre gecikmez. Ancak diğer uygulamalar aynı sensör için daha kısa bir gecikme süresi istediyse daha erken de alabilirsiniz.

Bununla birlikte, sensörün yalnızca CPU uyanıkken rapor gecikmenize göre uygulamanıza toplu etkinlikler sunacağını unutmayın. Toplu işlemeyi destekleyen bir donanım sensörü, CPU uyku modundayken sensör olaylarını toplamaya devam etse de, uygulamanızı toplu etkinlikleri iletmek için CPU'yu uyandırmaz. Sensörün belirli bir süre boyunca hafızasında boş yer kalmadığında, en yeni etkinlikleri kaydetmek için en eski etkinlikleri çıkarmaya başlar. Sensör belleğini doldurmadan önce cihazı uyandırarak ve ardından flush() yöntemini çağırarak etkinlikleri kaybetmemek için en son etkinlik grubunu kaydedebilirsiniz. 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 etkinlik için istediği hıza bölün. Bu hesaplamayı, sensörü boşaltmak üzere Service cihazınızı başlatan (SensorEventListener uygular) AlarmManager ile uyanık kalma alarmları ayarlamak için kullanın.

Not: Donanım sensörünün desteklenmesi gerektiğinden tüm cihazlar sensör etkinliklerini gruplandırmayı desteklemez. Bununla birlikte, Android 4.4'ten başlayarak her zaman yeni registerListener() yöntemlerini kullanmanız gerekir. Cihaz, grup işlemi özelliğini desteklemiyorsa sistem toplu gecikme bağımsız değişkenini hassas bir şekilde yoksayar ve sensör etkinliklerini gerçek zamanlı olarak sunar.

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 ilişkilendirmeniz kolaylaşıyor. Kumandaların bağlantısının kesilmesi, bağlanması veya kullanıcı tarafından yeniden yapılandırılmış olması nedeniyle her kumandanın sayısı 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 bir değişiklik gerçekleştiğinde her InputDevice için getControllerNumber() çağrısı yapın.

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

Kullanıcı Arayüzü

Yoğun içerik tam ekran modu

Uygulamanıza tüm ekranı 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 etkileyici tam ekran modunu etkinleştirir. Tam ekran modu etkin durumdayken etkinliğiniz, tüm dokunma etkinliklerini almaya devam eder. Kullanıcı, sistem çubuklarının normalde göründüğü bölge 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 uygulanmışsa 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 temalarla (Theme.Holo.NoActionBar.TranslucentDecor ve Theme.Holo.Light.NoActionBar.TranslucentDecor) sistem çubuklarını kısmen yarı saydam yapabilirsiniz. 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 kaplanmaması gereken bölümü için de fitsSystemWindows özelliğini etkinleştirmeniz gerekir.

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

Geliştirilmiş bildirim dinleyici

Android 4.3, NotificationListenerService API'lerini ekleyerek uygulamaların yeni bildirimler hakkında sistem tarafından yayınlandıkça bilgi almalarına olanak tanır. Android 4.4'te, bildirim dinleyicileri bildirim için ek meta verileri alabilir ve bildirimin işlemleriyle ilgili ayrıntıları tamamlayabilir:

Yeni Notification.extras alanı, bildirim oluşturucunuzun EXTRA_TITLE ve EXTRA_PICTURE gibi ek meta verilerini yayınlamak için bir Bundle içerir. Yeni Notification.Action sınıfı, bildirime ekli bir işlemin özelliklerini tanımlar ve bu işlemi yeni actions alanından alabilirsiniz.

Sağdan sola düzenleri için çekilebilir yansıtma

Android'in önceki sürümlerinde, sağdan sola düzenler için yatay yönünü tersine çevirmesi gereken resimler varsa 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 için 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" bildirmenize olanak tanıyor. Örneğin, metin alanında "yanlış şifre" bildirimi gösteren bir giriş ekranı, canlı bölge olarak işaretlenmelidir. 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
Bir uygulamanın Başlatıcı'daki bir kısayolu kaldırmasına izin verir
TRANSMIT_IR
Uygulamanın, varsa cihazın kızılötesi vericisini kullanmasına izin verme

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

Cihaz Özellikleri

Uygulama gereksinimlerinizi bildirmek ve Google Play'de filtrelemeyi etkinleştirmek ya da çalışma zamanında kontrol etmek için <uses-feature> etiketiyle bildirebileceğiniz yeni cihaz özellikleri şunlardır:

FEATURE_CONSUMER_IR
Cihaz, tüketicilerin IR cihazlarıyla iletişim kurabiliyor.
FEATURE_DEVICE_ADMIN
Cihaz, cihaz yöneticileri aracılığıyla cihaz politikası zorunlu kılmayı destekler.
FEATURE_NFC_HOST_CARD_EMULATION
Cihaz, ana makineye dayalı NFC kart emülasyonunu destekler.
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ı bulunur.

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