teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

URIのログ出力とエラーコードについて追記しました

2021/06/27 00:55

投稿

KumaChan
KumaChan

スコア37

title CHANGED
File without changes
body CHANGED
@@ -53,9 +53,14 @@
53
53
  }
54
54
  ```
55
55
 
56
- そもそものURIが間違っていたのかもしれないと考え、別のところでURIからビットマップを生成してimageViewに表示する記述を行ったところ、正常に表示されました。
56
+ そもそものURIが間違っていたのかもしれないと考え、別のところでURIからビットマップを生成してimageViewに表示する記述を行ったところ、正常に表示されました。また、URIをログ出力した結果は以下の通りで、正常に取得できていると思います。
57
+
58
+ /0/1/content://media/external/images/media/73102/ORIGINAL/NONE/image/jpeg/122683034
59
+
57
60
  ただ、その直後にFileInputStreamを生成しようとすると、やはりFileNotFoundExceptionが発生します。
58
61
 
62
+ java.io.FileNotFoundException: /0/1/content:/media/external/images/media/73102/ORIGINAL/NONE/image/jpeg/122683034 (No such file or directory)
63
+
59
64
  ```ここに言語を入力
60
65
  // ビットマップ表示は正常に行われます
61
66
  try {

3

より具体的な問題の個所を追記し、全体的に改訂いたしました

2021/06/27 00:55

投稿

KumaChan
KumaChan

スコア37

title CHANGED
@@ -1,1 +1,1 @@
1
- Androidの動画アップロード動画をバイト配列にする方法わかりせん
1
+ AndroidのFileInputStreamFileNotFoundException発生し
body CHANGED
@@ -1,31 +1,79 @@
1
1
  Androidで画像や動画をHTTPアップロードするアプリを開発しています。
2
- 画像については以下のようにバイト配列に変換でたのですが、動画ついてはその方法わかりせん
2
+ ファイルパスからファイルを作り、バイト配列に変換して送ることまわかったのですが、変換時FileNotFoundException発生してしいます
3
3
 
4
4
  ```ここに言語を入力
5
+ // データをバイト配列に
6
+ File file = new File(uri.getPath());
7
+ byte[] bytes = null;
5
- // 画像をバイト配列に(↓動画の場合はどうすればよいのでしょうか)
8
+ // ここFileNotFoundExceptionが発生ます
9
+ try (FileInputStream inputStream = new FileInputStream(file);
6
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
10
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();) {
11
+ byte[] buffer = new byte[1024];
12
+ int len = 0;
7
- bmp.compress(Bitmap.CompressFormat.JPEG, 90, bos);
13
+ while((len = inputStream.read(buffer)) != -1) {
14
+ bos.write(buffer, 0, len);
15
+ }
16
+ bytes = bos.toByteArray();
17
+ } catch (Exception e) {
18
+ e.printStackTrace();
19
+ }
20
+ // ストリーム開始
21
+ try {
8
- // HTTP通信の準備
22
+ // 通信の準備
9
- con = (HttpURLConnection) url.openConnection();
23
+ con = (HttpURLConnection) url.openConnection();
10
- con.setConnectTimeout(5000);
24
+ con.setConnectTimeout(5000);
11
- con.setReadTimeout(5000);
25
+ con.setReadTimeout(5000);
12
- con.setRequestMethod("POST");
26
+ con.setRequestMethod("POST");
13
- con.setRequestProperty("Connection", "Keep-Alive");
27
+ con.setRequestProperty("Connection", "Keep-Alive");
14
- con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
28
+ con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
15
- con.setRequestProperty("Accept-Charset", "UTF-8");
29
+ con.setRequestProperty("Accept-Charset", "UTF-8");
16
- con.setUseCaches(false);
30
+ con.setUseCaches(false);
17
- con.setDoOutput(true);
31
+ con.setDoOutput(true);
18
- // 出力ストリームを生成
32
+ // 出力ストリームを生成
19
- dos = new DataOutputStream(con.getOutputStream());
33
+ dos = new DataOutputStream(con.getOutputStream());
20
- // 出力ストリームにファイルを書き込み
34
+ // 出力ストリームにファイルを書き込み
21
- dos.writeBytes(breaks + hyphens + boundary + breaks);
35
+ dos.writeBytes(breaks + hyphens + boundary + breaks);
22
- dos.writeBytes("Content-Disposition: form-data; name=\"upfile\"; filename=\"upfile.jpg\"" + breaks + breaks);
36
+ dos.writeBytes("Content-Disposition: form-data; name=\"upfile\"; filename=\"upfile.jpg\"" + breaks + breaks);
23
- dos.write(bos.toByteArray());
37
+ dos.write(bytes);
24
- dos.writeBytes(breaks + hyphens + boundary + hyphens + breaks);
38
+ dos.writeBytes(breaks + hyphens + boundary + hyphens + breaks);
39
+ // 出力ストリームにテキストを書き込み
40
+ dos.writeBytes(hyphens + boundary + breaks);
41
+ dos.writeBytes("Content-Disposition: form-data; name=\"textpart\"" + breaks + breaks);
42
+ // 通信スタート
43
+ con.connect();
44
+ // レスポンスを取得
45
+ res = new Streamer().convert(con.getInputStream());
25
- // 出力を閉じる
46
+ // 出力を閉じる
26
- dos.close();
47
+ dos.close();
48
+ } catch (IOException e) {
49
+ e.printStackTrace();
50
+ } finally {
51
+ // 通信を閉じる
52
+ con.disconnect();
53
+ }
27
54
  ```
28
- 動画ファイル(またはファイルパス)をバイト配列にするにはどうしたらよいのでしょうか。
29
55
 
56
+ そもそものURIが間違っていたのかもしれないと考え、別のところでURIからビットマップを生成してimageViewに表示する記述を行ったところ、正常に表示されました。
57
+ ただ、その直後にFileInputStreamを生成しようとすると、やはりFileNotFoundExceptionが発生します。
58
+
59
+ ```ここに言語を入力
60
+ // ビットマップ表示は正常に行われます
61
+ try {
62
+ bmp = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
63
+ } catch (IOException e) {
64
+ e.printStackTrace();
65
+ }
66
+ imageView.setImageBitmap(bmp);
67
+ // が、ここでやっぱりFileNotFoundExceptionが発生
68
+ File file = new File(uri.getPath());
69
+ try {
70
+ FileInputStream inputStream = new FileInputStream(file);
71
+ } catch (FileNotFoundException e) {
72
+ e.printStackTrace();
73
+ }
74
+ ```
75
+
76
+ FileInputStreamの使い方が間違っているのでしょうか。
77
+
30
78
  基本的なところがわかっていない可能性もありますが、ご教授いただけますと幸いです。
31
79
  それでは、よろしくお願い申し上げます。

2

タイトルをより具体的にしました

2021/06/26 22:53

投稿

KumaChan
KumaChan

スコア37

title CHANGED
@@ -1,1 +1,1 @@
1
- Android動画アップロードする方法がわかりません
1
+ Android動画アップロードで動画をバイト配列にする方法がわかりません
body CHANGED
@@ -2,7 +2,7 @@
2
2
  画像については以下のようにバイト配列に変換できたのですが、動画についてはその方法がわかりません。
3
3
 
4
4
  ```ここに言語を入力
5
- // 画像をバイト配列に(これの動画ようなものいのでしょうか)
5
+ // 画像をバイト配列に(動画の場合どうすればよいのでしょうか)
6
6
  ByteArrayOutputStream bos = new ByteArrayOutputStream();
7
7
  bmp.compress(Bitmap.CompressFormat.JPEG, 90, bos);
8
8
  // HTTP通信の準備

1

バイト配列の個所にコメントを入れました

2021/06/25 01:39

投稿

KumaChan
KumaChan

スコア37

title CHANGED
File without changes
body CHANGED
@@ -2,9 +2,9 @@
2
2
  画像については以下のようにバイト配列に変換できたのですが、動画についてはその方法がわかりません。
3
3
 
4
4
  ```ここに言語を入力
5
- // 画像をバイト配列に
5
+ // 画像をバイト配列に(これの動画版のようなものはないのでしょうか)
6
- **ByteArrayOutputStream bos = new ByteArrayOutputStream();
6
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
7
- bmp.compress(Bitmap.CompressFormat.JPEG, 90, bos);**
7
+ bmp.compress(Bitmap.CompressFormat.JPEG, 90, bos);
8
8
  // HTTP通信の準備
9
9
  con = (HttpURLConnection) url.openConnection();
10
10
  con.setConnectTimeout(5000);