Xamarin Android Camera sporadically crashes(returns to start page) after activating default android camera

Viewed 659

I have an Xamarin.Forms project that I have built for Android devices. The App inconsistently crashes when attempting to take a photo. It actually (incorrectly) returns to the start page when trying to return to the last page open (rather than fully crashing). I have included some errors that I found in my debug output (included below). I have also inlcuded my MainActvity.cs. Take Photo function from code, AppManifest and App.cs. I'm thinking that it might have something to do with a conflict with google map api library? but really I don't have a clue (have been struggling with this issue for 2 weeks). Any help greatly appreciated.

Errors from debug output

[libEGL] EGLNativeWindowType 0xba83d808 disconnect failed ... [libEGL] EGLNativeWindowType 0xb0644808 disconnect failed ... [SurfaceView] windowStopped(true) false com.google.maps.api.android.lib6.gmm6.api.at{e04ff1 VFE...C.. ........ 0,0-1164,900}

MainActivity.cs

using System;
using TCmInsp;`
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using SQLite;
using System.IO;
using Xamarin.Essentials;
using Acr.UserDialogs;
using Plugin.Media;
using Xamarin.Forms;`

namespace TCmInsp.Droid
{
        [Activity(Label = "TCmInsp", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
            {

        protected override async void OnCreate(Bundle savedInstanceState)
        {

            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            await CrossMedia.Current.Initialize();

            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            Xamarin.FormsMaps.Init(this, savedInstanceState);
            UserDialogs.Init(this);

            DependencyService.Register<DeleFromFile>();

            DependencyService.Get<DeleFromFile>();

            string fileName = "TCmInsp_db.db3";
            string folderPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
            string completePath = System.IO.Path.Combine(folderPath,fileName);

            LoadApplication(new App(completePath));

        }
                public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
        {
                    Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

AppManifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="2" android:versionName="1.2" package="com.companyname.TCmInsp" android:installLocation="preferExternal">
    <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="30" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-feature android:name="android.hardware.location" android:required="false" />
    <uses-feature android:name="android.hardware.location.gps" android:required="false" />
    <uses-feature android:name="android.hardware.location.network" android:required="false" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <application android:label="TCmInsp.Android" android:largeHeap="true">
        <provider android:name="androidx.core.content.FileProvider" 
         android:authorities="${applicationId}.fileprovider" android:exported="false" 
        android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" 
        android:resource="@xml/file_paths"></meta-data>
        </provider>
        <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="XXXX" />
        <meta-data android:name="com.google.android.gms.version" 
         android:value="@integer/google_play_services_version" />
        <uses-library android:name="org.apache.http.legacy" android:required="false" />
    </application>
</manifest>

App.cs

using System;
using Xamarin.Essentials;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using Microsoft.AppCenter;
using Microsoft.AppCenter.Analytics;
using Microsoft.AppCenter.Crashes;
using System.Diagnostics;

namespace TCmInsp
{
    public partial class App : Application
    {
        public static string FilePath;
        //TODO: Replace with *.azurewebsites.net url after deploying backend to Azure
        //To debug on Android emulators run the web backend against .NET Core not IIS
        //If using other emulators besides stock Google images you may need to adjust the IP address
        //public static string AzureBackendUrl =
            //DeviceInfo.Platform == DevicePlatform.Android ? "http://10.0.2.2:5000" : "http://localhost:5000";
        //public static bool UseMockDataStore = true;


        public App(string filePath)
        {
            InitializeComponent();

            //if (UseMockDataStore)
            //    DependencyService.Register<MockDataStore>();
            //else
            //    DependencyService.Register<AzureDataStore>();
            MainPage = new NavigationPage(new Menu());
            FilePath = filePath;
        }

        protected override void OnStart()
        {
            AppCenter.Start("android=c2d7e90f-e58a-4009-8906-552bc4fbd4e5;" +
            "uwp=a95e94f1-4f1e-47a0-a397-d753f9f8e2aa;" +
            "ios={Your iOS App secret here}",
            typeof(Analytics), typeof(Crashes));
            
        }

        protected override void OnSleep()
        {

        }

        protected override void OnResume()
        {
           
        }

    }
}

TakePhoto Function

private async void TakePhoto()
        {
            try
            {
                string gID = Guid.NewGuid().ToString();
                string fN = "RI-" + Asset_ID.Text + lblUniqueName.Text + ".jpg";

                if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
                {
                    await DisplayAlert("No Camera", "No camera available", "OK");
                    return;
                }

                await CrossMedia.Current.Initialize();
                var current = Connectivity.NetworkAccess;

                if (current != NetworkAccess.Internet)
                {
                    var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
                    {
                        Directory = "Photos_for_Upload " + DateTime.Now.ToString("dd-MM-yyyy"),
                        Name = fN,
                        SaveToAlbum = true
                    });
                }
                else
                {
                    var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
                    {
                        Directory = "All_Photos",
                        Name = fN,
                        SaveToAlbum = true
                    });

                    //! added using Microsoft.WindowsAzure.Storage;
                    var account = CloudStorageAccount.Parse("DefaultEndpointsProtocol=XXXX");
                    var blobClient = account.CreateCloudBlobClient();

                    var container = blobClient.GetContainerReference("tasman");

                    var blockBlob = container.GetBlockBlobReference(fN);

                    if (file == null)
                        return;
                    {
                        MainImage.Source = ImageSource.FromStream(() => file.GetStream());
                        await blockBlob.UploadFromStreamAsync(file.GetStream());
                    }
                    await DisplayAlert("Successful", "Photo Saved", "OK");
                }
            }
            catch
            {
                await DisplayAlert("Unsuccessful", "Photo Upload not working, Photo saved to Device", "OK");
            }
        }

Complete content of debug output

[Counters] exceeded sample count in FrameTime
[ViewRootImpl@a293eaf[MainActivity]] ViewPostIme pointer 0
[ViewRootImpl@a293eaf[MainActivity]] ViewPostIme pointer 1
[InputMethodManager] HSIFW - flag : 0
[DecorView] [INFO] isPopOver=false, config=true
[DecorView] updateCaptionType >> DecorView@4990f64[], isFloating=false, isApplication=true, hasWindowDecorCaption=false, hasWindowControllerCallback=true
[DecorView] setCaptionType = 0, this = DecorView@4990f64[]
[InputTransport] Input channel constructed: '30a014 ', fd=140
[ViewRootImpl@988101[IntermediateActivity]] setView = com.android.internal.policy.DecorView@4990f64 TM=true
[SurfaceControl] assignNativeObject: nativeObject = 0 Surface(name=null)/@0x36ba6 / android.view.SurfaceControl.readFromParcel:1117 android.view.IWindowSession$Stub$Proxy.relayout:1820 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9971 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995 
[ViewRootImpl@988101[IntermediateActivity]] Relayout returned: old=(0,0,1200,1920) new=(0,0,1200,1920) req=(1200,1920)0 dur=12 res=0x7 s={true 2959354880} ch=true fn=-1
[ViewRootImpl@988101[IntermediateActivity]] [DP] dp(1) 1 android.view.ViewRootImpl.reportNextDraw:10957 android.view.ViewRootImpl.performTraversals:3845 android.view.ViewRootImpl.doTraversal:2618 
[ViewRootImpl@988101[IntermediateActivity]] [DP] pd() Asnyc report
[ViewRootImpl@988101[IntermediateActivity]] [DP] pdf(0) 1 android.view.ViewRootImpl.lambda$performDraw$1$ViewRootImpl:4668 android.view.-$$Lambda$ViewRootImpl$DJd0VUYJgsebcnSohO6h8zc_ONI.run:6 android.os.Handler.handleCallback:938 
[ViewRootImpl@988101[IntermediateActivity]] [DP] rdf()
[ViewRootImpl@a293eaf[MainActivity]] MSG_WINDOW_FOCUS_CHANGED 0 1
[libprocessgroup] set_timerslack_ns write failed: Operation not permitted
[libprocessgroup] set_timerslack_ns write failed: Operation not permitted
[SurfaceControl] nativeRelease nativeObject s[3130614784]
[SurfaceControl] nativeRelease nativeObject e[3130614784]
[SurfaceControl] nativeRelease nativeObject s[3130617632]
[SurfaceControl] nativeRelease nativeObject e[3130617632]
[SurfaceControl] nativeRelease nativeObject s[3130617568]
[SurfaceControl] nativeRelease nativeObject e[3130617568]
[SurfaceControl] nativeRelease nativeObject s[3130617696]
[SurfaceControl] nativeRelease nativeObject e[3130617696]
[SurfaceControl] nativeRelease nativeObject s[3004402752]
[SurfaceControl] nativeRelease nativeObject e[3004402752]
[SurfaceControl] nativeRelease nativeObject s[3004402880]
[SurfaceControl] nativeRelease nativeObject e[3004402880]
[SurfaceControl] nativeRelease nativeObject s[2959468480]
[SurfaceControl] nativeRelease nativeObject e[2959468480]
[SurfaceControl] nativeRelease nativeObject s[2959468928]
[SurfaceControl] nativeRelease nativeObject e[2959468928]
[SurfaceControl] nativeRelease nativeObject s[2959468768]
[SurfaceControl] nativeRelease nativeObject e[2959468768]
[AbsListView]  in onLayout changed 
[SurfaceView] setParentSpaceRectangle: useBLAST = false position = Rect(19, 1335 - 1183, 2235) frameNumber = 58 t = android.view.SurfaceControl$Transaction@f359f88
[SurfaceView] applySurfaceTransforms: t = android.view.SurfaceControl$Transaction@f359f88 surfaceControl = Surface(name=SurfaceView - com.companyname.TCmInsp/crc64ceabadbfeeee2420.MainActivity@e04ff1@4)/@0xff52ceb frame = 58
[SurfaceView] applySurfaceTransforms: postScaleX = 1.0 postScaleY = 1.0
[InputTransport] Input channel destroyed: 'ClientS', fd=141
[ViewRootImpl@988101[IntermediateActivity]] stopped(true) old=false
[SurfaceControl] nativeRelease nativeObject s[3094087232]
[SurfaceControl] nativeRelease nativeObject e[3094087232]
[View] requestLayout() improperly called by crc64720bb2db43a66fe9.NavigationPageRenderer{4e5565c V.E...... ........ 0,0-1200,1848 #1} during second layout pass: posting in next frame
[SurfaceControl] nativeRelease nativeObject s[3130614144]
[libEGL] EGLNativeWindowType 0xb0642c08 disconnect failed
[SurfaceControl] assignNativeObject: nativeObject = 0 Surface(name=null)/@0x3fab7cb / android.view.SurfaceControl.readFromParcel:1117 android.view.IWindowSession$Stub$Proxy.relayout:1810 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9971 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995 
[SurfaceControl] assignNativeObject: nativeObject = 0 Surface(name=null)/@0x36ba6 / android.view.SurfaceControl.readFromParcel:1117 android.view.IWindowSession$Stub$Proxy.relayout:1820 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9971 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995 
[ViewRootImpl@988101[IntermediateActivity]] Relayout returned: old=(0,0,1200,1920) new=(0,0,1200,1920) req=(1200,1920)8 dur=11 res=0x5 s={false 0} ch=false fn=-1
[SurfaceView] onWindowVisibilityChanged(8) false com.google.maps.api.android.lib6.gmm6.api.at{e04ff1 VFE...C.. ........ 0,0-1164,900} of ViewRootImpl@a293eaf[MainActivity]
[SurfaceView] surfaceDestroyed callback.size 1 #2 com.google.maps.api.android.lib6.gmm6.api.at{e04ff1 VFE...C.. ........ 0,0-1164,900}
[libEGL] EGLNativeWindowType 0xba83d808 disconnect failed
[SurfaceView] remove() from RT android.view.SurfaceView$2@1746026 Surface(name=SurfaceView - com.companyname.TCmInsp/crc64ceabadbfeeee2420.MainActivity@e04ff1@4)/@0xff52ceb
[SurfaceControl] nativeRelease nativeObject s[3130614016]
[SurfaceControl] nativeRelease nativeObject e[3130614016]
[SurfaceControl] nativeRelease nativeObject s[3130613856]
[SurfaceControl] nativeRelease nativeObject e[3130613856]
[libEGL] EGLNativeWindowType 0xb0644808 disconnect failed
[SurfaceControl] nativeRelease nativeObject s[3130613792]
[SurfaceControl] nativeRelease nativeObject e[3130613792]
[SurfaceControl] assignNativeObject: nativeObject = 0 Surface(name=null)/@0x27a6214 / android.view.SurfaceControl.readFromParcel:1117 android.view.IWindowSession$Stub$Proxy.relayout:1810 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9971 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995 
[SurfaceControl] assignNativeObject: nativeObject = 0 Surface(name=null)/@0xb548384 / android.view.SurfaceControl.readFromParcel:1117 android.view.IWindowSession$Stub$Proxy.relayout:1820 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9971 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995 
[SurfaceControl] nativeRelease nativeObject s[3130613920]
[SurfaceControl] nativeRelease nativeObject e[3130613920]
[ViewRootImpl@a293eaf[MainActivity]] Relayout returned: old=(0,0,1200,1920) new=(0,0,1200,1920) req=(1200,1920)8 dur=11 res=0x5 s={false 0} ch=true fn=62
[SurfaceView] windowStopped(true) false com.google.maps.api.android.lib6.gmm6.api.at{e04ff1 VFE...C.. ........ 0,0-1164,900} of ViewRootImpl@a293eaf[MainActivity]
[ViewRootImpl@a293eaf[MainActivity]] stopped(true) old=false
0 Answers
Related