Android - Prendre une photo sans l'aperçu
Je suis en train de prendre une photo sans aperçu, immédiatement lors de ma demande commence à courir et après que pour enregistrer l'image dans un nouveau dossier - "pictures123", dans le dossier racine.
Quelqu'un pourrait-il me dire ce qu'est l'erreur dans mon code?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
File directory = new File(Environment.getExternalStorageDirectory() + "/pictures123/");
if (!directory.exists()) {
directory.mkdir();
}
Camera camera = Camera.open(0);
Camera.Parameters parameters = camera.getParameters();
parameters.setPictureFormat(ImageFormat.JPEG);
camera.setParameters(parameters);
SurfaceView mview = new SurfaceView(getBaseContext());
camera.setPreviewDisplay(mview.getHolder());
camera.setPreviewDisplay(null);
camera.startPreview();
camera.takePicture(null,null,photoCallback);
camera.stopPreview();
}
Camera.PictureCallback photoCallback=new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
try {
String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/pictures123");
File file = new File (myDir, "pic1.jpeg");
FileOutputStream out = new FileOutputStream(file);
out.write(data);
out.flush();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e)
{
e.printStackTrace();
}
finish();
}
};
autorisations:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
Double Possible de Comment prendre des photos de l'appareil photo sans l'aperçu lors de mon application démarre?
OriginalL'auteur Eyal | 2014-09-09
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas prendre une photo sans un aperçu, mais vous n'avez pas à afficher l'aperçu sur l'écran. Vous pouvez diriger la sortie vers un SurfaceTexture au lieu de l'API (11+).
Voir cette réponse pour plus de détails.
OriginalL'auteur fadden
Je pense que le principal problème, c'est que vous appelez takePicture immédiatement après startPreview qui prend effectivement du temps pour terminer son installation. Afin d'ajouter un délai entre ces deux pourrait être temporairement résoudre ce problème, regardez ici pour plus de détails.
camera.setPreviewDisplay(null)
, aucun retard aidera (eh bien, il existe des dispositifs qui permettent de tels ricks). Notez également, que les retard ne peut pas être un simpleSleep()
appel ici et là. Le flux de la caméra d'initialisation comporte quelques rappels et nécessite un temps de réponse de ces. E. g. on ne peut pas utiliser SurfaceHolder avant laSurfaceView
a appeléSurfaceCreated()
sur son auditeur.OriginalL'auteur ashoke
Il est impossible de prendre une photo sans aperçu. Vous devriez lire le Android de référence en ligne: http://developer.android.com/reference/android/hardware/Camera.html#takePicture.
Note:
Cette méthode n'est valide que lorsque l'aperçu est activé (après startPreview()). Extrait d'être arrêté après l'image est prise; les appelants doivent appeler startPreview() de nouveau si ils veulent re-démarrage de l'aperçu ou de prendre plus de photos. Cela ne devrait pas être appelé entre start() et stop().
Je pense qu'il est juste caché de l'aperçu. Par exemple, vous pouvez ajouter une vue personnalisée sur SurfaceView.
OriginalL'auteur yushulx