c# - 如何获得可绘制路径?
问题描述
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 设置图像源。
例如,我使用我的 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));
}
截屏:
推荐阅读
- jenkins - 在詹金斯中构建时,AWS ECS 角色无效
- php - PHP是单线程的,作业和队列在laravel中如何工作?
- javascript - 在过渡前一段时间后过渡工作,div 立即展开,但在展开过渡的中间发生
- reactjs - Create React App v4 生成的 PWA 中的 API 缓存
- javascript - 如何在批处理文件运行之前等待复制完成?
- karate - 我想检查我的第一个 csv 文件中的两列的串联在我的空手道测试中的第二个 csv 文件中是否不存在
- javascript - Javascript用连字符大写字符串
- node.js - 用户对此配置文件没有足够的权限。谷歌分析 V4 nodejs 错误
- google-sheets - QUERY 公式返回 #N/A 错误“查询已完成,输出为空”。
- node.js - 使用 graphql-upload 将文件从 Node.JS SDK 上传到 GraphQL