La prise d'image de la caméra sans l'aperçu
Je suis en train d'écrire un Android 1.5 application qui commence juste après le démarrage. C'est un Service
et devraient prendre une photo sans aperçu. Cette application va enregistrer la lumière de la densité dans quelques domaines que ce soit. J'ai réussi à prendre une photo, mais la photo était en noir.
Après avoir cherché pendant un long moment, je suis tombé sur un bug thread à ce sujet. Si vous n'avez pas de générer un aperçu, l'image sera en noir depuis Android appareil a besoin d'aperçu pour l'installation de l'exposition et de la concentration. J'ai créé un SurfaceView
et l'auditeur, mais le onSurfaceCreated()
événement n'est jamais déclenché.
Je suppose que la raison en est, la surface n'est pas visuellement. J'ai aussi vu quelques exemples de l'appel de la caméra de manière statique avec MediaStore.CAPTURE_OR_SOMETHING
qui prend une image et l'enregistre dans le dossier de votre choix avec deux lignes de code, mais il ne faut pas trop en photo.
Dois-je utiliser de la CIB et bindService()
appel de cette fonction? Ou est-il une autre méthode pour y parvenir?
- Voir aussi Prendre une Photo sans l'aperçu d'android
- github.com/kevalpatel2106/android-hidden-camera - Caisse de cette bibliothèque, qui fournit l'arrière-plan de la caméra.
Vous devez vous connecter pour publier un commentaire.
il est vraiment étrange que la caméra sur la plate-forme android peut pas diffuser de la vidéo jusqu'à ce qu'il donné valide aperçu de surface. il semble que les architectes de la plate-forme a été de ne pas penser à la 3ème partie des applications de streaming vidéo à tous. même pour la réalité augmentée cas, l'image peut être présenté comme une sorte de visual substitution, non pas en temps réel du flux d'une caméra.
de toute façon, vous pouvez simplement redimensionner aperçu de la surface de 1x1 pixels et la mettre quelque part dans le coin de la widget (élément visuel). s'il vous plaît prêter attention - redimensionner aperçu de surface, pas d'image de la caméra de la taille.
bien sûr, un tel truc n'est pas à éliminer les flux de données (pour l'aperçu) qui consomme des ressources système et de la batterie.
SurfaceHolder
ou laSurfaceView
? Quel code as-tu le changer?J'ai trouvé la réponse à cette question dans le Appareil Photo Android Docs.
Vous pouvez trouver des instructions étape par étape sur le lien ci-dessus. Après les instructions, il fera état de la citation que j'ai fournis ci-dessus.
En fait c'est possible, mais vous devez faire semblant de le prévisualiser avec un mannequin SurfaceView
Mise à jour 9/21/11: Apparemment cela ne fonctionne pas pour tous les appareils Android.
PixelFormat
etsetAlpha(0)
n'est pas transparent sur mon Sony Xperia M fonctionnant sous Android 4.3. L'aperçu est toujours opaque.setAlpha(0)
a fait un travail après l'utilisation desetFormat(PixelFormat.TRANSPARENT)
sur leSurfaceHolder
et à l'aide de la mêmePixelFormat
dans leSurfaceView
constructeur.La prise de la Photo
Obtenir ce travail d'abord avant d'essayer de masquer l'aperçu.
SurfaceView
(pré-Android 4.0 compatibilité) ouSurfaceTexture
(Android 4+, peut être rendue transparente)SurfaceView
'sSurfaceHolder
(viagetHolder()
) pour signalersurfaceCreated()
ou laTextureView
de rapportonSurfaceTextureAvailable
à sonSurfaceTextureListener
avant de configuration et initialisation de l'aperçu.WindowManager
MATCH_PARENT
xMATCH_PARENT
pour les tests)View.VISIBLE
(ce qui semble être la valeur par défaut si vous ne spécifiez pas elle)FLAG_HARDWARE_ACCELERATED
dans leLayoutParams
si c'est unTextureView
.takePicture
s'JPEG de rappel depuis la documentation dit les autres rappels ne sont pas pris en charge sur tous les appareilsDe dépannage
surfaceCreated
/onSurfaceTextureAvailable
n'est pas appelée, leSurfaceView
/TextureView
n'est probablement pas affichés.takePicture
échoue, vérifiez d'abord l'aperçu fonctionne correctement. Vous pouvez supprimer votretakePicture
appel et laisse l'aperçu afin de voir si il s'affiche sur l'écran.takePicture
de sorte que la caméra a le temps d'ajuster son exposition une fois la prévisualisation a commencé.Cacher l'Aperçu
Faire l'aperçu
View
1x1 taille de minimiser sa visibilité (ou essayez 8x16, peut-être plus de fiabilité)Déplacer l'aperçu de sortir de la maison afin de réduire sa visibilité:
Faire l'aperçu transparent (ne fonctionne que pour les
TextureView
)Exemple de travail (testé sur Sony Xperia M, Android 4.3)
Cannot add previewandroid.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@664dc37 -- permission denied for window type 2006
camera2
APISur Android 4.0 et au-dessus de l'API (niveau >= 14), vous pouvez utiliser TextureView pour prévisualiser le flux d'une caméra et de le rendre invisible afin de ne pas le montrer à l'utilisateur. Voici comment:
D'abord créer une classe pour mettre en œuvre un SurfaceTextureListener qui obtiendra le créer/mettre à jour des rappels pour la preview de la surface. Cette classe prend également un appareil photo de l'objet en tant qu'entrée, de sorte qu'il peut appeler la caméra startPreview fonction dès que la surface est créée:
Vous aurez également besoin de mettre en œuvre une classe de rappel pour traiter les données d'aperçu:
Le CamPreview et CamCallback classes d'installation de la caméra dans votre activité est onCreate() ou similaire fonction de démarrage:
FrameLayout
vous dire de le placer dans l'Activité qui démarre le Service? Que faire si les appels de Service ce de fond? L'Activité avec cetteFrameLayout
relié pop-up?Il y a un moyen de le faire, mais c'est un peu délicat.
ce qui doit être fait, c'est joindre une surfaceholder à la fenêtre du gestionnaire du service
et puis définissez
où mHolder est le support que vous obtenez à partir de la surface d'affichage.
de cette façon, vous pouvez jouer avec les surfaceview alpha, le rendre totalement transparent, mais la caméra sera toujours obtenir des images.
c'est comment je le fais. espérons que cela aide 🙂
mHolder
de surfaceView.getHolder()? Comment puis-je créer l'SurfaceView? surfaceView = new SufaceView(ce) serait de travailler? Merci.WindowManager
pointe. La solution à l'ensemble de la surface d'affichage transparent ne fonctionne pas pour moi. D'autres idées sur la façon de le faire ?ImageFormat.NV21
.Nous avons résolu ce problème en utilisant un mannequin SurfaceView (pas ajouté à l'interface) dans les versions inférieures à 3.0 (ou disons 4.0 comme un appareil photo, d'un service sur une tablette n'a pas vraiment de sens).
Dans les versions >= 4.0 cette travaillé dans l'émulateur seulement ;(
L'utilisation de SurfaceTexture (et setSurfaceTexture()) au lieu de SurfaceView (et setSurfaceView()) ont travaillé ici. Au moins cela fonctionne sur Nexus S.
Je pense que c'est vraiment une lacune de l'Android cadre.
Dans le "groupe de Travail Exemple de Sam" (Merci Sam... )
si istruction "wm.addView(aperçu, params);"
obtenir exception "Impossible d'ajouter la fenêtre android.vue.ViewRoot -- le refus d'une autorisation pour ce type de fenêtre"
résoudre par l'utilisation de cette autorisation dans AndroidManifest:
Vous pouvez essayer ce code de travail, Ce service, cliquez sur image, si vous voulez capturer l'appareil photo arrière de l'image, puis supprimez le commentaire de la caméra arrière dans le code et les commentaires de l'appareil photo avant.
Remarque :- Permettre à la Caméra et de Stockage de l'autorisation d'Application Et startService de l'Activité ou de n'importe où.