我使用的SurfaceView 为camera显示图片,
其中代码:
定义了
SurfaceView sView;
ISurfaceHolder surfaceHolder;
OnCreate里面:
protected override void OnCreate(Bundle bundle)
{ base.OnCreate(bundle);
RequestWindowFeature(WindowFeatures.NoTitle);
Window.SetFlags(WindowManagerFlags.Fullscreen, WindowManagerFlags.Fullscreen);
SetContentView(Resource.Layout.layoutCameraMain);
// Create your application here
////获取ip地址
ipname = this.Intent.GetStringExtra("ipname");
//获取屏幕分辨率
DisplayMetrics dm = new DisplayMetrics();
Display display = WindowManager.DefaultDisplay;
display.GetMetrics(dm);
//screenWidth = dm.WidthPixels;
//screenHeight = dm.HeightPixels; screenWidth = display.Width;
screenHeight = display.Height;
sView = FindViewById<SurfaceView>(Resource.Id.sView);//获取界面中的surface
surfaceHolder = sView.Holder;//获得SurfaceView的SurfaceHolder; ISurfaceHolderCallback ish = new SurfaceHolderCallBack(this);
surfaceHolder.AddCallback(ish);
// 设置该SurfaceView自己不维护缓冲
surfaceHolder.SetType(SurfaceType.PushBuffers);
}
自己实现定义的类:
[code=csharp]
private void InintCamera()
{
if (!isPreview)
{
camera = Camera.Open();
}
if (camera != null && !isPreview)
{
try
{
Camera.Parameters parameters = camera.GetParameters();
parameters.SetPreviewSize(screenWidth, screenHeight);//设置大小
//parameters.setPreviewFpsRange(20, 30); // 每秒显示20~30帧
parameters.PictureFormat = Android.Graphics.ImageFormatType.Nv21;/// 设置图片格式
parameters.SetPictureSize(screenWidth, screenHeight);
//parameters.Set("orientation", "portrait");
//parameters.SetRotation(90);//旋转90度
parameters.PreviewFrameRate = 30; // 每秒显示30帧
camera.SetPreviewDisplay(surfaceHolder); // 通过SurfaceView显示取景画
camera.SetDisplayOrientation(90);//旋转90度
//camera.SetPreviewCallback(new StreamIt(ipname, camera));
camera.SetParameters(parameters);
camera.StartPreview(); // 开始预览 camera.AutoFocus(null); // 自动对焦
}
catch (Exception e)
{
string error = e.StackTrace;
}
}
}
class MyThread : Java.Lang.Thread
{ }
/// <summary>
/// 试映回掉
/// </summary>
class StreamIt : Camera.IPreviewCallback
{
string ipname;
Camera camera;
public StreamIt(string ipname, Camera camera)
: base()
{
this.camera = camera;
this.ipname = ipname;
}
public void OnPreviewFrame(byte[] data, Camera camera)
{
Camera.Size size = camera.GetParameters().PreviewSize;
try
{
//调用image.compressToJpeg()将YUV格式图像数据data转为jpg格式
Android.Graphics.YuvImage image = new Android.Graphics.YuvImage(data, Android.Graphics.ImageFormatType.Nv21, size.Width, size.Height, null);
if (image != null)
{
MemoryStream mstream = new MemoryStream();
image.CompressToJpeg(new Android.Graphics.Rect(0, 0, size.Width, size.Height), 80, mstream);
mstream.Flush();
//启用线程把图片发送出去 }
}
catch (Exception ex)
{
Log.Error("转换图片时出错", ex.Message);
}
//throw new NotImplementedException();
} public void Dispose()
{
throw new NotImplementedException();
} public IntPtr Handle
{
get { return camera.Handle; }
}
}
/// <summary>
/// 定义SurfaceHolder回掉
/// </summary> public class SurfaceHolderCallBack : ISurfaceHolderCallback
{
ActivityCameraMain _main;
public SurfaceHolderCallBack(ActivityCameraMain main)
: base()
{
_main = main;
}
public void SurfaceChanged(ISurfaceHolder holder, Android.Graphics.Format format, int width, int height)
{
//throw new NotImplementedException();
} public void SurfaceCreated(ISurfaceHolder holder)
{
//throw new NotImplementedException();
_main.InintCamera();
} public void SurfaceDestroyed(ISurfaceHolder holder)
{
//throw new NotImplementedException();
if (_main.camera != null)
{
if (_main.isPreview)
{
_main.camera.StopPreview();
_main.camera.Release();
_main.camera = null;
}
//System.exit(0);
} }
void IDisposable.Dispose()
{
;
} IntPtr IJavaObject.Handle
{
get { return ((View)_main.sView).Handle; }
}
}
[/code=]
似乎是在
IntPtr IJavaObject.Handle
{
get { return ((View)_main.sView).Handle; }
}
出错了,但是没有确定找到是哪里出错了。。
求指教。。AndroidMono IJavaObject.HandlemonoforandroidAddCallback
其中代码:
定义了
SurfaceView sView;
ISurfaceHolder surfaceHolder;
OnCreate里面:
protected override void OnCreate(Bundle bundle)
{ base.OnCreate(bundle);
RequestWindowFeature(WindowFeatures.NoTitle);
Window.SetFlags(WindowManagerFlags.Fullscreen, WindowManagerFlags.Fullscreen);
SetContentView(Resource.Layout.layoutCameraMain);
// Create your application here
////获取ip地址
ipname = this.Intent.GetStringExtra("ipname");
//获取屏幕分辨率
DisplayMetrics dm = new DisplayMetrics();
Display display = WindowManager.DefaultDisplay;
display.GetMetrics(dm);
//screenWidth = dm.WidthPixels;
//screenHeight = dm.HeightPixels; screenWidth = display.Width;
screenHeight = display.Height;
sView = FindViewById<SurfaceView>(Resource.Id.sView);//获取界面中的surface
surfaceHolder = sView.Holder;//获得SurfaceView的SurfaceHolder; ISurfaceHolderCallback ish = new SurfaceHolderCallBack(this);
surfaceHolder.AddCallback(ish);
// 设置该SurfaceView自己不维护缓冲
surfaceHolder.SetType(SurfaceType.PushBuffers);
}
自己实现定义的类:
[code=csharp]
private void InintCamera()
{
if (!isPreview)
{
camera = Camera.Open();
}
if (camera != null && !isPreview)
{
try
{
Camera.Parameters parameters = camera.GetParameters();
parameters.SetPreviewSize(screenWidth, screenHeight);//设置大小
//parameters.setPreviewFpsRange(20, 30); // 每秒显示20~30帧
parameters.PictureFormat = Android.Graphics.ImageFormatType.Nv21;/// 设置图片格式
parameters.SetPictureSize(screenWidth, screenHeight);
//parameters.Set("orientation", "portrait");
//parameters.SetRotation(90);//旋转90度
parameters.PreviewFrameRate = 30; // 每秒显示30帧
camera.SetPreviewDisplay(surfaceHolder); // 通过SurfaceView显示取景画
camera.SetDisplayOrientation(90);//旋转90度
//camera.SetPreviewCallback(new StreamIt(ipname, camera));
camera.SetParameters(parameters);
camera.StartPreview(); // 开始预览 camera.AutoFocus(null); // 自动对焦
}
catch (Exception e)
{
string error = e.StackTrace;
}
}
}
class MyThread : Java.Lang.Thread
{ }
/// <summary>
/// 试映回掉
/// </summary>
class StreamIt : Camera.IPreviewCallback
{
string ipname;
Camera camera;
public StreamIt(string ipname, Camera camera)
: base()
{
this.camera = camera;
this.ipname = ipname;
}
public void OnPreviewFrame(byte[] data, Camera camera)
{
Camera.Size size = camera.GetParameters().PreviewSize;
try
{
//调用image.compressToJpeg()将YUV格式图像数据data转为jpg格式
Android.Graphics.YuvImage image = new Android.Graphics.YuvImage(data, Android.Graphics.ImageFormatType.Nv21, size.Width, size.Height, null);
if (image != null)
{
MemoryStream mstream = new MemoryStream();
image.CompressToJpeg(new Android.Graphics.Rect(0, 0, size.Width, size.Height), 80, mstream);
mstream.Flush();
//启用线程把图片发送出去 }
}
catch (Exception ex)
{
Log.Error("转换图片时出错", ex.Message);
}
//throw new NotImplementedException();
} public void Dispose()
{
throw new NotImplementedException();
} public IntPtr Handle
{
get { return camera.Handle; }
}
}
/// <summary>
/// 定义SurfaceHolder回掉
/// </summary> public class SurfaceHolderCallBack : ISurfaceHolderCallback
{
ActivityCameraMain _main;
public SurfaceHolderCallBack(ActivityCameraMain main)
: base()
{
_main = main;
}
public void SurfaceChanged(ISurfaceHolder holder, Android.Graphics.Format format, int width, int height)
{
//throw new NotImplementedException();
} public void SurfaceCreated(ISurfaceHolder holder)
{
//throw new NotImplementedException();
_main.InintCamera();
} public void SurfaceDestroyed(ISurfaceHolder holder)
{
//throw new NotImplementedException();
if (_main.camera != null)
{
if (_main.isPreview)
{
_main.camera.StopPreview();
_main.camera.Release();
_main.camera = null;
}
//System.exit(0);
} }
void IDisposable.Dispose()
{
;
} IntPtr IJavaObject.Handle
{
get { return ((View)_main.sView).Handle; }
}
}
[/code=]
似乎是在
IntPtr IJavaObject.Handle
{
get { return ((View)_main.sView).Handle; }
}
出错了,但是没有确定找到是哪里出错了。。
求指教。。AndroidMono IJavaObject.HandlemonoforandroidAddCallback
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货