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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

5481閲覧

Androidの内部ストレージのアクセス方法が知りたいです。

gken

総合スコア4

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2021/11/05 15:11

編集2021/11/06 15:16

バイト配列のデータを書き込み後、再度アクセスしたい

画像(jpg)をAndroidで受信するプログラムを書いています。
画像の受信にはうまくいっていますが受信したデータの書き込み、読み込みにうまくいっていません。

画像を書き込む場所のファイル一覧を

File[] dataFiles = dir.listFiles();

で取得できていません。

受信側の端末がAndroid 12(API31)のためパス(/storage/emulated/0/DCIM/Camera)を指定したアクセスができないのだと思います。

しかし、なぜ画像の書き込みはうまくいっているのかわかりません。また、
/storage/emulated/0/DCIM/Cameraはカメラで撮影した写真が保存されるディレクトリでフォトで表示されるはずですが、表示できずファイルエクスプローラーでしか確認できません。

そのため、アプリの固有のディレクトリのパスでも試したところ画像受信後、ファイル一覧の取得できていますが、アプリの固有のため受信した画像を確認することができていません。

やりたいこととしては

・受信したデータ(バイト配列)を書き込みたい
・書き込んだディレクトリ直下のファイル一覧を取得したい

の2点です。
受信したバイト配列をMediaStoreなどでDCIMやPictureに保存、またはファイル一覧を取得する方法が分からなく教えて頂きたいです。

Logcat Android

2021-11-05 21:30:02.601 8816-8858/com.websarva.wings.android.client_recive_image I/AdrenoGLES-0: Build Config : S P 10.0.4 AArch64 2021-11-05 21:30:02.601 8816-8858/com.websarva.wings.android.client_recive_image I/AdrenoGLES-0: Driver Path : /vendor/lib64/egl/libGLESv2_adreno.so 2021-11-05 21:30:02.601 8816-8858/com.websarva.wings.android.client_recive_image D/hw-ProcessState: Binder ioctl to enable oneway spam detection failed: Invalid argument 2021-11-05 21:30:02.609 8816-8858/com.websarva.wings.android.client_recive_image I/AdrenoGLES-0: PFP: 0x016ee190, ME: 0x00000000 2021-11-05 21:30:02.613 8816-8858/com.websarva.wings.android.client_recive_image W/AdrenoUtils: <ReadGpuID_from_sysfs:197>: Failed to open /sys/class/kgsl/kgsl-3d0/gpu_model 2021-11-05 21:30:02.613 8816-8858/com.websarva.wings.android.client_recive_image W/AdrenoUtils: <ReadGpuID:221>: Failed to read chip ID from gpu_model. Fallback to use the GSL path 2021-11-05 21:30:02.627 8816-8858/com.websarva.wings.android.client_recive_image D/hw-ProcessState: Binder ioctl to enable oneway spam detection failed: Invalid argument 2021-11-05 21:30:03.166 8816-8861/com.websarva.wings.android.client_recive_image W/System.err: java.lang.NullPointerException: Attempt to get length of null array 2021-11-05 21:30:03.166 8816-8861/com.websarva.wings.android.client_recive_image W/System.err: at com.websarva.wings.android.client_recive_image.MainActivity$1.run(MainActivity.java:62) 2021-11-05 21:30:03.166 8816-8861/com.websarva.wings.android.client_recive_image W/System.err: at java.lang.Thread.run(Thread.java:920) 2021-11-05 21:30:03.167 8816-8861/com.websarva.wings.android.client_recive_image D/debug: Exception e 2021-11-05 21:30:04.257 8816-8832/com.websarva.wings.android.client_recive_image W/System: A resource failed to call close.

ソースコード Android

Java

