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:
-
setTransportControlFlags()
bölümüneFLAG_KEY_MEDIA_RATING
işaretini ekleyerek (geçerliyse) derecelendirme kullanıcı arayüzünü kullanıcıya göstermek istediğinizi belirtin. RemoteControlClient.MetadataEditor
alıpaddEditableKey()
ileRATING_KEY_BY_USER
aktarmak içineditMetadata()
numaralı telefonu arayın.- Ardından
putObject()
yöntemini çağırıp anahtar olarakRATING_KEY_BY_USER
, değer olarak da yukarıdaki derecelendirme stillerinden birini geçirerek 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()
öğ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:
- 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.
- Düzen değişikliğini canlandırması gereken geçiş türünü belirtin.
- 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 birCursor
döndürmelidir. queryChildDocuments()
- Bu işlev,
DocumentsContract.Document
içinde tanımlanan sütunlar kullanılarak belirtilen dizindeki tüm dosyaları açıklayan birCursor
döndürmelidir. queryDocument()
- Bu,
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. 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.