Xamarin.Forms使用Plugin.Media拍照无效

时间:2016-04-23 14:47:05

标签: plugins xamarin xamarin.android xamarin.forms

我使用的是来自@JamesMontemagno版本2.4.0-beta的Plugin.Media(它修复了图片方向),它正在研究Adroind 4.1.2(Jelly Bean)和Marshmallow,但不是我的Galaxy S5 Neo与Android版本5.1.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();                                                               
                    }                        
                }
            }                
        };

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

1 个答案:

答案 0 :(得分:3)

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

  

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

怎么做:

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

插件代码:

TakePhotoAsync方法的Android平台code对我来说很好,但请记住,通过Task传回的该图片的内存将会被加倍,因为它已被封送从ART VM返回Mono VM。返回后尽快致电GC.Collect()会有所帮助(但您的活动仍在重启......)

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上有吗?还是所有设备?

我会称之为非常可疑(即一个错误),因为即使在本机相机Intent / Activity之后刷新所有Java内存,应用程序Activity的重启时间也应该如此在oct-core 1.6 GHz Cortex上不需要30秒......但我没有在你面前使用你的设备,应用程序和代码....