web-dev-qa-db-fra.com

Comment puis-je obtenir le contexte de l'application à partir d'un service Android?

J'ai un service Android en cours d'exécution et à l'écoute de l'entrée du microphone. Je veux qu'il lance une activité lorsqu'un certain critère est rempli. Afin de créer une intention, j'ai besoin du contexte d'application. Comment puis-je l'avoir?

Intent i = new Intent(ctx, SONR.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ctx.startActivity(i);

La ligne ci-dessus ne commence pas mon activité.

Voici mon constructeur

public SONRClient(Context c, AudioRecord ar, int buffsize, final AudioManager am) {
    theAudioManager = am;
    theaudiorecord = ar;
    bufferSize = buffsize;
    ctx = c;
    CLIENT_ON = true;
}

Voici mon onCreate

@Override
public void onCreate() {
    try {
        // LogFile.MakeLog("\n\nSONRClient CREATED");
        clientStopReceiver = new StopReceiver();
        ctx.registerReceiver(clientStopReceiver, 
            new IntentFilter(SONR.DISCONNECT_ACTION));
        myByteReceiver = new SONRByteReceiver();
        theListener = new MicSerialListener(
            theaudiorecord, bufferSize, myByteReceiver);
        theApplication = getApplication();
    } catch (Exception e) {
        e.printStackTrace();
        ErrorReporter.getInstance().handleException(e);
    }
}

Il existe myByteReceiver qui écoute les signaux via l'entrée audio. Quand il trouve un signal correspondant, je veux qu'il lance une activité.

private class SONRByteReceiver implements ByteReceiver {
    private long lastplaytime = 0;
    private long lastmutetime = 0;
    private long lastskiptime = 0;
    private long lastvolutime = 0;
    private long lastbacktime = 0;

    public void receiveByte(int receivedByte) {
        try {
            theKeyEvent = -1;

            if (ismuted) {
                if (receivedByte != MUTE) {
                    volume = 0;
                    ismuted = false;
                }
            }

            switch (receivedByte) {

            case SONR_HOME:
                Log.d(TAG, "HOME");

                Intent i = new Intent(ctx, SONR.class);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                theApplication.startActivity(i);

                break;
            default:
                Log.d(TAG, "default");
                Log.d(TAG,"RECEIVED " + receivedByte);
                // LogFile.MakeLog("RECEIVED " + receivedByte);
                break;
            }

            if (theKeyEvent >= 0) {
                sendbroadcast();
            }
        } catch (Exception e) {
            e.printStackTrace();
            ErrorReporter.getInstance().handleException(e);
        }
    }
}

Voici le stacktrace

Java.lang.NullPointerException
    at com.sonrlabs.test.sonr.SONRClient$SONRByteReceiver.receiveByte(SONRClient.Java:320)
    at com.sonrlabs.test.sonr.AudioProcessor.processSample(AudioProcessor.Java:145)
    at com.sonrlabs.test.sonr.AudioProcessor.run(AudioProcessor.Java:58)

La ligne 320 est theApplication.startActivity(i);

13
Sheehan Alam
ctx.getApplicationContext().startActivity(i)

boom.

0
Sheehan Alam

Vous pouvez utiliser getApplicationContext() dans votre service pour obtenir le contexte de l'application.

Essayez d'utiliser 

getApplication().startActivity(i);

Activité de démarrage Android du service

4
Craigy

Chaque service a son propre contexte, utilisez simplement le ça. Vous n'avez pas besoin de passer le contexte d'un service ou d'une activité.

Pas besoin de contexte d'activité dans le service.

Intent i = new Intent(ctx, SONR.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);

Faites simplement comme dans Activité

Service et activité sont tous deux des sous-classes de contexte.

4
Xar E Ahmer

Change ça:

Intent i = new Intent(ctx, SONR.class); 

à:

Intent i = new Intent(getApplicationContext(),SONR.class);
2
Rohit

Vous ne devez pas appeler getApplicationContext() dans son constructeur vide public, sinon il vous donnera une NullPointerException.

1
russellhoff

Vous affirmez que vous avez besoin d'un contexte d'application pour démarrer une activité est inexacte. Vous pouvez démarrer une activité à partir de n’importe quel contexte , y compris le service, qui est un contexte.

1
dhaag23

getBaseContext () qui retourne le contexte puisque chaque activité étend la classe de contexte

1

Il suffit de faire cela pour accéder au contexte de service

Intent i = new Intent(Service.this, SONR.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
0
DipDro420