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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

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

Q&A

解決済

2回答

4231閲覧

Xamarinを使って、画像をダウンロードしてマイピクチャに保存したいがエラーになる

pon-kotu

総合スコア3

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

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

0グッド

0クリップ

投稿2021/05/30 00:30

編集2021/05/30 03:02

xamarinを使ってAndroidアプリを作っています。
WebClientのDownloadFileを使ってインターネット上の画像を取得する、という機能を作っています。

これまではDownloadFileの第一引数には『ダウンロードしたい画像のURL』、第二引数には『System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)で取得したドキュメントフォルダ+画像のタイトル.png』を指定していました。

しかし、「実機で稼働させたときにダウンロードした画像を既定の画像フォルダに入れたい」と考え、『System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyPictures)』を指定するように変更しました。
すると、今まではちゃんとダウンロードできていたWebClient.DownloadFile()の部分で『An exception occurred during a WebClient request. 』というエラーが発生するようになりました。

調べると、第二引数をファイル名ではなくフォルダを指定するとこのようなエラーが出る、とありました。しかし、上記の通り私はpngファイルとして指定しています。

マニフェストファイルでは、以下の三つのパーミッションを指定しています。
ACCESS_NETWORK_STATE
WRITE_EXTERNAL_STORAGE
ACCESS_COARSE_LOCATION

エミュレータは「SHARP SH-04L(Android 10.0-API29)」(実機)で行っています。

質問
ダウンロードした画像をマイピクチャに保存するには、どうすればいいでしょうか?

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Xamarin.Formsで試してみました。
Xamarin.Androidで実装している場合、必要があれば読み替えてください。

『An exception occurred during a WebClient request. 』というエラーが発生するようになりました。

まずこちらに関しては、以下のようにフォルダを作成する処理の追加で解消しました。

C#

1var folderPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyPictures); 2if (!Directory.Exists(folderPath)) 3{ 4 Directory.CreateDirectory(folderPath); 5}

以下、蛇足です。

『System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)で取得したドキュメントフォルダ+画像のタイトル.png』を指定していました。
『System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyPictures)』を指定するように変更しました。

上記から、現在の実装では、/data/user/0/PACKAGE_NAME/files/Pictures/image.jpgのようなパスにファイル出力をしているようです。
このパスの場合、アプリ内ではファイル操作が行えますが、ファイルマネージャーを使用して、ユーザーがファイルの移動やコピー、削除等を行えません。

もし、ファイルマネージャーから操作できる位置にファイル出力したいと考えている場合、以下の方法でフォルダを取得すると可能になります。

C#

1// ファイルマネージャーからアクセス可能 2// /storage/emulated/0/Pictures 3//var folderPath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures).Path; 4 5// /storage/emulated/0/Android/data/PACKAGE_NAME/files/Pictures 6var context = Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity as Context; 7var folderPath = context.GetExternalFilesDir(Android.OS.Environment.DirectoryPictures).Path;

個人的にこの辺りのパスについて知らなかったので、確認するために実装しました。参考まで。
DownloadDemo

投稿2021/05/31 13:49

takapi_cs

総合スコア349

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

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

pon-kotu

2021/06/09 11:16 編集

ありがとうございます! 早速下部のGithubを見ながら実装したのですが、きちんとダウンロードすることができたようです。 ただ一つ、実際にAndroidでダウンロードした画像を探しているのですが、見当たりません。これは内部ストレージ内に自作アプリケーション名フォルダのようなものがあって、そこにあるのでしょうか? ファイルの場所まで確認できました。ありがとうございました。
guest

0

特殊フォルダのパスを取得する

これでパスがとってこれますね

投稿2021/05/30 01:11

y_waiwai

総合スコア87774

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

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

pon-kotu

2021/05/30 01:49

はい、できます。 聞きたいのは「とってきたマイピクチャのパスを使って画像をダウンロードしたときにエラーが出ることへの対処方法」の方です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問