1import androidx.appcompat.app.AppCompatActivity; 2 3import android.os.Bundle; 4import android.util.Log; 5 6import java.io.File; 7import java.io.FileOutputStream; 8import java.io.InputStream; 9import java.io.OutputStream; 10import java.net.Socket; 11 12public class MainActivity extends AppCompatActivity { 13 14 public static Socket socket = null; 15 public static String host = "192.168.11.2"; 16 public static int port = 2001; 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 23 new Thread (new Runnable(){ 24 public void run(){ 25 26 String outputFilePath = null; 27 28 InputStream inputStream = null; 29 OutputStream outputStream = null; 30 FileOutputStream fileOutputstream = null; 31 32 int fileLength = 0; 33 byte[] buffer = new byte[512]; 34 35 try { 36 37 socket = new Socket(host, port); 38 inputStream = socket.getInputStream(); 39 40 outputFilePath = "/storage/emulated/0/DCIM/Camera/receive_image.jpg"; 41 42 fileOutputstream = new FileOutputStream(outputFilePath); 43 //outputStream = new FileOutputStream(outputFilePath); 44 45 while((fileLength = inputStream.read(buffer)) > 0) { 46 fileOutputstream.write(buffer, 0, fileLength); 47 //outputStream.write(buffer, 0, fileLength); 48 } 49 50 fileOutputstream.flush(); 51 fileOutputstream.close(); 52 //outputStream.flush(); 53 //outputStream.close(); 54 inputStream.close(); 55 socket.close(); 56 57 File dir = new File(outputFilePath); 58 File[] dataFiles = dir.listFiles(); 59 60 Log.d("debug","length:"+dataFiles.length); 61 Log.d("debug","length:"+dataFiles[0].getName()); 62 63 64 }catch (Exception e) { 65 e.printStackTrace(); 66 Log.d("debug","Exception e"); 67 } 68 } 69 }).start(); 70 } 71}

イメージ説明

試したこと

Android(Client)側のアプリ固有のディレクトリのパスを
String path = context.getFilesDir().getPath()
で取得しています。

この場合だと受信データを書き込んだ後に
File[] dataFiles = dir.listFiles()
でファイルの一覧を取得できています。アプリの固有のため受信した画像を確認することができていません

###変更後 Android

java

1import androidx.appcompat.app.AppCompatActivity; 2 3import android.content.Context; 4import android.os.Bundle; 5import android.util.Log; 6 7import java.io.File; 8import java.io.FileOutputStream; 9import java.io.InputStream; 10import java.io.OutputStream; 11import java.net.Socket; 12 13public class MainActivity extends AppCompatActivity { 14 15 public static Socket socket = null; 16 public static String host = "192.168.11.2"; 17 public static int port = 2001; 18 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_main); 23 24 new Thread (new Runnable(){ 25 public void run(){ 26 27 String outputFilePath = null; 28 29 InputStream inputStream = null; 30 FileOutputStream fileOutputstream = null; 31 //OutputStream outputStream = null; 32 33 int fileLength = 0; 34 byte[] buffer = new byte[512]; 35 36 try { 37 38 socket = new Socket(host, port); 39 inputStream = socket.getInputStream(); 40 41 Context context = getApplicationContext();//変更箇所 42 String path = context.getFilesDir().getPath();//変更箇所 43 outputFilePath =path +"/receive_image.jpg";//変更箇所 44 Log.d("debug","path:"+path); 45 Log.d("debug","outputFilePath:"+outputFilePath); 46 47 fileOutputstream = new FileOutputStream(outputFilePath); 48 //outputStream = new FileOutputStream(outputFilePath); 49 50 while((fileLength = inputStream.read(buffer)) > 0) { 51 fileOutputstream.write(buffer, 0, fileLength); 52 //outputStream.write(buffer, 0, fileLength); 53 } 54 55 fileOutputstream.flush(); 56 fileOutputstream.close(); 57 //outputStream.flush(); 58 //outputStream.close(); 59 inputStream.close(); 60 socket.close(); 61 62 File dir = new File(path); 63 File[] dataFiles = dir.listFiles(); 64 65 Log.d("debug","length:"+dataFiles.length); 66 Log.d("debug","length:"+dataFiles[0].getName()); 67 68 }catch (Exception e) { 69 e.printStackTrace(); 70 Log.d("debug","Exception e"); 71 } 72 } 73 }).start(); 74 } 75}

###変更後 Logcat一部 Android

2021-11-06 00:10:23.554 14436-14477/com.websarva.wings.android.gazou D/debug: path:/data/user/0/com.websarva.wings.android.gazou/files 2021-11-06 00:10:23.554 14436-14477/com.websarva.wings.android.gazou D/debug: outputFilePath:/data/user/0/com.websarva.wings.android.gazou/files/receive_image.jpg 2021-11-06 00:10:24.497 14436-14477/com.websarva.wings.android.gazou D/debug: length:1 2021-11-06 00:10:24.498 14436-14477/com.websarva.wings.android.gazou D/debug: length:receive_image.jpg

補足情報(FW/ツールのバージョンなど)

TOUGHBOOK (Server) ubuntu16.04LTS
Google Pixel4a (Client) Android12

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

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

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

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

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

dodox86

2021/11/06 00:32 編集

Android端末におけるファイルアクセスはAndroidのバージョンや場合によっては端末で様々なトピックがあり、teratailでもそれに関する質問が多く寄せられています。まず、基本部分を学んで、ご自身でどの部分が違っているか確認されることをお勧めします。以下のような公式情報などにはあたっていますでしょうか。 [データ ストレージとファイル ストレージの概要 - Android Developers] https://developer.android.com/training/data-storage?hl=ja 上記、充分に確認済みであればすみません。
gken

2021/11/06 03:08

こんにちは、コメントありがとうございます。 Android 10(API レベル 29)以降になるのでMediaStore APIを使用して受信データの書き込み、ファイルの一覧を取得したいと考えています。
jimbe

2021/11/06 04:29

> 画像の受信には成功していますが ~ であれば、「PC-Android間のソケット通信」自体はご質問とは関係ないと思います。 タイトルやタグ等変えられた方が良いのではないでしょうか。
gken

2021/11/06 15:14

失礼しました。 質問内容をもう一度、整理させて頂きました。
guest

回答1

0

ベストアンサー

とりあえずメディアストアへの保存になりますが、以下の記事は如何でしょうか。
[Android] MediaStore 画像を保存する

投稿2021/11/06 17:17

jimbe

総合スコア13209

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

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

gken

2021/11/09 15:12

私の技量不足でファイルの一覧の取得はできませんでしたが、 引用して頂いたサイトは以前からお世話になっており、とても参考になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問