Well this is just it. It does work perfectly every time some builds, throws
an exception every time on others (causing the app to crash), and just page
faults every time on others (again causing the app to crash). This seems to
point to a mandroid issue because it's not like it sometimes works and
sometimes page-faults with a single build, if it works for a build then it
always works in that build; but there may be something I'm missing - or
there may be a work-around. I can't catch the exception either as it just
kills the app. Would be good to get some comment from someone who knows more
about the Mono system and ARM devices and why this might be happening. It
could be just a byte-alignment issue and a command line option fixes it. But
I don't know.
Anyone?

Atsushi Eno wrote:
> 
> 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
> 
>> 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
>> Monodroid@lists.ximian.com
>>
>> UNSUBSCRIBE INFORMATION:
>> http://lists.ximian.com/mailman/listinfo/monodroid
>>
>>
>>
> 
> _______________________________________________
> Monodroid mailing list
> Monodroid@lists.ximian.com
> 
> UNSUBSCRIBE INFORMATION:
> http://lists.ximian.com/mailman/listinfo/monodroid
> 


--
View this message in context: 
http://mono-for-android.1047100.n5.nabble.com/SurfaceHolder-AddCallback-random-errors-tp4669293p4681127.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