Hi.
I think V1.0.2 has solved this problem. Since installing that I've not had
the issue at all.
Here's to all you who helped made the release happen.
Cheers,
Laurence.


WyrmUK wrote:
> 
> Hi.
> I'm trying to implement an activity which previews the camera and allows a
> picture to be taken.
> However I get rather mixed results with each build. One time it will work
> fine, but I might make a change such as adding a comment and re-compile
> and I get an error when setting the ISurfaceHolderCallback, then I might
> take the comment out and re-compile and I get a page fault, then I can do
> something else and it works again! It seems that it's compile/build
> related because if I build and it happens to work it will always work; but
> if I build and it crashes then it will always crash. The below failed with
> the exception shown, then I took the '.' off the end of the comment,
> re-compiled and it then worked!!!
> Is there an issue here or am I failing to set something up properly?
> I'm running this on a Dell Streak 5.
> 
> *This is a snapshot from ADB of one of the errors:*
> 
> I/ActivityManager(  146): Starting activity: Intent {
> cmp=uk.co.reach.reachcloud/reachmobilecc.PictureActivity }
> I/CameraView( 2699): Adding Callback
> F/PrintK  ( 2699): <2>Exception!!! each.reachcloud: unhandled page fault
> (11) at 0xed006d4e, code 0x005
> I/MonoDroid( 2699): UNHANDLED EXCEPTION: System.NullReferenceException:
> Object reference not set to an instance of an object
> I/MonoDroid( 2699): at
> Android.Views.ISurfaceHolderCallbackAdapter.GetHandle
> (Android.Views.ISurfaceHolderCallback) <0x00038>
> I/MonoDroid( 2699): at Android.Views.ISurfaceHolderInvoker.AddCallback
> (Android.Views.ISurfaceHolderCallback) <0x000bf>
> I/MonoDroid( 2699): at ReachMobileCC.PictureActivity.OnResume () <0x00073>
> I/MonoDroid( 2699): at Android.App.Activity.n_OnResume (intptr,intptr)
> <0x00033>
> I/MonoDroid( 2699): at (wrapper dynamic-method)
> object.38c0d09b-61f8-491e-b367-fbed8a6fb14a (intptr,intptr) <0x0002b>
> E/mono    ( 2699):
> E/mono    ( 2699): Unhandled Exception: System.NullReferenceException:
> Object reference not set to an instance of an object
> E/mono    ( 2699):   at
> Android.Views.ISurfaceHolderCallbackAdapter.GetHandle
> (ISurfaceHolderCallback instance) [0x00000] in <filename unknown>:0
> E/mono    ( 2699):   at Android.Views.ISurfaceHolderInvoker.AddCallback
> (ISurfaceHolderCallback callback) [0x00000] in <filename unknown>:0
> E/mono    ( 2699):   at ReachMobileCC.PictureActivity.OnResume ()
> [0x00000] in <filename unknown>:0
> E/mono    ( 2699):   at Android.App.Activity.n_OnResume (IntPtr jnienv,
> IntPtr native__this) [0x00000] in <filename unknown>:0
> E/mono    ( 2699):   at (wrapper dynamic-method)
> object:38c0d09b-61f8-491e-b367-fbed8a6fb14a (intptr,intptr)
> I/ActivityManager(  146): Process uk.co.reach.reachcloud (pid 2699) has
> died.
> 
> *This is the activity class:*
> 
> using System;
> using System.Collections.Generic;
> using System.Linq;
> using System.Text;
> 
> using Android.App;
> using Android.Content;
> using Android.Hardware;
> using Android.OS;
> using Android.Runtime;
> using Android.Views;
> using Android.Widget;
> using Android.Util;
> 
> namespace ReachMobileCC
> {
>     [Activity(Label = "@string/TakePicture", ConfigurationChanges =
> Android.Content.PM.ConfigChanges.Orientation |
> Android.Content.PM.ConfigChanges.Keyboard |
> Android.Content.PM.ConfigChanges.KeyboardHidden)]
>     public class PictureActivity : Activity, ISurfaceHolderCallback,
> Camera.IPictureCallback
>     {
>         #region Fields
> 
>         private bool _previewing = false;
>         private Camera _camera = null;
> 
>         #endregion
> 
>         public static byte[] JpegData { get; set; }
> 
>         #region Event Handlers
> 
>         protected override void OnCreate(Bundle bundle)
>         {
>             base.OnCreate(bundle);
>             SetContentView(Resource.Layout.Picture);
>             FindViewById<Button>(Resource.Id.TakePicture).Click +=
> TakePictureClick;
>         }
> 
>         protected override void OnResume()
>         {
>             base.OnResume();
>             var holder =
> FindViewById<SurfaceView>(Resource.Id.PicturePreview).Holder;
>             Log.Info("CameraView", "Adding Callback");
>             holder.AddCallback(this);
>             Log.Info("CameraView", "Added Callback");
>             holder.SetType(SurfaceType.PushBuffers);
>         }
> 
>         public override bool OnKeyDown(Keycode keyCode, KeyEvent e)
>         {
>             if (keyCode == Keycode.Back && _previewing)
>             {
>                 StopPreviewAndExit(false);
>                 return true;
>             }
>             if ((keyCode == Keycode.Camera || keyCode ==
> Keycode.DpadCenter) && _previewing)
>             {
>                 TakePictureClick(this, new EventArgs());
>                 return true;
>             }
>             return base.OnKeyDown(keyCode, e);
>         }
> 
>         void TakePictureClick(object sender, EventArgs e)
>         {
>             if (_camera != null)
>                 _camera.TakePicture(null, null, this);
>         }
> 
>         #endregion
> 
>         #region ISurfaceHolderCallback Members
> 
>         public void SurfaceChanged(ISurfaceHolder holder, int format, int
> width, int height)
>         {
>             if (_camera != null)
>             {
>                 if (_previewing) _camera.StopPreview();
>                 var parameters = _camera.GetParameters();
>                 var previewSize =
> GetNearestPreviewSize(parameters.SupportedPreviewSizes, width, height);
>                 parameters.SetPreviewSize(previewSize.Width,
> previewSize.Height);
>                 if
> (parameters.SupportedFocusModes.Contains(Camera.Parameters.FocusModeAuto))
>                     parameters.FocusMode =
> Camera.Parameters.FocusModeAuto;
>                 else if
> (parameters.SupportedFocusModes.Contains(Camera.Parameters.FocusModeInfinity))
>                     parameters.FocusMode =
> Camera.Parameters.FocusModeInfinity;
>                 parameters.SetRotation(90); // TODO: Match to window
> orientation.
>                 _camera.SetParameters(parameters);
>                 _camera.SetPreviewDisplay(holder);
>                 _camera.StartPreview();
>                 _previewing = true;
>             }
>         }
> 
>         public void SurfaceCreated(ISurfaceHolder holder)
>         {
>             _camera = Android.Hardware.Camera.Open();
>         }
> 
>         public void SurfaceDestroyed(ISurfaceHolder holder)
>         {
>             StopPreview();
>         }
> 
>         #endregion
> 
>         #region IPictureCallback Members
> 
>         public void OnPictureTaken(byte[] data, Android.Hardware.Camera
> camera)
>         {
>             JpegData = data;
>             StopPreviewAndExit(true);
>         }
> 
>         #endregion
> 
>         #region Helper Methods
> 
>         private Camera.Size GetNearestPreviewSize(IList<Camera.Size>
> sizes, int width, int height)
>         {
>             Camera.Size nearestSize = sizes[0];
>             int diff = 99999;
>             foreach (var size in sizes)
>             {
>                 if (size.Width > width || size.Height > height) continue;
>                 var comp = (width - size.Width) + (height - size.Height);
>                 if (comp < diff)
>                 {
>                     comp = diff;
>                     nearestSize = size;
>                 }
>             }
>             return nearestSize;
>         }
> 
>         public void StopPreview()
>         {
>             if (_camera != null)
>             {
>                 _camera.StopPreview();
>                 _camera.Release();
>                 _camera = null;
>             }
>         }
> 
>         public void StopPreviewAndExit(bool ok)
>         {
>             StopPreview();
>             SetResult(ok ? Result.Ok : Result.Canceled, new
> Intent(this.ApplicationContext, typeof(PictureActivity)));
>             Finish();
>         }
> 
>         #endregion
>     }
> }
> 
> *This is the layout:*
> 
> <?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">
>   <Button
>       android:id="@+id/TakePicture"
>       android:layout_width="fill_parent"
>       android:layout_height="wrap_content"
>       android:text="@string/TakePicture"
>       android:layout_alignParentBottom="true"
>     />
>   <SurfaceView
>       android:id="@+id/PicturePreview"
>       android:layout_width="fill_parent"
>       android:layout_height="fill_parent"
>       android:layout_above="@id/TakePicture"
>     />
> </RelativeLayout>
> 


--
View this message in context: 
http://mono-for-android.1047100.n5.nabble.com/SurfaceHolder-AddCallback-random-errors-tp4669293p4689002.html
Sent from the Mono for Android mailing list archive at Nabble.com.
_______________________________________________
Monodroid mailing list
Monodroid@lists.ximian.com

UNSUBSCRIBE INFORMATION:
http://lists.ximian.com/mailman/listinfo/monodroid

Reply via email to