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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

8479閲覧

C#でAndroid端末にファイルをコピーしたい

sgkrsokb

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/01/23 01:52

編集2020/01/23 03:03

C#アプリから直接Android内にファイルを保存したいのですが、やり方がわかりません。
SaveFileDialogを使用して、Android内部にアクセスしようとすると、保存できない旨のメッセージが表示されます。

逆にOpenFileDialogを使用して、Androidアプリで作成したファイルをコピーすることはできたのですが、
その逆はできないのでしょうか?
もしくは、Androidアプリ(kotlin)からPCのローカルフォルダを参照して、直接ファイルをコピーすることはできるのでしょうか?

ご協力お願い致します。

---------------------------- 追 記 ----------------------------
ご指摘いただきましたので、追記させていただきました。
最初から書かず、申し訳ありません。

--------------以下コード
SaveFileDialog sfd = new SaveFIleDialog();
if (sfd.ShowDialog() == true)
{
// コピー処理
}

省略はしていますが、
sfd.ShowDialog()のダイアログ画面でAndroid端末内の[内部共有ストレージ]にアクセスしようとすると、
\PC\Android端末名\にはアクセスできません
と、エラーメッセージが表示されます。

これぐらいしか書いていないのですが、わかりますでしょうか?

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

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

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

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

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

y_waiwai

2020/01/23 02:42

そのコードとエラーメッセージを提示しましょう
sgkrsokb

2020/01/23 03:03

申し訳ございません。 追記いたしました。
BluOxy

2020/01/23 04:22 編集

見せられる部分はなるべく省略せず書いて頂けると幸いです。 というのも、もしかして、「~いるため、~にアクセスできません」といった旨が出ていませんか。 (「別のプロセスで使用されているため、~にアクセスできません」とか)
BluOxy

2020/01/23 04:20

