La manipulation correcte de l'exception: “getParameters échoué vide (paramètres)”
J'ai une application d'appareil photo dans le magasin de Jeu Google avec Google Analytics installé. Je reçois la suite de rapport de crash:
getParameters échoué (paramètres vides)
Ma question est: Quelle est la bonne façon de gérer cela?
À la recherche dans le Android source d'où il arrive de ne pas me donner tous les détails. L'erreur est levée dans android_hardware_Camera.cpp:
String8 params8 = camera->getParameters();
if (params8.isEmpty()) {
jniThrowRuntimeException(env, "getParameters failed (empty parameters)");
return 0;
}
La recherche en open source Android appareil photo pour voir comment il gère la situation était également pas très utile. Ce code n'apparaît pas à attraper le RuntimeException lors de l'appel de getParameters. (Sauf dans un cas où ils pêchent, à proximité de l'appareil, puis renvoyer c').
Est-il une bonne façon de gérer ce?
Si non, est-il une raison pour laquelle cela se produit si souvent?
Note:
En un jour donné, j'ai entre 5 - 8k d'utilisateurs actifs. Avec quelque part entre 40-70 de ces exceptions. Qui semble vraiment élevé pour moi. Je sais qu'il y a la pièce de théâtre les cas où un appareil photo risque de ne pas initialiser. Mais 1% des utilisateurs semble déraisonnable. Aussi, depuis l'Android app appareil photo ne prend pas en charge l'exception qu'il fait vraiment, je me demande si il y a une autre cause.
- Je me demandais si vous trouvez une solution
- +onur taskin - Voir ma réponse ci-dessous. Il explique comment je l'ai fixée, ainsi que la façon dont d'autres peuvent avoir des ennuis avec elle.
- Dans mon cas, j'étais présent sur le stock application Appareil photo sur une API Android 22 émulateur. Je le fixe à l'aide de la 32 bits x86 image du système d'exploitation sur l'émulateur au lieu de le 64 bits x86 un.
- Pour les émulateurs voir stackoverflow.com/questions/44586150/....
Vous devez vous connecter pour publier un commentaire.
Dans mon cas, j'ai été faire cette erreur :
quand j'ai appelé
getParameters()
après le déverrouillage de l'appareil photo. Donc, veuillez appelergetParameters()
avant d'appelercamera.unlock()
.Que +Eddy Talvala mentionné, cela se produit lorsque le appareil photo est dans un mauvais état.
Comment fonctionne la caméra obtenir dans un mauvais état?
1) Probablement la raison la plus courante serait de fermeture/de relâchement de la caméra tout en continuant d'utiliser par la suite. Cela peut être particulièrement problématique si vous utilisez le
Camera
objet sur plusieurs threads sans synchronisation d'accès à laCamera
. Assurez-vous de ne jamais avoir un seul thread accès à laCamera
à la fois.2) Dans mon cas, c'était un peu plus compliqué. J'utilise un
SurfaceTexture
afin que je puisse utiliser la sortie de la caméra comme une texture OpenGL. Dans Android 4.0 (ICS), il existe une nouvelle méthodeSurfaceTexture.release()
. Cette méthode est important d'utiliser lors de l'utilisation deSurfaceTexture
s comme il nettoie la mémoire plus rapide qu'auparavant.Le problème est que j'ai été appeler
SurfaceTexture.release()
alors que l'aperçu de la caméra était toujours actif. Ce fut le fracas de laCamera
service, qui a été à l'origine du problème est expliqué dans la question.Dans mon cas, je l'ai fixée par le retard de l'appel à
SurfaceTexture.release()
jusqu'à ce que après que je l'avais remplacé par un nouveauSurfaceTexture
. De cette façon, j'étais certain que leSurfaceTexture
pourraient être nettoyé sans mauvais effets secondaires.Est-il spécifique à l'appareil Android qui fait l'expérience de cette erreur? Ou voyez-vous à travers de nombreux dispositifs.
En général, vous ne devriez pas voir ce genre d'erreur. Il est possible que votre application a une sorte de condition de course qui résultats dans ce domaine, mais il faudrait l'associer à essayer d'appeler getParameters sur un non initialisée ou déjà publiés, de la caméra.
Il pourrait également être une erreur dans le dispositif spécifique de la caméra de code, ou de l'un des rares condition de course quelque part dans l'appareil code de la pile. Sans plus de détails (logcat ou Android rapport de bogue à partir d'une collision), il est impossible de le dire - l'erreur elle-même dit juste que le dispositif spécifique de la caméra code renvoyé un ensemble vide de paramètres.
Mais une fois que vous obtenez cette erreur, il n'y a pas beaucoup que vous pouvez faire - la caméra sous-système est en quelque étrange état. Si vous voulez essayer de traiter avec elle, tout ce que je peux suggérer, c'est de fermer et de rouvrir la caméra de l'appareil.
caméra, les objets sont toujours verrouillées par défaut
alors, quand vous pouvez déverrouiller méthode vous permettez à d'autres procceses d'utiliser vos paramètres
donc, assurez-vous que vous re verrouillé l'appareil photo avant d'obtenir les paramètres de