Xamarin Essentials MediaPicker无法在iOS上运行

lndjwyie  于 9个月前  发布在  iOS
关注(0)|答案(4)|浏览(101)

我在我的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.2401Xamarin Community Toolkit 2.0.2Xamarin 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>


我还在AppDelegateFinishedLaunching()方法中初始化Xamarin Essentials,如下所示:

Xamarin.Essentials.Platform.Init(() => new UIViewController());


你知道问题出在哪吗?
更新:
上面的代码反映了我根据使用主线程等建议进行更改后的当前代码。
目前,如果我在Mac上的iOS模拟器上运行应用程序,它实际上永远挂起。永远不会抛出异常或崩溃。
如果我在一个真实的设备上运行它,即iPhone Xs,它会挂起相当长的一段时间,并最终崩溃整个应用程序。
如前所述,它在Android上运行得非常好。

cu6pst1q

cu6pst1q1#

这里有一些建议
1.尝试将方法签名还原为原始签名。

private async void Image_Picker_Tapped(object sender, EventArgs e){}

字符串
1.使用Try Catch Package 代码,查看是否有任何错误信息。
1.调用PickPhotoAsync时不要设置任何参数。

var result = await MediaPicker.PickPhotoAsync();


1.在调用PickPhotoAsync之前尝试添加await Task.Delay(100)

svmlkihl

svmlkihl2#

您能否演示如何请求用户权限以访问设备存储。
建议-添加一个检查方法,用于每次尝试访问设备存储时的权限检查。您可以使用code. crosslink插件。
它的样本看起来像-

async Task Image_Picker_Tapped()
{
   if (await GetPhotoLibraryPermission())
   {
      var result = await MediaPicker.PickPhotoAsync(new MediaPickerOptions
      {
         Title = "Pick Image"
      };
   }
   // Handle the image
}

个字符

hxzsmxv2

hxzsmxv23#

使用PickPhotoAsync和await很重要。
这段代码可能是用你原来的挂起换了一个不同的挂起:

var result = MediaPicker.PickPhotoAsync(new MediaPickerOptions
 {
    Title = "Pick Image"
 }).Result;

字符串
您需要切换到MainThread * 并 * 启动async上下文。
假设你已经在一个async方法中,使用一个新的MainThread方法InvokeOnMainThreadAsync。并在线程中添加async

// Have "await" and "async" here.
await Device.InvokeOnMainThreadAsync(async () => {
    ...
    // HAVE "await" here.
    var result = await MediaPicker.PickPhotoAsync(new MediaPickerOptions
    {
        Title = "Pick Image"
    });   // DON'T use ".Result".


await/async,否.Result
如果这个仍然挂起,那么请创建一个公共的github repo,包含一个可以构建和运行的显示挂起的简单项目。

7xllpg7q

7xllpg7q4#

我遇到了这个问题,因为完全相同的问题。问题是这一行:

Xamarin.Essentials.Platform.Init(() => new UIViewController());

字符串
把它拿开。
我添加它是为了解决一个不同的问题,记得我看到关于它的行时。删除它解决了我的问题。

相关问题