8
votes

Utilisation d'Android.View.SurfaceView avec une caméra dans une partie de l'écran

J'essaie de mettre en place une application Android qui prendra une photo et le traitera d'une manière ou d'une autre. J'aimerais que la disposition soit similaire à Google Goggles. Signification, aperçu de la caméra sur le haut et quelques contrôles sur le bas à l'aide de l'orientation portrait.

J'ai construit une première version à l'aide de l'échantillon de code de ici . Cela fonctionne, mais je veux ajouter un bouton sur le bas. P>

J'ai modifié ma version principale.xml pour regarder comme suit (basé sur les commentaires de cet article): P>

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


0 commentaires

3 Réponses :


11
votes

Tout d'abord, votre mise en page ne vous donnera probablement pas ce que vous voulez. Pensez à utiliser un relativelayout , avec la touche ancré en bas et le superficiel ancré en haut de l'écran et au sommet de la < code> bouton .

En outre, vous avez un duplicadice xmlns: android = "http://schemas.android.com/apk/res/andrroid" sur votre superficiel que vous donez 't besoin. Celui de votre élément racinaire suffira.

En termes d'exception, il peut y avoir plus de détails dans votre trace de pile qui vous manque, expliquant pourquoi startPreview () a échoué. Recherchez un "causé par" ou une autre ligne à mi-chemin à travers la trace de la pile. Si vous ne pouvez pas l'identifier, modifiez votre question et collez dans toute la trace de la pile (et de me faire passer par un commentaire sur cette réponse, car je ne saurai pas sur la modification autrement).

Vous pouvez également expérimenter avec Cet exemple de livre comme Un autre caméra APPLIC d'aperçu, pour voir s'il y a quelque chose à propos de la manière dont j'approche le problème qui fonctionne mieux pour votre situation.


3 commentaires

Bonjour, merci beaucoup pour votre réponse. J'ai corrigé mon code comme vous l'avez suggéré, et maintenant j'obtiens une exception différente.


@Commonsware Puisse-je utiliser superfasionview dans un widget (j'ai lu que cela ne peut pas être fait, car il n'est pas pris en charge) pouvez-vous également consulter ce Allumez la caméra du widget à Nexus S et Galaxy Sii ?


@Vitobrothers: "Puis-je utiliser superficielView dans un widget" - si par "widget", vous voulez dire "widget d'application", alors non, vous ne pouvez pas utiliser de superficiel dans un widget d'application.



2
votes

Si je ne manque pas quelque chose, vous ne pouvez pas simplement utiliser superfasionview tel quel. Vous avez besoin d'une classe dérivée de votre choix. Je crée généralement ce point de vue programmatiquement et donnez-le en plein écran. Mais vous pouvez couvrir des parties avec d'autres vues, y compris les boutons:

 setContentView(new CameraView());
 View mainscreen = getLayoutInflater().inflate(R.layout.mainscreen, null, false);
 ViewGroup.LayoutParams generalLayoutParam = new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.FILL_PARENT,
                    ViewGroup.LayoutParams.FILL_PARENT);
 addContentView(mainscreen, generalLayoutParam);


3 commentaires

Il est possible, vérifiez l'exemple sur le dessus.


tu devrais être capable de. Mais maintenant, j'ai un problème où je reçois cette erreur sur Nexus 7, mais pas sur un autre appareil


@Lassikinnunen: Pouvez-vous être plus précis? Peut-être que votre erreur mérite-t-elle une question distincte?



2
votes

Oui, vous pouvez utiliser une vue superficielle. Dans la superficielle, vous pouvez obtenir la superficie qui peut ensuite être utilisée pour définir la prévisualisation de la caméraDisplay.

camera.setPreviewDisplay(previewHolder);


0 commentaires