2 votes

Comment accéder au contexte de l'application à partir d'un listener Android ?

J'ai un widget Android (qui étend la fonction AppWidgetProvider ) et j'essaie d'accéder au contexte de l'application à partir d'un service Listener. J'ai besoin d'accéder au contexte pour pouvoir changer le fond d'écran de l'application. Voici l'erreur que j'obtiens : Cannot refer to a non-final variable context inside an inner class defined in a different method . J'ai essayé la solution suggérée pour changer le contexte du modificateur en contexte final, mais l'image bitmap que j'ai créée est nulle. Est-ce que quelqu'un peut me suggérer la façon appropriée de traiter ce problème ? Voici un extrait du code :

private void startWallpaperService(Context context) {
    Intent wpIntent = new Intent(context, Wallpaper_Service.class);
    context.startService(wpIntent);

    Wallpaper_Service wpSrv = Wallpaper_Service.getService();

    if(wpSrv != null) {
        Log.i(TAG, "Wallpaper Service is not null");

        Wallpaper_Service.repetitionInterval=30*1000;

        wpSrv.setWallpaperListener(new Wallpaper_Service.WallpaperListener() {
            @Override
            public void onWallpaperUpdate(int imageId) {
                if(wpm == null)
                    Log.w(TAG, "wpm or context is null");
                else {
                    Bitmap background = BitmapFactory.decodeResource(context.getResources(), R.drawable.image1);  // I get a syntax error here
                    if(background==null){
                        Log.w(TAG, "background is null");
                    }else{

                        try {
                            wpm.setBitmap(background);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

            }
        });

    } else {
        Log.e(TAG, "Wallpaper Service failed");
    }
    }

2voto

serkan Points 1321

Pouvez-vous simplement créer une instance de contexte d'application finale dans la troisième ligne de votre méthode, par exemple :

final Context ctx  = context.getApplicationContext();

ou

final Context ctx  = context;

Et je suppose que vous pouvez maintenant utiliser le "ctx" dans votre méthode interne de décélération.

Cela ressemble à une limitation de la syntaxe Java et non à un problème de code.

J'espère que cela vous aidera.

-serkan

1voto

Gangnus Points 7646

Dans 95 % des cas, et toujours dans le cas des listeners, vous pouvez utiliser directement getApplicationContext() pour obtenir le contexte.

Si vous avez besoin d'un contexte pour obtenir des ressources du système, utilisez

Resources.getSystem().getString(R.string.somestuffofmyown) 

Vous pouvez l'utiliser partout dans votre application !

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