4 votes

Android : Est-il possible de créer un objet de notification à appeler (au lieu d'écrire une méthode à chaque fois) ?

Je suis novice en matière de programmation Android et je commence tout juste à apprendre, ce que je fais petit à petit en bricolant, ainsi qu'en utilisant les connaissances que j'ai acquises avec Java.

Je souhaite créer un notification pour contenir toutes les méthodes de notification à appeler à chaque fois que je souhaite qu'une notification se produise. Pour une raison quelconque, j'ai un problème de exception pendant que le programme crée un NotificationManager pour créer un canal de notification. Cela ne semble se produire que lorsque l'on crée l'objet notification une classe distincte.

Classe MainActivity :

package com.example.colombian.textingclasses;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        notifications n = new notifications(this);
    }

}

classe de notifications :

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.os.Build;

import android.support.v7.app.AppCompatActivity;

public class notifications {

    private Context context;

    public final String CHANNEL_ID = "customChannel";

    public notifications(Context c) {
        createNotificationChannel();
        context = c;
    }

    //creates a notification channel
    private void createNotificationChannel() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = "MyChannel";
            String description = "Description";
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);
/*******Error happens below*******/
            NotificationManager nm = (NotificationManager) context.getSystemService(NotificationManager.class); //error
            nm.createNotificationChannel(channel);
        }
    }

}

Exception :

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.colombian.textingclasses, PID: 16471
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.colombian.textingclasses/com.example.colombian.textingclasses.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.Class)' on a null object reference
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
                      at android.app.ActivityThread.-wrap11(Unknown Source:0)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
                      at android.os.Handler.dispatchMessage(Handler.java:105)
                      at android.os.Looper.loop(Looper.java:164)
                      at android.app.ActivityThread.main(ActivityThread.java:6940)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.Class)' on a null object reference
                      at com.example.colombian.textingclasses.notifications.createNotificationChannel(notifications.java:32)
                      at com.example.colombian.textingclasses.notifications.<init>(notifications.java:19)
                      at com.example.colombian.textingclasses.MainActivity.onCreate(MainActivity.java:14)
                      at android.app.Activity.performCreate(Activity.java:7174)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032) 
                      at android.app.ActivityThread.-wrap11(Unknown Source:0) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696) 
                      at android.os.Handler.dispatchMessage(Handler.java:105) 
                      at android.os.Looper.loop(Looper.java:164) 
                      at android.app.ActivityThread.main(ActivityThread.java:6940) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) 

Ce qui est étrange, c'est que lorsque le createNotificationChannel() se trouve à l'intérieur de la méthode MainActivity elle fonctionne parfaitement. Cela semble même fonctionner si je fais de la classe notification une classe interne de MainActivity . Je ne comprends pas pourquoi il y a une exception lorsque je le copie dans une classe séparée pour créer un objet.

Gardez à l'esprit que ceci est basé sur l'API 26+ ou Android 8.0.0.

__

P.S. J'espère que ma question est suffisamment précise. C'est la première fois que je pose une question ici, alors n'hésitez pas à me faire savoir s'il y a quelque chose à clarifier. Je vous remercie.

1voto

Sagar Points 12352

Vous essayez de créer le canal de notification avant context est initialisé. Initialiser le contexte avant de l'utiliser comme suit :

 public notifications(Context c) {
    context = c;
    createNotificationChannel();       
 }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X