Arka plandan ön plan hizmeti başlatmayla ilgili kısıtlamalar

Android 12 (API düzeyi 31) veya sonraki sürümleri hedefleyen uygulamalar, birkaç özel durum dışında, uygulama arka planda çalışırken ön plan hizmetlerini başlatamaz. Bir uygulama arka planda çalışırken ön plan hizmeti başlatmaya çalışırsa ve ön plan hizmeti istisnai durumlardan birini karşılamıyorsa sistem ForegroundServiceStartNotAllowedException hatası verir.

Ayrıca, kullanımdayken izinleri (ör. vücut sensörü, kamera, mikrofon veya konum izinleri) gerektiren bir ön plan hizmeti başlatmak isteyen uygulamalar, arka planda başlatma kısıtlamalarından muaf tutulan durumlardan birine girse bile uygulama arka plandayken hizmeti oluşturamaz. Bunun nedeni, Kullanım sırasında izinleri gerektiren ön plan hizmetlerini başlatmayla ilgili kısıtlamalar bölümünde açıklanmıştır.

Arka planda başlatma kısıtlamalarından muafiyetler

Aşağıdaki durumlarda uygulamanız arka planda çalışırken bile ön plan hizmetlerini başlatabilir:

"Kullanım sırasında" izinleri gerektiren ön plan hizmetlerini başlatmayla ilgili kısıtlamalar

Android 14 (API düzeyi 34) veya sonraki sürümlerde, kullanım sırasında izin gerektiren bir ön plan hizmeti başlatıyorsanız dikkat etmeniz gereken özel durumlar vardır.

Uygulamanız Android 14 veya sonraki sürümleri hedefliyorsa işletim sistemi, ön plan hizmeti oluşturduğunuzda uygulamanızın söz konusu hizmet türü için tüm uygun izinlere sahip olup olmadığını kontrol eder. Örneğin, mikrofon türünde bir ön plan hizmeti oluşturduğunuzda işletim sistemi, uygulamanızın şu anda RECORD_AUDIO iznine sahip olduğunu doğrular. Bu izne sahip değilseniz sistem SecurityException hatası verir.

Bu durum, "uygulamayı kullanırken" izinleri için olası bir soruna neden olur. Uygulamanızın kullanımdayken izni varsa bu izne yalnızca ön plandayken sahip olur. Yani uygulamanız arka plandaysa ve kamera, konum veya mikrofon türünde bir ön plan hizmeti oluşturmaya çalışırsa sistem, uygulamanızın şu anda gerekli izinlere sahip olmadığını görür ve SecurityException hatası verir.

Benzer şekilde, uygulamanız arka plandaysa ve BODY_SENSORS izni gerektiren bir sağlık hizmeti oluşturuyorsa uygulamanın şu anda bu izni yoktur ve sistem bir istisna oluşturur. (Bu durum, ACTIVITY_RECOGNITION gibi farklı izinler gerektiren bir sağlık hizmeti için geçerli değildir.) PermissionChecker.checkSelfPermission() yöntemini çağırmak bu sorunu önlemez. Uygulamanızda kullanım sırasında izin varsa ve bu izne sahip olup olmadığını kontrol etmek için checkSelfPermission() yöntemini çağırıyorsa uygulama arka planda olsa bile yöntem PERMISSION_GRANTED değerini döndürür. Yöntem PERMISSION_GRANTED değerini döndürdüğünde "Uygulamanız, uygulama kullanımdayken bu izne sahip" anlamına gelir.

Bu nedenle, ön plan hizmetiniz kullanımdayken izin gerektiriyorsa hizmet tanımlanmış muafiyetlerden birine girmediği sürece uygulamanızda görünür bir etkinlik varken Context.startForegroundService() veya Context.bindService() yöntemini çağırmanız gerekir.

Kullanım sırasında izinlerle ilgili kısıtlamalardan muafiyetler

Bazı durumlarda, uygulama arka planda çalışırken ön plan hizmeti başlatılsa bile uygulama ön planda çalışırken ("kullanımdayken") konum, kamera ve mikrofon bilgilerine erişebilir.

Aynı durumlarda, hizmet location ön plan hizmet türünü beyan ederse ve ACCESS_BACKGROUND_LOCATION iznine sahip bir uygulama tarafından başlatılırsa bu hizmet, uygulama arka planda çalışırken bile konum bilgilerine her zaman erişebilir.

Aşağıdaki listede bu durumlar yer almaktadır:

  • Bir sistem bileşeni hizmeti başlatır.
  • Hizmet, uygulama widget'larıyla etkileşim kurarak başlar.
  • Hizmet, bir bildirimle etkileşim kurarak başlar.
  • Hizmet, farklı ve görünür bir uygulamadan gönderilen PendingIntent olarak başlar.
  • Hizmet, cihaz sahibi modunda çalışan bir cihaz politikası denetleyici uygulaması tarafından başlatılır.
  • Hizmet, VoiceInteractionService sağlayan bir uygulama tarafından başlatılır.
  • Hizmet, START_ACTIVITIES_FROM_BACKGROUND ayrıcalıklı iznine sahip bir uygulama tarafından başlatılır.

Uygulamanızda hangi hizmetlerin etkilendiğini belirleme

Uygulamanızı test ederken ön plan hizmetlerini başlatın. Başlatılan bir hizmetin konuma, mikrofona ve kameraya erişimi kısıtlanmışsa Logcat'te aşağıdaki mesaj görünür:

Foreground service started from background can not have \
location/camera/microphone access: service SERVICE_NAME