András Tóth‘s professional blog
banditoth.net

Hey there 👋, I’m banditoth a .NET MAUI developer from Hungary.
I write about software development with .NET technologies.

You can find me on:
LinkedIn | Github | StackOverflow | X / Twitter | Threads

Tag: android

  • [Fun] Android: My favourite exception ever

    This content has 5 years. Some of the information in this post may be out of date or no longer work. Please, read this page keeping its age in your mind.
    10-12 11:31:09.871 E/AndroidRuntime(10069): DeadSystemException: The system died; earlier logs will point to the root cause
    
  • Xamarin Android: Dismiss lock screen or show activity on lock screen

    This content has 5 years. Some of the information in this post may be out of date or no longer work. Please, read this page keeping its age in your mind.

    To gain an Activity to be showed on the lock screen, or bypass the phone’s lock screen (aka Keyguard) for important notification handling, for example an Incoming VOIP call, you need to do the following:

    Set the permission for disabling keyguard. Add the following permission to the AndroidManifest.xml:

      <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
    

    Add flags to the Activity’s Window in order to show the activity on the lock screen, or to bypass the lock screen.

    this.Window.AddFlags(WindowManagerFlags.DismissKeyguard | WindowManagerFlags.ShowWhenLocked);
    

    Dismiss the keyguard if needed. (CrossCurrentActivity plugin is used to get the current activity):

    KeyguardManager keyguardManager = (KeyguardManager)CrossCurrentActivity.Current.Activity?.GetSystemService(Context.KeyguardService);
    if (keyguardManager != null)
    {	
    	keyguardManager.RequestDismissKeyguard(CrossCurrentActivity.Current.Activity, null);
    }
    

  • Xamarin Android: Native image scaling, images are pixelated

    This content has 5 years. Some of the information in this post may be out of date or no longer work. Please, read this page keeping its age in your mind.

    If you use Android’s native image scaling, from ldpi, mdpi, hdpi, to xxxhdpi, and have all the image resource in the right directory of your Xamarin.Android project folder, and find the pictures displaying pixelated: Make sure, you are correctly set the Build action for each images to AndroidResource. When adding an existing item to the resources folder from Windows version of VisualStudio’s browse dialog, the Build action will be set to BundleResource, and won’t appear in the Resources.designer.cs file, so it will be unavailable to use from code. If the picture is displaying, but it is pixelated, you may check the higher DPI version image files, have the correct buid action

  • Android: Application auto backup ki/be kapcsolása (Xamarin is)

    This content has 5 years. Some of the information in this post may be out of date or no longer work. Please, read this page keeping its age in your mind.

    Android 6.0 óta (API verzió v23) bevezették az Androidba, hogy az alkalmazás fájljairól biztonsági mentést készít az operációs rendszer a felhasználó Google drive-jára. A backupok mérete maximum 25MB lehet, és az Android a JobScheduler API-jával készülnek 24 órás időintervallumban. További információk itt: https://developer.android.com/guide/topics/data/autobackup

    Az érintett fájlok:

    • Shared preferences files
    • Files in the directory returned by getFilesDir()
    • Files in the directory returned by getDatabasePath(String)
    • Files in directories created with getDir(String, int)
    • Files on external storage in the directory returned by getExternalFilesDir(String)

    Mivel a Xamarin Essentials a SharedPreferencesbe teszi a Preferences statikus osztály által tárolt adatokat, ezért azok is mentésre kerülnek.

    A be/ki kapcsoláshoz az AndroidManifest.xml-ben a következő propertyre van szükség az application tagben:

    android:allowBackup="true"
    
  • Xamarin Forms / Android: Backspace detektálása az Entrykben

    This content has 5 years. Some of the information in this post may be out of date or no longer work. Please, read this page keeping its age in your mind.

    Ahhoz, hogy a szoftveres / hardveres billentyűzeten ütött vissza gomb érzékelését detektáljuk a billentyűzeten, szükségünk lesz egy CustomRenderer-re, ahhoz pedig egy Entry száramaztatáshoz a közös kódban:

    public class CustomEntry: Entry
    {
        public delegate void BackspaceEventHandler(object sender, EventArgs e);
    
        public event BackspaceEventHandler OnBackspace;
    
        public CustomEntry() { }
    
        public void OnBackspacePressed() 
        {
            if (OnBackspace != null)
            {
                OnBackspace(null, null);
            }
        }
    }
    

    Két CustomRenderer megoldás is van Androidon. Az egyik, amelyik magát a Renderert egy InputFilter implementációvá teszi, a másik, amely egy csak egy metódust overrideol. A különbség köztük, hogy a DispatchKeyEvent override az üres entry esetén is továbbítja az eventet, míg az inputfiilter csak akkor érzékeli a visszatörlés gombnyomást, ha volt már szöveg benne.

    DispatchKeyEvent override megoldás

    public class CustomEntryRenderer: EntryRenderer
     {
        public override bool DispatchKeyEvent(KeyEvent e)
        {
            if (e.Action == KeyEventActions.Down)
            {
                if (e.KeyCode == Keycode.Del)
                {
                    if (string.IsNullOrWhiteSpace(Control.Text))
                    {
                        var entry = (PasswordBox)Element;
                        entry.OnBackspacePressed();
                    }
                }
            }
            return base.DispatchKeyEvent(e);
        }
    
        protected override void 
        OnElementChanged(Xamarin.Forms.Platform.Android.ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);
        }
    }
    

    InputFilter implementáció

    [assembly: ExportRenderer(typeof(CustomEntry), typeof(CustomEntryRenderer))]
    namespace App.Droid.Renderers
    {
        public class CustomEntryRenderer: EntryRenderer, Android.Text.IInputFilter
        {
            protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
            {
                base.OnElementChanged(e);
    
                if (Control == null) 
                {
                    return;
                }
    
                Control.SetFilters(new IInputFilter[] { this });
    
            }
    
            ICharSequence IInputFilter.FilterFormatted(ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
            {
                if (string.IsNullOrWhiteSpace(source.ToString()))
                {
                    var entry = (CustomEntry)Element;
                    entry.OnBackspacePressed();
                }
                return source;
            }
    
        }
    }