首页 > 解决方案 > 如何获得可绘制路径?

问题描述

        public async Task<List<AppItem>> GetAndroidApps()
        {
            try
            {
                var apps = Android.App.Application.Context.PackageManager.GetInstalledApplications(PackageInfoFlags.MatchAll);

                foreach(var item in apps)
                {
                    string packageName = item.PackageName;
                    string appName = item.LoadLabel(Android.App.Application.Context.PackageManager);
                    var appIcon = item.LoadIcon(Android.App.Application.Context.PackageManager).ToString();

                    System.Diagnostics.Debug.WriteLine($"{appIcon}; {appName}; {packageName};");
                }

                return null;
            }
            catch(Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
                return null;
            }
        }

如何获取 appIcon 路径来显示它?我无法获得其他应用程序图标的完整路径...

谢谢!

最好的祝愿!

标签: c#xamarin.formsxamarin.android

解决方案


您可以从此组件的可绘制资源标识符(在包的资源中)加载图标。并为 imageview 设置图像源。

例如,我使用我的 App6 来加载图标。有用。

var apps = Android.App.Application.Context.PackageManager.GetInstalledApplications(PackageInfoFlags.MatchAll);

        foreach (var item in apps)
        {
            string packageName = item.PackageName;
            string appName = item.LoadLabel(Android.App.Application.Context.PackageManager);

            if (packageName == "com.companyname.app6")
            {
                var appIcon = item.LoadIcon(Android.App.Application.Context.PackageManager).ToString();
                var image = item.Icon;
                imageView.SetImageResource(image);
            }


            //System.Diagnostics.Debug.WriteLine($"{appIcon}; {appName}; {packageName};");
        }

更新:

您可以使用 DependentService 来做到这一点。

我将 deawable 的 resID 转换为位图,然后将位图转换为流。最后,我将图像源设置为 Xamarin.forms 中的流。

在 Xamarin.forms 中创建接口。

 public interface GetIcon
{
    byte[] GetIconFromApp();
}

Android中的实现:

[assembly: Dependency(typeof(GetIconFromApp_Android))]
namespace App13.Droid
{
class GetIconFromApp_Android : GetIcon
{
    public byte[] GetIconFromApp()
    {
        var apps = Android.App.Application.Context.PackageManager.GetInstalledApplications(PackageInfoFlags.MatchAll);
        byte[] bitmapData=null;
        foreach (var item in apps)
        {
            string packageName = item.PackageName;
            string appName = item.LoadLabel(Android.App.Application.Context.PackageManager);

            if (packageName == "com.companyname.app6")
            {
                var appIcon = item.LoadIcon(Android.App.Application.Context.PackageManager).ToString();
                var imageID = item.Icon;

                // Converting Drawable Resource to Bitmap
                var bitmap = BitmapFactory.DecodeResource(Forms.Context.Resources, imageID);

                //comver bitmap to byte
                using (var stream = new MemoryStream())
                {
                    bitmap.Compress(Android.Graphics.Bitmap.CompressFormat.Png, 0, stream);
                    bitmapData = stream.ToArray();
                }

            }



        }
        return bitmapData;

    }
}
}  

具有按钮单击事件的平台实现。

  private void Button_Clicked(object sender, EventArgs e)
    {
        var ImageByteArray = DependencyService.Get<GetIcon>().GetIconFromApp();
        image.Source = ImageSource.FromStream(() => new MemoryStream(ImageByteArray, 0, ImageByteArray.Length));
    }

截屏:

在此处输入图像描述


推荐阅读