interrupteur frontal/arrière de l'appareil photo à la volée
Si je n'utilise que CAMERA_FACING_BACK
ou CAMERA_FACING_FRONT
tous fonctionne bien.
J'ai de la difficulté avec le commutateur de CAMERA_FACING_BACK
à CAMERA_FACING_FRONT
.
Mon extrait de code:
public class PhotoCameraActivity extends Activity implements OnClickListener {
private SurfaceView cameraView;
private Button turnButton;
private Camera camera = null;
private Callback listener;
private static int camId = Camera.CameraInfo.CAMERA_FACING_BACK;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.photo_camera_main);
prepareActivity();
}
private void prepareActivity() {
cameraView = (SurfaceView) findViewById(R.id.photo_camera_surface_view);
turnButton = (ImageButton) findViewById(R.id.turn_button);
turnButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.equals(turnButton)) {
if (Camera.getNumberOfCameras() > 1 && camId < Camera.getNumberOfCameras() - 1) {
startCamera(camId + 1);
} else {
startCamera(Camera.CameraInfo.CAMERA_FACING_BACK);
}
}
}
@Override
protected void onResume() {
startCamera(camId);
super.onResume();
}
@Override
protected void onPause() {
stopCamera();
super.onPause();
}
private void startCamera(int cameraId) {
if (camera != null) {
stopCamera();
}
holder = cameraView.getHolder();
listener = new Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
};
holder.addCallback(listener);
camId = cameraId;
camera = Camera.open(cameraId);
Camera.Parameters params = camera.getParameters();
if (cameraId == Camera.CameraInfo.CAMERA_FACING_BACK) {
params.setPreviewSize(1280, 800);
} else {
params.setPreviewSize(640, 480);
}
camera.setParameters(params);
}
private void stopCamera(){
System.out.println("stopCamera method");
if (camera != null){
camera.stopPreview();
camera.setPreviewCallback(null);
camera.release();
camera = null;
holder.removeCallback(listener);
holder = null;
}
}
}
- Quelle est la nature du "problème" que vous avez?
- Si j'essaie d'arrêter la caméra, le viseur se fige et ne pas afficher une image à partir d'un autre appareil photo. Mais si j'appuie sur "Retour" puis de nouveau sur démarrer cette Activité, la caméra passe devant et il fonctionne bien à nouveau. Je pense que j'ai du mal avec l'arrêt de la caméra et de libérer les ressources.
- j'ai coincé avec le même problème
- vous pouvez avoir un seul appareil photo ouvert à un moment donc si vous voulez changer d'appareil photo premier appel de la caméra.recycler()
- Ce code est wrong: ... face à la caméra n'est pas impérativement la même que la caméra de l'index. Par exemple, ma tablette a une seule caméra (indice: 0), mais face à l'avant (en face de l'indice: 1). Par conséquent, en utilisant le code simple comme Appareil photo.ouvert(CameraInfo.CAMERA_FACING_FRONT) est nonesense
- entrez description du lien ici Ce libellé pour moi
Vous devez vous connecter pour publier un commentaire.
Dans onCreate() de mon activité je ajouter ce qui suit onClick auditeur à un bouton à superposer sur mon Aperçu SurfaceView (il y a de nombreux exemple sur le web pour un aperçu):
Sur mon appareil de test de la caméra arrière a un ID de 0 et de l'avant a l'id 1. Je suggère l'utilisation de l'Appareil photo.CameraInfo variables statiques pour votre id de la caméra plutôt que de coder en dur les valeurs. Je suis sûr que ce sera seulement provoquer des problèmes sur d'autres appareils.
Je le redémarrage de l'Activité avec cameraId = 2 et cela fonctionne.
Je l'ai enlevé et rajouté SurfaceView dans ma mise en page et donc cela a fonctionné.
Je dois enlever la surface de l'aperçu avant d'ajouter un nouveau:
Utiliser ce code: