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 MediaFormat
'ü MediaCodec
ö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:
-
setTransportControlFlags()
alanınaFLAG_KEY_MEDIA_RATING
işaretini ekleyerek derecelendirme kullanıcı arayüzünü kullanıcıya göstermek istediğinizi belirtin (geçerliyse). RemoteControlClient.MetadataEditor
almak içineditMetadata()
'ü arayın veaddEditableKey()
ileRATING_KEY_BY_USER
'ye iletin.- Ardından
putObject()
işlevini çağırarak veRATING_KEY_BY_USER
değerini anahtar, yukarıdaki derecelendirme stillerinden birini de değer olarak göndererek derecelendirme stilini belirtin.
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:
- Değiştirmek istediğiniz kullanıcı arayüzü bileşenlerini içeren
ViewGroup
öğesini belirtin. - Değişikliğin nihai sonucunu (sonraki sahne) temsil eden düzeni belirtin.
- Sayfa düzeni değişikliğinin animasyonlu olarak gösterilmesi için geçiş türünü belirtin.
- 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 birCursor
döndürmelidir. queryChildDocuments()
- Bu,
DocumentsContract.Document
içinde tanımlanan sütunları kullanarak belirtilen dizindeki tüm dosyaları açıklayan birCursor
döndürmelidir. queryDocument()
- Bu işlev,
DocumentsContract.Document
içinde tanımlanan sütunları kullanarak belirtilen dosyayı açıklayan birCursor
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.