How to invoke a method located inside the Android project from the Portable Class Library Project in Xamarin.Forms?

前端 未结 1 686
花落未央
花落未央 2021-02-06 14:23

This might sound a silly question but since I\'m quite new to Xamarin, I\'ll go for it.

So I have a Xamarin.Forms solution and there\'s an Android project plus a Portabl

相关标签:
1条回答
  • The solution is indeed in the provided link if you use Xamarin.Forms.Labs. If you only use Xamarin.Forms, it's almost the same thing you gotta do by using the DependencyService. It's easier than it seems. http://developer.xamarin.com/guides/cross-platform/xamarin-forms/dependency-service/

    I suggest reading this post where I almost broke my brain trying to understand. http://forums.xamarin.com/discussion/comment/95717

    For convenience, here's a working example that you could adapt if you didn't already finish your work:

    Create an interface in your Xamarin.Forms project.

    using Klaim.Interfaces;
    using Xamarin.Forms;
    
    namespace Klaim.Interfaces
    {
        public interface IImageResizer
        {
            byte[] ResizeImage (byte[] imageData, float width, float height);
        }
    }
    

    Create the service/custom renderer in your Android project.

    using Android.App;
    using Android.Graphics;
    using Klaim.Interfaces;
    using Klaim.Droid.Renderers;
    using System;
    using System.IO;
    using Xamarin.Forms;
    using Xamarin.Forms.Platform.Android;
    
    [assembly: Xamarin.Forms.Dependency (typeof (ImageResizer_Android))]
    namespace Klaim.Droid.Renderers
    {
        public class ImageResizer_Android : IImageResizer
        {
            public ImageResizer_Android () {}
            public byte[] ResizeImage (byte[] imageData, float width, float height)
            {
    
                // Load the bitmap
                Bitmap originalImage = BitmapFactory.DecodeByteArray (imageData, 0, imageData.Length);
                Bitmap resizedImage = Bitmap.CreateScaledBitmap(originalImage, (int)width, (int)height, false);
    
                using (MemoryStream ms = new MemoryStream())
                {
                    resizedImage.Compress (Bitmap.CompressFormat.Jpeg, 100, ms);
                    return ms.ToArray ();
                }
            }
        }
    }
    

    So when you call this:

    byte[] test = DependencyService.Get<IImageResizer>().ResizeImage(AByteArrayHereCauseFun, 400, 400);
    

    It executes Android code and returns the value into your Forms project.

    0 讨论(0)
提交回复
热议问题