En utilisant android.vue.SurfaceView avec une caméra sur une partie de l'écran
J'ai essayé de mettre sur pied une application Android qui va prendre une photo et le processus d'une certaine façon. J'aimerais que la mise en page similaire à Google Goggles. La signification, la prévisualisation de la caméra sur le dessus, et des contrôles sur le fond à l'aide de l'orientation portrait.
J'ai construit une première version à l'aide de l'exemple de code à partir de ici. Cela fonctionne, mais je voudrais ajouter un bouton sur le bas.
J'ai modifié mon main.xml regarder comme suit (sur la base des commentaires de ce post):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<android.view.SurfaceView android:id="@+id/preview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentTop="true" />
<Button android:id="@+id/snap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Snap"
android:layout_alignParentBottom="true" />
</RelativeLayout>
Mais lorsque j'exécute ce code j'obtiens l'exception suivante:
E/AndroidRuntime( 199): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 199): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.beerometer/com.beerometer.ImageCapture}: android.view.InflateException: Binary XML file line #6: Error inflating class Android.view.SurfaceView
E/AndroidRuntime( 199): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
E/AndroidRuntime( 199): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
E/AndroidRuntime( 199): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
E/AndroidRuntime( 199): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
E/AndroidRuntime( 199): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 199): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 199): at android.app.ActivityThread.main(ActivityThread.java:4363)
E/AndroidRuntime( 199): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 199): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 199): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime( 199): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime( 199): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 199): Caused by: android.view.InflateException: Binary XML file line #6: Error inflating class Android.view.SurfaceView
E/AndroidRuntime( 199): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:576)
E/AndroidRuntime( 199): at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
E/AndroidRuntime( 199): at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
E/AndroidRuntime( 199): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
E/AndroidRuntime( 199): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
E/AndroidRuntime( 199): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)
E/AndroidRuntime( 199): at android.app.Activity.setContentView(Activity.java:1622)
E/AndroidRuntime( 199): at com.beerometer.ImageCapture.onCreate(ImageCapture.java:37)
E/AndroidRuntime( 199): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime( 199): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
E/AndroidRuntime( 199): ... 11 more
E/AndroidRuntime( 199): Caused by: java.lang.ClassNotFoundException: Android.view.SurfaceView in loader dalvik.system.PathClassLoader@44bfc7b0
E/AndroidRuntime( 199): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
E/AndroidRuntime( 199): at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
E/AndroidRuntime( 199): at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
E/AndroidRuntime( 199): at android.view.LayoutInflater.createView(LayoutInflater.java:466)
E/AndroidRuntime( 199): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:565)
E/AndroidRuntime( 199): ... 20 more
Lorsque je remplace le SurfaceView ci-dessus avec quelque chose d'autre, par exemple un TextView, qu'il affiche, mais dans le paysage.
Comment puis-je obtenir un aperçu de la caméra sur une partie de l'écran à l'aide de l'affichage portrait?
Grâce
OriginalL'auteur oneself | 2010-03-20
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, votre mise en page ne sera probablement pas vous donner ce que vous voulez. Envisagez d'utiliser un
RelativeLayout
, avec laButton
ancrées au fond, et laSurfaceView
ancré en haut de l'écran et le haut de laButton
.Aussi, vous avez un double
xmlns:android="http://schemas.android.com/apk/res/android"
sur votreSurfaceView
que vous n'avez pas besoin. Le un sur votre élément racine suffira.Dans les termes de l'exception, il peut y avoir plus de détail dans votre trace de la pile qu'il vous manque, ce qui explique pourquoi
startPreview()
a échoué. Pour un Look "Causé par" ou d'autres de la ligne à mi-chemin par le biais de la trace de la pile. Si vous ne pouvez pas identifier, modifier votre question et de le coller dans l'ensemble de la trace de la pile (et moi de ping via un commentaire sur cette réponse, car je ne sais pas à propos de le modifier autrement).Vous pouvez également expérimenter avec ce livre exemple comme un autre
Camera
app aperçu, pour voir s'il ya quelque chose à propos de la façon dont je m'approche du problème qui fonctionne le mieux pour votre situation.l'exemple du livre fonctionne très bien pour moi. thx
Puis-je Utiliser SurfaceView dans un Widget (j'ai lu qu'il ne peut pas être fait, car il n'est pas pris en charge) peut également vous s'il vous plaît jeter un oeil sur ce mettez l'Appareil à partir d'un widget dans le Nexus S et Galaxy SII ?
J'utilise SurfaceView dans un Widget" -- si par "Widget" vous voulez dire "app widget", puis, non, vous ne pouvez pas utiliser un
SurfaceView
dans une application widget.OriginalL'auteur CommonsWare
Si je ne suis pas en manque de quelque chose, vous ne pouvez pas simplement utiliser SurfaceView. Vous avez besoin d'une classe dérivée de votre propre. J'ai l'habitude de créer ce point de vue de la programmation, et de lui donner la totalité de l'écran. Mais vous pouvez couvrir une partie de celui-ci avec d'autres points de vue, y compris les boutons:
vous devriez être en mesure de. mais maintenant, je vais avoir des problèmes où j'ai cette erreur sur la nexus 7, mais pas sur un autre appareil
pouvez-vous être plus précis? Peut-être que votre erreur mérite une autre question?
OriginalL'auteur Alex Cohn
Oui, vous pouvez utiliser une surfaceView. À partir de la surfaceView vous pouvez obtenir le SurfaceHolder qui peut alors être utilisé pour fixer la caméra previewDisplay.
Vous aurez besoin de mettre en œuvre les SurfaceHolder.Rappel de la méthode pour mettre à jour la taille de l'aperçu correctement. Dans surfaceCreated définir la previewDisplay de la caméra. Sur surfaceChanged mise à jour de la previewSize pour la caméra.
En fait l'exemple mentionné avant est une très bonne référence!
OriginalL'auteur hcpl