2017-03-05 2 views
0

Je suis en train de construire une application de photographie simple. Lorsqu'il est lancé, l'utilisateur présente une mainActivity de base avec une barre d'outils et un imageView. L'utilisateur appuie sur un bouton d'action dans la barre d'action qui crée une intention qui démarre l'application de l'appareil photo en utilisant startActivityForResult(). L'image prise par l'utilisateur à l'aide de l'application appareil photo est ensuite renvoyée dans mainActivity. Je reçois la taille de l'image et le imageView et les utiliser pour calculer un facteur de mise à l'échelle que j'utilise pour décoder une version plus petite du bitmap, comme ceci:ImageView hauteur et la largeur deviennent 0 lorsque l'écran est tourné pendant la caméra

BitmapFactory.Options bitmapFactoryOptions = new BitmapFactory.Options(); 
bitmapFactoryOptions.inJustDecodeBounds = true; 
BitmapFactory.decodeFile(mImageFileLocation, bitmapFactoryOptions); 
int actualCameraImageWidth = bitmapFactoryOptions.outWidth; 
int actualCameraImageHeight = bitmapFactoryOptions.outHeight; 

int heightScale = actualCameraImageHeight/imageViewHeight; 
int widthScale = actualCameraImageWidth/imageViewWidth; 

Integer factorToUse; 

if (heightScale == widthScale) { 
    Toast.makeText(this, "scales are the same: " + heightScale, Toast.LENGTH_SHORT).show(); 
    factorToUse = heightScale; 
} else { 
    factorToUse = Math.min(heightScale, widthScale); 
    Toast.makeText(this, "scales are DIFFERENT: " + factorToUse, Toast.LENGTH_SHORT).show(); 
} 

bitmapFactoryOptions.inSampleSize = factorToUse; 
bitmapFactoryOptions.inJustDecodeBounds = false; 

Bitmap reducedSizePhoto = BitmapFactory.decodeFile(mImageFileLocation, bitmapFactoryOptions); //decode the image with that scale option set 

imageView.setImageBitmap(reducedSizePhoto); 

je puis affichage décodé bitmap dans le imageView de mainActivity.

L'application fonctionne très bien si l'utilisateur garde son appareil dans la même orientation pendant qu'il prend une photo. Cependant, s'ils appuient sur le bouton d'action, puis modifient l'orientation de leur périphérique dans l'application de l'appareil photo, une exception RunTimeException est émise avec le message suivant: java.lang.RuntimeException: Unable to resume activity {com.wescj.cameraapplication/com.wescj.cameraapplication.MainActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { }} to activity {com.wescj.cameraapplication/com.wescj.cameraapplication.MainActivity}: java.lang.ArithmeticException: divide by zero, puis une trace de pile massive. En utilisant le débogueur, je pense que j'ai retracé la source de cette erreur au fait que, pour une raison quelconque, lorsque l'orientation de l'appareil est modifiée pendant que l'utilisateur est dans l'application de la caméra, la hauteur et la largeur de l'image devient 0, conduisant à une erreur «diviser par 0».

J'ai essayé tout ce que je pouvais imaginer pour arrêter le plantage de l'application si l'orientation était modifiée lors de l'utilisation de la caméra. J'ai cherché la documentation android et ai regardé tant de discussions sur stackOverflow. J'ai essayé d'ajouter différents attributs xml à l'imageView, tels que adjustViewBounds et setScaleType. J'ai même essayé d'utiliser une intention sur onResultActivity() pour démarrer mainActivity et afficher l'image. Mais aucun d'eux n'a travaillé. Quelqu'un peut-il faire la lumière sur pourquoi les dimensions d'imageView deviennent 0?

Le code complet peut être vu à: https://github.com/Wes1324/CameraApplication/tree/action_bar_button

Merci à tous ceux à l'avance qui essaie de me aider.

Répondre

0

Essayer d'ajouter ScreenSize à votre activité

<Activity android:configChanges="orientation|keyboardHidden|screenSize" ...> 

et dominante afin que vous puissiez gérer les changements de configuration par vous-même

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
} 

Plus d'infos ici: Handling Configuration Changes