Actually, I tried it, but I could never get it working fine. It just 
shows black screen and ended up with crash (I don't remember correctly). 
Should this equivalent code work in Java form?

Atsushi Eno

> Does anyone have any advice for this issue? Doesn't look liek anyone's looked
> at it!
>
> 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-tp4669293p4678027.html
> Sent from the Mono for Android mailing list archive at Nabble.com.
> _______________________________________________
> Monodroid mailing list
> [email protected]
>
> UNSUBSCRIBE INFORMATION:
> http://lists.ximian.com/mailman/listinfo/monodroid
>
>
>

_______________________________________________
Monodroid mailing list
[email protected]

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

Reply via email to