J'ai essayé de mettre en œuvre une application qui nécessite une prévisualisation de la caméra sur une surface. Comme je vois les choses, à la fois de l'activité et de la surface des cycles de vie se composent des états suivants:
- Quand j'ai lancer mon Activité:
onResume()->onSurfaceCreated()->onSurfaceChanged()
- Quand je laisse mon Activité:
onPause()->onSurfaceDestroyed()
Dans ce schéma, je peux faire des appels correspondants comme open/déblocage de l'appareil photo et commencer/arrêter la prévisualisation en onPause/onResume
et onSurfaceCreated()/onSurfaceDestroyed()
.
Il fonctionne très bien, sauf que je verrouiller l'écran. Lorsque je lance l'application, puis verrouiller l'écran et débloquer plus tard, je vois:
onPause()
- et rien d'autre après l'écran est verrouillé - ensuite, onResume()
après déverrouillage et pas en surface rappels ensuite. En fait, onResume()
est appelée après que le bouton d'alimentation est pressé et que l'écran est allumé, mais l'écran de verrouillage est toujours actif, donc avant l'activité devient encore visible.
Avec ce régime, j'obtiens un écran noir après le déblocage, et pas en surface rappels sont appelés.
Voici un fragment de code qui n'implique pas de réel travail avec la caméra, mais l' SurfaceHolder
rappels. La question ci-dessus est reproduit, même avec ce code sur mon téléphone (rappels sont appelés dans une séquence normale lorsque vous appuyez sur le bouton "Arrière", mais sont manquantes lorsque vous verrouillez l'écran):
class Preview extends SurfaceView implements SurfaceHolder.Callback {
private static final String tag= "Preview";
public Preview(Context context) {
super(context);
Log.d(tag, "Preview()");
SurfaceHolder holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
Log.d(tag, "surfaceCreated");
}
public void surfaceDestroyed(SurfaceHolder holder) {
Log.d(tag, "surfaceDestroyed");
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Log.d(tag, "surfaceChanged");
}
}
Toutes les idées sur le pourquoi de la surface reste undestroyed après l'Activité est en pause? Aussi, comment gérez-vous la caméra du cycle de vie dans de tels cas?