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);
ctx.getApplicationContext().startActivity(i)
boom.
Vous pouvez utiliser getApplicationContext()
dans votre service pour obtenir le contexte de l'application.
Essayez d'utiliser
getApplication().startActivity(i);
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.
Change ça:
Intent i = new Intent(ctx, SONR.class);
à:
Intent i = new Intent(getApplicationContext(),SONR.class);
Vous ne devez pas appeler getApplicationContext()
dans son constructeur vide public, sinon il vous donnera une NullPointerException
.
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.
getBaseContext () qui retourne le contexte puisque chaque activité étend la classe de contexte
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);