Il y avait une question similaire mais elle n'a pas été résolue:
J'ai une application qui (naturellement) utilise l'appareil photo. Cela fonctionne bien. Cependant, en l'absence de modifications de code, l'application a commencé à se bloquer entre les versions (aucune modification de code n'a été vérifiée via l'historique de validation Git).
Pour vérifier que le problème se trouve quelque part dans le matériel, j'ai exécuté le même code sur un autre téléphone et cela fonctionne parfaitement. D'une manière ou d'une autre, la caméra est verrouillée et ne s'ouvre pas.
Voici le code pertinent:
Créer un objet précédent
_cameraPreview = new CameraPreview(getActivity(),_camera);
Ceci est le code de création pour cela
public CameraPreview(Context context, Camera camera)
{
super(context);
_camera = camera;
_surfaceHolder = getHolder();
_surfaceHolder.addCallback(this);
}
Ouverture de la caméra:
// Ouvre la caméra arrière par défaut
public static Camera getCameraInstance()
{
Camera c = null;
try
{
c = Camera.open();
}catch (Exception e)
{
e.printStackTrace();
}
return c;
}
Camera.Open lève l'erreur avec la trace de pile suivante. Mon objet caméra est null. Ce code provient des documents Android officiels, mais ils ne disent pas comment "libérer la caméra" si elle est verrouillée en dehors de la session.
La déconnexion complète est
W/CameraBase﹕ An error occurred while connecting to camera: 0
W/System.err﹕ Java.lang.RuntimeException: Fail to connect to camera service
W/System.err﹕ at Android.hardware.Camera.<init>(Camera.Java:497)
W/System.err﹕ at Android.hardware.Camera.open(Camera.Java:357)
W/System.err﹕ at co.pumpup.app.EditPhotoFragment.getCameraInstance(EditPhotoFragment.Java:241)
W/System.err﹕ at co.pumpup.app.EditPhotoFragment.onCreateView(EditPhotoFragment.Java:76)
W/System.err﹕ at Android.app.Fragment.performCreateView(Fragment.Java:2053)
W/System.err﹕ at Android.app.FragmentManagerImpl.moveToState(FragmentManager.Java:894)
W/System.err﹕ at Android.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1067)
W/System.err﹕ at Android.app.BackStackRecord.run(BackStackRecord.Java:834)
W/System.err﹕ at Android.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1452)
W/System.err﹕ at Android.app.Activity.performStart(Activity.Java:6005)
W/System.err﹕ at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2288)
W/System.err﹕ at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2387)
W/System.err﹕ at Android.app.ActivityThread.access$800(ActivityThread.Java:151)
W/System.err﹕ at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1303)
W/System.err﹕ at Android.os.Handler.dispatchMessage(Handler.Java:102)
W/System.err﹕ at Android.os.Looper.loop(Looper.Java:135)
W/System.err﹕ at Android.app.ActivityThread.main(ActivityThread.Java:5254)
W/System.err﹕ at Java.lang.reflect.Method.invoke(Native Method)
W/System.err﹕ at Java.lang.reflect.Method.invoke(Method.Java:372)
W/System.err﹕ at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:903)
W/System.err﹕ at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:698)
Pouvez-vous indiquer comment je peux "déverrouiller" une caméra verrouillée comme celle-ci?
Le "échec de la connexion au service de caméra" signifie que votre (ou une autre) application de caméra n'a pas réussi à libérer la caméra correctement. Cela m'arrivait de temps en temps pendant que je développais mon application aussi. La première chose que je voudrais essayer est d'ouvrir l'appareil photo à partir de l'application appareil photo par défaut fournie avec le téléphone (en appuyant simplement sur le bouton "Appareil photo"). Si cela ne pouvait pas s'ouvrir, la seule option était de redémarrer le téléphone.
C'est de la spéculation, mais votre code pourrait avoir un bogue qui n'apparaît que de temps en temps et qui n'apparaissait pas jusqu'à présent par pure chance. Si cela persiste, consultez les questions relatives à "Comment libérer correctement l'appareil photo sous Android". Ils m'avaient aidé à gérer cela.
Depuis Android 6.0 (API niveau 23), les utilisateurs accordent des autorisations aux applications pendant l'exécution de l'application, et non lors de son installation. Cette approche simplifie le processus d'installation de l'application, car l'utilisateur n'a pas besoin d'accorder d'autorisations lors de l'installation ou de la mise à jour de l'application. Il donne également à l'utilisateur plus de contrôle sur les fonctionnalités de l'application. Par exemple, un utilisateur peut choisir de donner à une application de la caméra un accès à la caméra mais pas à l'emplacement du périphérique. L'utilisateur peut révoquer les autorisations à tout moment en accédant à l'écran Paramètres de l'application. http://developer.Android.com/training/permissions/requesting.html
Je ne sais pas si c'est votre cas mais cela m'est arrivé, alors j'ai pensé le partager. Mon application faisait la même chose (bien que j'aie essayé autour de Camera.open () donc je ne l'ai pas vue au début) MAIS j'ai fait ce que panonski a dit et j'ai allumé l'appareil photo à partir de l'application appareil photo du système et j'ai vu qu'il s'agissait en utilisant la caméra frontale. Le fait de revenir à la caméra arrière a permis à mon application de fonctionner à nouveau.
J'ai changé d'utiliser Camera.open () en Camera.open (Camera.CameraInfo.CAMERA_FACING_BACK) et maintenant cela fonctionne, peu importe la façon dont l'appareil photo a été laissé auparavant. (Utilisation de Galaxy Note 4).
Espérons que cela aide.