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