バイト配列のデータを書き込み後、再度アクセスしたい
画像(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
回答1件
あなたの回答
tips
プレビュー