我在我的Xamarin Forms 5应用程序上使用Xamarin Essentials MediaPicker(v1.7.3),它只是冻结并最终在iOS上崩溃应用程序,但在Android上工作得很好。
我的应用使用MVVM
模式,所以我有一个ImageButton
连接到我的视图模型中的一个方法,该方法的代码如下所示:
async Task Add_Image_Tapped()
{
try
{
var photosPermission = await Permissions.CheckStatusAsync<Permissions.Photos>();
var cameraPermission = await Permissions.CheckStatusAsync<Permissions.Camera>();
if (photosPermission != PermissionStatus.Granted || photosPermission != PermissionStatus.Restricted)
photosPermission = await Permissions.RequestAsync<Permissions.Photos>();
if (cameraPermission != PermissionStatus.Granted || cameraPermission != PermissionStatus.Restricted)
cameraPermission = await Permissions.RequestAsync<Permissions.Camera>();
if ((photosPermission == PermissionStatus.Granted
|| photosPermission == PermissionStatus.Restricted)
&& (cameraPermission == PermissionStatus.Granted
|| cameraPermission == PermissionStatus.Restricted))
await HandleImagePicker();
}
catch(Exception e)
{
throw new Exception(e.Message);
}
}
字符串
如果权限检查正常,这里是处理图像拾取的方法:
private async Task HandleImagePicker()
{
try
{
var filePath = string.Empty;
var fileName = string.Empty;
MainThread.BeginInvokeOnMainThread(() => {
var result = MediaPicker.PickPhotoAsync(new MediaPickerOptions
{
Title = "Pick Image"
}).Result;
if (result == null)
return;
filePath = result.FullPath;
fileName = result.FileName;
});
if (!string.IsNullOrEmpty(filePath) && !string.IsNullOrEmpty(fileName))
{
// Do something with the image
}
}
catch(Exception e)
{
throw new Exception(e.Message);
}
}
型
我正在使用Xamarin Forms 5.0.0.2401
、Xamarin Community Toolkit 2.0.2
和Xamarin Essentials 1.7.3
。我在Info.plist
中还拥有以下权限:
<key>NSCameraUsageDescription</key>
<string>MyApp would like to access your camera</string>
<key>NSMicrophoneUsageDescription</key>
<string>MyApp would like to access your microphone</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>MyApp would like to access your photo library</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>MyApp would like to access your photo library</string>
型
我还在AppDelegate
FinishedLaunching()
方法中初始化Xamarin Essentials,如下所示:
Xamarin.Essentials.Platform.Init(() => new UIViewController());
型
你知道问题出在哪吗?
更新:
上面的代码反映了我根据使用主线程等建议进行更改后的当前代码。
目前,如果我在Mac上的iOS模拟器上运行应用程序,它实际上永远挂起。永远不会抛出异常或崩溃。
如果我在一个真实的设备上运行它,即iPhone Xs,它会挂起相当长的一段时间,并最终崩溃整个应用程序。
如前所述,它在Android上运行得非常好。
4条答案
按热度按时间cu6pst1q1#
这里有一些建议
1.尝试将方法签名还原为原始签名。
字符串
1.使用
Try Catch
Package 代码,查看是否有任何错误信息。1.调用
PickPhotoAsync
时不要设置任何参数。型
1.在调用
PickPhotoAsync
之前尝试添加await Task.Delay(100)
。svmlkihl2#
您能否演示如何请求用户权限以访问设备存储。
建议-添加一个检查方法,用于每次尝试访问设备存储时的权限检查。您可以使用code. crosslink插件。
它的样本看起来像-
个字符
hxzsmxv23#
使用PickPhotoAsync和
await
很重要。这段代码可能是用你原来的挂起换了一个不同的挂起:
字符串
您需要切换到MainThread * 并 * 启动
async
上下文。假设你已经在一个
async
方法中,使用一个新的MainThread方法InvokeOnMainThreadAsync
。并在线程中添加async
:型
是
await/async
,否.Result
。如果这个仍然挂起,那么请创建一个公共的github repo,包含一个可以构建和运行的显示挂起的简单项目。
7xllpg7q4#
我遇到了这个问题,因为完全相同的问题。问题是这一行:
字符串
把它拿开。
我添加它是为了解决一个不同的问题,记得我看到关于它的行时。删除它解决了我的问题。