Setelah memutakhirkan telepon saya ke 8.1 Pengembang Pratinjau layanan latar belakang saya tidak lagi dijalankan dengan benar.
Dalam layanan jangka panjang saya, saya telah menerapkan metode startForeground untuk memulai pemberitahuan yang sedang berlangsung yang dipanggil pada buat.
@TargetApi(Build.VERSION_CODES.O)
private fun startForeground() {
// Safe call, handled by compat lib.
val notificationBuilder = NotificationCompat.Builder(this, DEFAULT_CHANNEL_ID)
val notification = notificationBuilder.setOngoing(true)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.build()
startForeground(101, notification)
}
Pesan eror:
11-28 11:47:53.349 24704-24704/$PACKAGE_NAMEE/AndroidRuntime: FATAL EXCEPTION: main
Process: $PACKAGE_NAME, PID: 24704
android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel=My channel pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x42 color=0x00000000 vis=PRIVATE)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1768)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
saluran yang tidak valid untuk pemberitahuan layanan , tampaknya saluran lama saya DEFAULT_CHANNEL_ID tidak lagi sesuai untuk API 27 Saya berasumsi. Apa saluran yang tepat? Saya sudah mencoba melihat melalui dokumentasi
Jawaban:
Setelah beberapa kali bermain-main dengan solusi yang berbeda saya menemukan bahwa seseorang harus membuat saluran notifikasi di Android 8.1 dan di atasnya.
Dari pemahaman saya, layanan latar belakang kini ditampilkan sebagai notifikasi normal yang kemudian dapat dipilih pengguna untuk tidak ditampilkan dengan membatalkan pilihan saluran notifikasi.
Perbarui : Juga jangan lupa untuk menambahkan izin latar depan seperti yang dipersyaratkan Android P:
sumber
IMPORTANCE_DEFAULT
bukanIMPORTANCE_NONE
?Solusi Java (Android 9.0, API 28)
Di
Service
kelas Anda , tambahkan ini:PEMBARUAN: ANDROID 9.0 PIE (API 28)
Tambahkan izin ini ke
AndroidManifest.xml
file Anda :sumber
Jawaban pertama sangat bagus hanya untuk orang-orang yang tahu kotlin, bagi mereka yang masih menggunakan java di sini saya menerjemahkan jawaban pertama
Untuk android, P jangan lupa untuk menyertakan izin ini
sumber
Bekerja dengan baik di Andorid 8.1:
Sampel yang diperbarui (tanpa kode yang ditinggalkan):
Potongan lama (ini adalah aplikasi yang berbeda - tidak terkait dengan kode di atas):
sumber
Notification.Builder(getApplicationContext()).setChannelId(CHANNEL_ONE_ID)...
keNotification.Builder(getApplicationContext(), CHANNEL_ONE_ID)...
PRIORITY_MAX
apa yang lebih baik untuk digunakan?Dalam kasus saya, itu karena kami mencoba mengirim pemberitahuan tanpa menentukan
NotificationChannel
:Tempat terbaik untuk meletakkan kode di atas adalah dalam
onCreate()
metode diApplication
kelas, sehingga kita hanya perlu mendeklarasikannya sekali untuk semua:Setelah kami mengatur ini, kami dapat menggunakan pemberitahuan dengan yang
channelId
baru saja kami tentukan:Kemudian, kita dapat menggunakannya untuk mengirim pemberitahuan:
Jika Anda ingin menggunakannya sebagai notifikasi layanan foreground:
sumber
Berkat @CopsOnRoad, solusinya sangat membantu tetapi hanya bekerja untuk SDK 26 dan lebih tinggi. Target aplikasi saya 24 dan lebih tinggi.
Agar Android Studio tidak mengeluh, Anda memerlukan persyaratan langsung di sekitar notifikasi. Tidak cukup pintar untuk mengetahui kode tersebut berada dalam metode yang bersyarat ke VERSION_CODE.O.
sumber
Ini berhasil untuk saya. Di kelas layanan saya, saya membuat saluran notifikasi untuk android 8.1 seperti di bawah ini:
Catatan: Buat saluran tempat Anda membuat Notifikasi untuk
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
sumber
Ini solusinya
Semoga ini akan membantu :)
sumber