Xamarin Xam.Plugin.Media';打开的文件太多';
我有一个Xamarin forms PCL应用程序,使用Xam.Plugin.Media helper。我有一个页面,用户在按下按钮时调用照相机助手来拍照。摄影机辅助对象中的字节返回页面并用作图像的源。页面上有一个save按钮,我基本上在这里调用消息传递服务并将字节保存到PCL SQlite存储。问题是,我成功加载了大约3次此页面,并且可以在使用相机拍摄图像后出现异常,但在图像返回字节之前,使用相机助手拍照。异常消息是“打开的文件太多”。这是iOS版的。所有相关代码如下。谢谢 摄影机辅助对象:Xamarin Xam.Plugin.Media';打开的文件太多';,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我有一个Xamarin forms PCL应用程序,使用Xam.Plugin.Media helper。我有一个页面,用户在按下按钮时调用照相机助手来拍照。摄影机辅助对象中的字节返回页面并用作图像的源。页面上有一个save按钮,我基本上在这里调用消息传递服务并将字节保存到PCL SQlite存储。问题是,我成功加载了大约3次此页面,并且可以在使用相机拍摄图像后出现异常,但在图像返回字节之前,使用相机助手拍照。异常消息是“打开的文件太多”。这是iOS版的。所有相关代码如下。谢谢 摄影机辅助对象:
public class CameraHelper
{
private MediaFile file;
public async Task<byte[]> TakePicture()
{
await CrossMedia.Current.Initialize();
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
throw new Exception("No camera available");
}
using (MediaFile file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
{
Name = $"photo{DateTime.Now.ToString("yyyyMMddHHmmss")}.jpg",
PhotoSize = PhotoSize.Small,
CompressionQuality = 80,
AllowCropping = true,
}))
{
if (file == null)
{
return null;
}
using (System.IO.Stream stream = file.GetStream())
{
ImgBytes = new byte[stream.Length];
await stream.ReadAsync(ImgBytes, 0, Convert.ToInt32(stream.Length));
file.Dispose();
}
}
return ImgBytes;
}
}
如果读取正确,GetStream
每次都会向文件打开一个新流。我会尝试使用语句包装您的CrossMedia.Current.TakePhotoAsync
调用和中的流,以确保它们得到正确处理
public class CameraHelper
{
public async Task<byte[]> TakePicture()
{
await CrossMedia.Current.Initialize();
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
throw new Exception("No camera available");
}
using ( MediaFile file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
{
Name = $"photo{DateTime.Now.ToString("yyyyMMddHHmmss")}.jpg",
PhotoSize = PhotoSize.Small,
CompressionQuality = 80,
AllowCropping = true,
}) ) {
if (file == null) {
return null;
}
using (System.IO.Stream stream = file.GetStream()) {
byte[] ImgBytes;
ImgBytes = new byte[stream.Length];
stream.Read(ImgBytes, 0, Convert.ToInt32(stream.Length));
}
}
return ImgBytes;
}
}
公共类摄像机帮助器
{
公共异步任务TakePicture()
{
等待CrossMedia.Current.Initialize();
如果(!CrossMedia.Current.IsCameraAvailable | |!CrossMedia.Current.IsTakePhotoSupported)
{
抛出新异常(“没有可用的摄像头”);
}
使用(MediaFile file=wait CrossMedia.Current.TakePhotoAsync)(新Plugin.Media.Abstractions.StoreCameramedOptions
{
Name=$“photo{DateTime.Now.ToString(“yyyyMMddHHmmss”)}.jpg”,
PhotoSize=PhotoSize.Small,
压缩质量=80,
AllowCropping=true,
}) ) {
if(file==null){
返回null;
}
使用(System.IO.Stream=file.GetStream()){
字节[]单位字节;
ImgBytes=新字节[stream.Length];
stream.Read(ImgBytes,0,Convert.ToInt32(stream.Length));
}
}
返回ImgBytes;
}
}
如果我阅读正确,GetStream
每次都会打开一个新的文件流。我会尝试使用
语句包装您的CrossMedia.Current.TakePhotoAsync
调用和中的流,以确保它们得到正确处理
public class CameraHelper
{
public async Task<byte[]> TakePicture()
{
await CrossMedia.Current.Initialize();
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
throw new Exception("No camera available");
}
using ( MediaFile file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
{
Name = $"photo{DateTime.Now.ToString("yyyyMMddHHmmss")}.jpg",
PhotoSize = PhotoSize.Small,
CompressionQuality = 80,
AllowCropping = true,
}) ) {
if (file == null) {
return null;
}
using (System.IO.Stream stream = file.GetStream()) {
byte[] ImgBytes;
ImgBytes = new byte[stream.Length];
stream.Read(ImgBytes, 0, Convert.ToInt32(stream.Length));
}
}
return ImgBytes;
}
}
公共类摄像机帮助器
{
公共异步任务TakePicture()
{
等待CrossMedia.Current.Initialize();
如果(!CrossMedia.Current.IsCameraAvailable | |!CrossMedia.Current.IsTakePhotoSupported)
{
抛出新异常(“没有可用的摄像头”);
}
使用(MediaFile file=wait CrossMedia.Current.TakePhotoAsync)(新Plugin.Media.Abstractions.StoreCameramedOptions
{
Name=$“photo{DateTime.Now.ToString(“yyyyMMddHHmmss”)}.jpg”,
PhotoSize=PhotoSize.Small,
压缩质量=80,
AllowCropping=true,
}) ) {
if(file==null){
返回null;
}
使用(System.IO.Stream=file.GetStream()){
字节[]单位字节;
ImgBytes=新字节[stream.Length];
stream.Read(ImgBytes,0,Convert.ToInt32(stream.Length));
}
}
返回ImgBytes;
}
}
谢谢,这看起来很有希望,但我还是收到了我检查过的相同错误,这是唯一的地方。除非ffimageloading类型是从后台文件加载图像?否则,我只使用来自摄影机辅助对象的字节数组,而不使用任何内容else@PatrickGoode你看到本地崩溃了吗?这都是管理堆栈跟踪吗?谢谢,看起来很有希望,但我仍然得到了我检查过的相同错误,这是唯一的地方。除非ffimageloading类型是从后台文件加载图像?否则,我只使用来自摄影机辅助对象的字节数组,而不使用任何内容else@PatrickGoode你看到本地崩溃了吗?是否都是管理堆栈跟踪?更新的摄影机辅助对象以反映第一个建议的答案更新的摄影机辅助对象以反映第一个建议的答案
public class CameraHelper
{
public async Task<byte[]> TakePicture()
{
await CrossMedia.Current.Initialize();
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
throw new Exception("No camera available");
}
using ( MediaFile file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
{
Name = $"photo{DateTime.Now.ToString("yyyyMMddHHmmss")}.jpg",
PhotoSize = PhotoSize.Small,
CompressionQuality = 80,
AllowCropping = true,
}) ) {
if (file == null) {
return null;
}
using (System.IO.Stream stream = file.GetStream()) {
byte[] ImgBytes;
ImgBytes = new byte[stream.Length];
stream.Read(ImgBytes, 0, Convert.ToInt32(stream.Length));
}
}
return ImgBytes;
}
}