Xamarin.Forms使用Plugin.Media拍照无法正常工作

问题描述 投票:2回答:1

我正在使用来自@JamesMontemagno版本2.4.0-beta的Plugin.Media(它修复图片方向),它正在使用Adroind 4.1.2(Jelly Bean)和Marshmallow,但不适用于我的带有Android版本5.1的Galaxy S5 Neo。 1。

基本上,当我拍照时,它永远不会从我开始这个过程的页面返回;总是返回初始主页。

在它工作的设备上,当我拍照时,我看到首先应用程序触发OnSleep,然后在拍摄照片后触发OnResume。在我的设备不工作时它触发OnSleep并且在拍摄照片后不会触发OnResume,它会触发初始化页面,然后触发OnStart。因此,它不会打开拍摄照片时的页面。

我应该怎么做以确保它触发OnResume返回到正确的页面而不是在初始页面上返回的OnStart?

另外,当我拍照时,等待TakePhotoAsync过程后返回代码需要将近30秒,而且速度太慢了!

遵循我的代码:

MyTapGestureRecognizerEditPicture.Tapped += async (sender, e) =>           
{               
            //Display action sheet
            String MyActionResult = await DisplayActionSheet(AppLocalization.UserInterface.EditImage, 
                                                            AppLocalization.UserInterface.Cancel, 
                                                            AppLocalization.UserInterface.Delete,
                                                            AppLocalization.UserInterface.TakePhoto, 
                                                            AppLocalization.UserInterface.PickPhoto);                
            //Execute action result                               
            if (MyActionResult == AppLocalization.UserInterface.TakePhoto)
            {
                //-----------------------------------------------------------------------------------------------------------------------------------------------
                //Take photo               
                await CrossMedia.Current.Initialize();
                if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
                {
                    await DisplayAlert(AppLocalization.UserInterface.Alert, AppLocalization.UserInterface.NoCameraAvailable, AppLocalization.UserInterface.Ok);
                }
                else
                {                        
                    var MyPhotoFile = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
                    {
                        Directory = "MyApp",
                        Name = "MyAppProfile.jpg",
                        SaveToAlbum = true,
                        PhotoSize = Plugin.Media.Abstractions.PhotoSize.Small
                    });                        
                    if (MyPhotoFile != null)
                    {                            
                        //Render image
                        MyProfilePicture.Source = ImageSource.FromFile(MyPhotoFile.Path);                                                        
                        //Save image on database
                        MemoryStream MyMemoryStream = new MemoryStream();
                        MyPhotoFile.GetStream().CopyTo(MyMemoryStream);
                        byte[] MyArrBytePicture = MyMemoryStream.ToArray();
                        await SaveProfilePicture(MyArrBytePicture);
                        MyPhotoFile.Dispose();
                        MyMemoryStream.Dispose();                             
                    }                        
                }
            }
            if (MyActionResult == AppLocalization.UserInterface.PickPhoto)
            {
                //-----------------------------------------------------------------------------------------------------------------------------------------------
                //Pick photo
                await CrossMedia.Current.Initialize();
                if (!CrossMedia.Current.IsPickPhotoSupported)
                {
                    await DisplayAlert(AppLocalization.UserInterface.Alert, AppLocalization.UserInterface.PermissionNotGranted, AppLocalization.UserInterface.Ok);
                }
                else
                {                        
                    var MyPhotoFile = await CrossMedia.Current.PickPhotoAsync();
                    if (MyPhotoFile != null)
                    {                            
                        //Render image
                        MyProfilePicture.Source = ImageSource.FromFile(MyPhotoFile.Path);
                        //Save image on database
                        MemoryStream MyMemoryStream = new MemoryStream();
                        MyPhotoFile.GetStream().CopyTo(MyMemoryStream);
                        byte[] MyArrBytePicture = MyMemoryStream.ToArray();
                        await SaveProfilePicture(MyArrBytePicture);
                        MyPhotoFile.Dispose();
                        MyMemoryStream.Dispose();                                                               
                    }                        
                }
            }                
        };

请帮忙!!我们需要部署此应用程序,但我们无法解决此问题。先感谢您!

plugins xamarin xamarin.android xamarin.forms
1个回答
4
投票

让Android OS终止并重新启动Activity是完全正常的。如您所见,您的应用程序的Activity将在相机应用程序退出并且操作系统将控制权返回到您的应用程序时自动重新启动。可能性只是需要更多的记忆才能用Neo的16MP相机拍摄照片,你可以观看logcat输出来确认。

重新启动 - Android中可以从生命周期中的任何位置暂停或停止的活动从内存中删除。如果用户导航回活动,则必须重新启动它,恢复到先前保存的状态,然后显示给用户。

What to do:

因此,在Xamarin.Forms OnStart生命周期方法中,您需要将应用程序恢复到有效的运行状态(初始化变量,执行任何绑定等等)。

Plug code:

用于code方法的Android平台TakePhotoAsync看起来很好,但请记住,通过Task传回的图像的内存将加倍,因为它从ART VM封送回Mono VM。返回后尽快调用GC.Collect()会有所帮助(但是你的Activity仍在重启......)

public async Task<MediaFile> TakePhotoAsync(StoreCameraMediaOptions options)
        {
        ~~~
        var media = await TakeMediaAsync("image/*", MediaStore.ActionImageCapture, options);

反过来打电话:

this.context.StartActivity(CreateMediaIntent(id, type, action, options));

你可以在Android操作系统中真正做到这一点,以弹出相机。

另外,当我拍照时,等待TakePhotoAsync过程后返回代码需要将近30秒,而且速度太慢了!

那是你的Neo吗?还是所有设备?

我称之为非常可疑(即一个错误)甚至在本机Camera Intent / Activity之后刷新所有Java内存,并且你的应用程序的Activity的重启时间不应该在oct-core 1.6 GHz Cortex上花费30秒......但我没有你面前的设备,应用程序和代码....

© www.soinside.com 2019 - 2024. All rights reserved.