また、SaveFIleDialogとタイプミスが見受けられますが、これはコピペで持ってきたコードでしょうか。 そうでなければ構文エラーなので修正しないといけません。そうであればコードは実際に動いているソースをコピペで掲示して頂いた方が、話が紆余曲折に済みます。 コードを掲示する際はコードの前後を「```」で囲むことでインデントが入り見やすくなるので、ご協力お願いします。
Wind

2020/01/23 05:47

> 省略はしていますが、sfd.ShowDialog()のダイアログ画面でAndroid端末内の[内部共有ストレージ]にアクセスしようとすると、 重要な部分を省略し過ぎです。 OpenFileDialogを使用してコピーすることが出来たのでしたらストレージへのアクセス自体は成功していると思われますが、なぜこのエラーが発生するのか不可解です。 出来たことと出来なかったことが再現出来るサンプルプログラムを提示してください。
sgkrsokb

2020/01/28 02:44

皆様 返答遅くなり、申し訳ありません。 AndroidとPCとのファイルのやり取りにはMTPというプロトコルが使われているらしく、 通常のファイルダイアログでは正確なデータのやり取りはできないみたいです。 // サンプルにしたサイト https://www.ipentec.com/document/csharp-wpd-programming-overview 重ねて、返事が遅くなったことをお詫び申し上げます。
BluOxy

2020/01/28 02:49

MTPでなければならないのでしょうか。というのも、dodox86 さんの仰るようUSBストレージとしてAndroidをPCに接続するのではいけないのでしょうか。
sgkrsokb

2020/01/29 05:50

回答遅くなり申し訳ありません。 AndroidとPCを接続した際に選べる項目が、「USB充電」「ファイル転送」「写真を転送」「MIDIとして使用」のみだったため、今回はMTPで処理を作成していこうと思います。
guest

回答1

0

ベストアンサー

逆にOpenFileDialogを使用して、Androidアプリで作成したファイルをコピーすることはできたのですが、その逆はできないのでしょうか?

残念ですが、この場合はできないと言って差し支えないです。

お使いのAndroid端末のAndroidバージョンや製品によってある程度の違いはあるかもしれませんが、Android端末をWindowsにUSB接続したときのファイルシステムのせいだと考えられます。(**※USB接続の仕方によるようです。追記部分をご覧ください)**以下の画像は私の手持ちのAndroid端末(ASUS A007 /Android 6.0.1)をWindows 10 PCに接続して、内部ストレージを表示したものです。

イメージ説明

ここで、右側に「汎用階層形式」と言うファイルシステム名称が表示されています。これは著作権保護を意識したファイルシステムで、ファイルコピーの際に制限をかけます。(左側に表示されている内部ストレージのアイコンが音楽プレーヤーになっていることが、それを示唆しています)Android自体の内部のファイルシステムはAndroidのカーネル(Linux)で使われるext4のはずですが、USB接続した際にはWindows側でそう見えるように一時的に変換をかけているかたちです。

この「汎用階層形式」のAndroid側のストレージにWindowsのエクスプローラーからアクセスすると、**Androidの内部ストレージにフォルダーを作成することはできますが、ファイルを作成することはできません。**つまり、WindowsからAndroid端末へはファイルがコピーできないのです。これは質問者さんのOpenFileDialogでAndroid側からWindows側へはコピーできるが、SaveFileDialogでWindows側からAndroid側へはコピーできないことと合致します。

もしくは、Androidアプリ(kotlin)からPCのローカルフォルダを参照して、直接ファイルをコピーすることはできるのでしょうか

これはできないと思ってください。Android端末によりますがUSBメモリーを接続すると外部ストレージとして使えるものがあります。これはUSBの「マスストレージ」として認識できるようになっている為で、PCが持っているディスクを外部ストレージをしてみせるのは、USB接続をしたときにPC側がマスストレージとしてふるまう必要があります。過去に以下のような製品がありましたが、こういったものを使えばお望みの動作ができる可能性があります。※反対に言えば、一般的にはできない動作、と言うことです。

PCをUSBマスストレージデバイスにするケーブル発売 - AKIBA PC Hotline 2011年1月15日号


追記しました: 2020-01-25 19:58

「汎用階層形式」のファイルシステムは、Android端末にUSB接続したときに「メディアデバイス(MTP)」を選択したときに出るものでした。以下の画像は先に挙げたASUS A007とは別のAndroid端末(Android 4.4)のもので、USB接続したときの選択画面です。
イメージ説明
ここで「メディアデバイス(MTP)」を選択すればAndroid端末へのファイルのコピーはできなくなりますし、「USBストレージ」を選択するとAndroid端末はPCから見て単なるUSBメモリーになり、ファイルのコピーができるようになります。

質問者さんのAndroid端末でどのようになるか確認してみてください。「USBストレージ」を選択できれば、PCからファイルコピーできるはずです。ASUS A007では「USBストレージ」の選択肢が無いので、やはりWindowsからAndroid側へのコピーはできません。ASUS A007ではマイクロSDカードなどの外部メディアを挿入できるので、その辺も加味したカスタマイズがされているかもしれません。Android実機によるというのは言えていそうです。

投稿2020/01/25 07:34

編集2020/01/25 10:58
dodox86

総合スコア9183

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

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

dodox86

2020/01/25 07:47 編集

PC側が著作権保護などについてWindows 10ほど厳しくないWindows 7などの古いWindowsであれば、コピーできるかもしれません。(Androidのバージョンとの関係もあるかもしれません。未確認です)
dodox86

2020/01/25 11:01

Android 4.4 の別端末では普通にコピーしていたことを思い出し、気になったので再度確認し、追記しました。
sgkrsokb

2020/01/28 02:43

皆様 返答遅くなり、申し訳ありません。 AndroidとPCとのファイルのやり取りにはMTPというプロトコルが使われているらしく、 通常のファイルダイアログでは正確なデータのやり取りはできないみたいです。 // サンプルにしたサイト https://www.ipentec.com/document/csharp-wpd-programming-overview 重ねて、返事が遅くなったことをお詫び申し上げます。
dodox86

2020/01/28 02:47

ですね。MTPに対してWindows側で音楽プレーヤー用の特殊なフォルダに見えるよう(恐らくシェルエクステンション)にしているのだと思われます。
sgkrsokb

2020/01/29 05:49

わかりやすく書いていただき、本当にありがとうございます。 Android側で「USBストレージ」が選択できるか確認した所、できなかったため、 ListViewを使用した簡易ダイアログを自作して、MTPで処理を作っていこうと思います。 本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問