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

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

ただいまの
回答率

87.95%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 163

score 3

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)」(実機)で行っています。

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

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

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

var folderPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyPictures);
if (!Directory.Exists(folderPath))
{
    Directory.CreateDirectory(folderPath);
}

以下、蛇足です。

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

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

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

// ファイルマネージャーからアクセス可能
// /storage/emulated/0/Pictures
//var folderPath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures).Path;

// /storage/emulated/0/Android/data/PACKAGE_NAME/files/Pictures
var context = Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity as Context;
var folderPath = context.GetExternalFilesDir(Android.OS.Environment.DirectoryPictures).Path;

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/06/01 19:17 編集

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

    ファイルの場所まで確認できました。ありがとうございました。

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/05/30 10:49

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

    キャンセル

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

  • ただいまの回答率 87.95%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る