質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

2回答

2340閲覧

[Xamarin.Forms]Drawable型を共通プロジェクトで表示したい

aki_lua87

総合スコア13

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2017/04/13 14:07

編集2017/04/17 07:02

###前提・実現したいこと
Android側のプロジェクトで取得したAndroidにインストールされたアプリのアイコン画像を
PCLプロジェクトのImageCellにバインディングしたい。

###発生している問題・エラーメッセージ

現在、Android側のプロジェクトにて

cs

1public Drawable GetIcon(string packageName) 2{ 3 PackageManager packageManager = Forms.Context.PackageManager; 4 var icon = packageManager.GetApplicationIcon(packageName); 5 return icon; 6}

を作成しDrawable型で画像を取得したのですが
これをそのままPCL側のプロジェクトに持ってきても画像の表示が出来てない状態です。

できればこのDrawable型の画像データをPCL側で、ImageCellのImageSourceに表示させたいと考えております。
しかしDrawable型のままではImageSourceへの設定ができず手詰まりとなっております。

Drawable型の画像を共通プロジェクトにて表示させる方法
もしくは、Drawable型の画像を共通プロジェクト側で表示できる形に変換できる方法は
何かありますでしょうか。

技術的に可能か不可能かという点のみでもよろしいのでご教示頂けないでしょうか。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

AndroidのBitmapを作って、バイナリストリームに変換して、そこからImageSourceを作る必要がある気がします

こちらの方法にて無事画像の表示が出来ました。ありがとうございます。
また、解決致しましたが後に見られた人のために一応質問内容についても具体的にさせて頂きました。

解決方法についてですが質問内のコードを以下のようにしました。

cs

1public byte[] GetIcon(string packageName) 2{ 3 PackageManager packageManager = Forms.Context.PackageManager; 4 var drawableIcon = packageManager.GetApplicationIcon(packageName); 5 6 var bitmapIcon = drawableToBitmap(drawableIcon); 7 8 var memoryStream = new MemoryStream(); 9 bitmapIcon.Compress(Bitmap.CompressFormat.Png, 100, memoryStream); 10 var icon = memoryStream.ToArray(); 11 12 return icon; 13}

上記コードで取得したbyte[]型をPCL側で下記コードでImageSorce型に変更したところ
ImageCellのImageSourceへのバインディングができ、問題なく表示されました

cs

1ImageSource image = ImageSource.FromStream(() => new MemoryStream(bytesIcon));

以上です。
回答いただき、ありがとうございました。

投稿2017/04/17 07:16

aki_lua87

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Drawable経由だと遠回りなきがします。
AndroidのBitmapを作って、バイナリストリームに変換して、そこからImageSourceを作る必要がある気がします(やってないので違うかも)

端末内部の画像というのは具体的にどれでしょうか?どれかによってベストな選択肢が違うと思います。

  1. ギャラリー内部の画像
  2. アプリのResourceに登録されている画像
  3. ファイルシステムに保管されている画像

ギャラリー内部の画像

ギャラリー内の画像を取得してFormsで使いたいのであれば、Xamarin.ComponentsのMedia Pluginを利用したらどうでしょうか?

https://www.nuget.org/packages/Xam.Plugin.Media/
https://github.com/jamesmontemagno/MediaPlugin

アプリのResourceに登録されている画像

「内部」の意味が、Resource/drawable~に保存している画像であれば、そのファイル名を直接ImageCellのSourceに記述すれば利用できます。
ImageCellではなくButtonのImageプロパティですがこちらと同じようにすれば利用できます。

https://github.com/ProjectBlueMonkey/BlueMonkey/blob/master/client/BlueMonkey/BlueMonkey.Views/MainPage.xaml#L36

ファイルシステムに保管されている画像

ファイルシステムから取得した場合であればAndroid側でDrawableに変換してしまわずに、PCL側までファイルパスとして渡してImageSourceクラスのFromFileメソッドを利用してImageSourceを作成してCellに設定するのが良いと思います。
まぁこれDrawableで取得しているという事はこれではない気がしますが。

投稿2017/04/16 01:30

nuits.jp

総合スコア346

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問