如何获得可绘制路径?

How to get drawable path?

        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路径来显示它? 我无法获得其他应用程序图标的完整路径...

谢谢!

祝福!

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

我用我的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));
    }

截图: