创建Intent的结果是 "试图调用虚拟方法'java.lang.String android.content.Context.getPackageName()'"

问题描述 投票:0回答:1

我正试图按照谷歌上的代码进行操作。在Wear OS设备上创建通知.

import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.app.NotificationCompat.WearableExtender

class MainActivity : WearableActivity() {


    val notificationId = 1
    // The channel ID of the notification.
    val id = "my_channel_01"
    // Build intent for notification content
    val viewPendingIntent = Intent(this, com.alborz.innout.MainActivity::class.java).let { viewIntent ->
        viewIntent.putExtra(EXTRA_EVENT_ID, notificationId)
        PendingIntent.getActivity(this, 0, viewIntent, 0)
    }
    // Notification channel ID is ignored for Android 7.1.1
    // (API level 25) and lower.
    val notificationBuilder = NotificationCompat.Builder(this, id)
        .setLocalOnly(true)
        .setSmallIcon(R.drawable.ic_launcher_foreground)
        .setContentTitle("TITLE")
        .setContentText("TEXT")
        .setContentIntent(viewPendingIntent)

后来我尝试激活通知,像这样。

    button_in.setOnClickListener {
        NotificationManagerCompat.from(this).apply {
            notify(notificationId, notificationBuilder.build())
        }
    }

但我得到一个我不明白的错误。(我是Kotlin的新手,所以可能错过了一些明显的东西)

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.alb.innout/com.alb.innout.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2844)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3049)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1809)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6680)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
        at android.content.ContextWrapper.getPackageName(ContextWrapper.java:142)
        at android.content.ComponentName.<init>(ComponentName.java:130)
        at android.content.Intent.<init>(Intent.java:6082)
        at com.alb.innout.MainActivity.<init>(MainActivity.kt:46)

第46线是 val viewPendingIntent = Intent ...

kotlin android-notifications wear-os
1个回答
0
投票

你应该把这个Intent和通知设置放在一个函数里面,当需要发送通知的时候再调用这个函数。你现在的方式是,Intent是在Activity被实例化的时候创建的,也就是在 onCreate() 而过早地被传为是。this 的函数和构造函数的参数,要使用它的上下文。

© www.soinside.com 2019 - 2024. All rights reserved.