質問編集履歴

2

----------

2018/06/03 14:39

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- AndroidエミュレーターのSDカードパスがJavaプログラムで取得できない
1
+ ----------
test CHANGED
@@ -1,129 +1 @@
1
- Windows版Android Studio 3.1に付属する標準のIntel x86 Oreoエミュレーターイメージを使ってプログラムのテストをしています。
2
-
3
- ![配置イメージ](5eadfcfb2bdbff2dc27516bec1b647f9.png)
4
-
5
- エミュレーター内のファイルマネージャーの「SDCARD」に保存したの任意の画像ファイルを取得するプログラムを作ってはみたのですが、ウェブ上のサンプルコードを元に、「getExternalFilesDirs()」や「new FileReader("/proc/mounts")」、「new File("/system/etc/vold.fstab")」を用いてパスを取得しようとしても、そのパスが返されないため、この画像を取得することができませんでした。
6
-
7
-
8
-
9
- また、好ましい方法ではありませんが、「mnt/sdcard/test.txt」とパスを決め打ちしてファイル保存してみたところ、SDカードではなく、端末本体の領域に保存されました。
10
-
11
-
12
-
13
- ```java
14
-
15
- HashSet<String> paths = new HashSet<>();
16
-
17
-
18
-
19
- Set<String> map = new HashSet<>();
20
-
21
- String sd = java.lang.System.getenv("EXTERNAL_STORAGE");
22
-
23
- if (sd != null && sd.isEmpty() == false) map.add(sd);
24
-
25
- sd = System.getenv("SECONDARY_STORAGE");
26
-
27
- if (sd != null && sd.isEmpty() == false) map.add(sd);
28
-
29
-
30
-
31
- File f = Environment.getExternalStorageDirectory();
32
-
33
- if (f != null) map.add(f.getAbsolutePath());
34
-
35
-
36
-
37
- Scanner scanner = null;
38
-
39
- try {
40
-
41
- File mf = new File("/proc/mounts");
42
-
43
- if (mf.exists()) {
44
-
45
- scanner = new Scanner(mf);
46
-
47
- while (scanner.hasNext()) {
48
-
49
- String line = scanner.nextLine();
50
-
51
- if (line.startsWith("/dev/block/vold/")) {
52
-
53
- String[] lineElements = line.split(" ");
54
-
55
- String element = lineElements[1];
56
-
57
- if (!element.equals("/mnt/sdcard")) map.add(element);
58
-
59
- }
60
-
61
- }
62
-
63
- }
64
-
65
- } catch (Exception ex) {
66
-
67
- ex.printStackTrace();
68
-
69
- } finally {
70
-
71
- try { if (scanner != null) scanner.close(); } catch (Exception ex) {}
72
-
73
- scanner = null;
74
-
75
- }
76
-
77
-
78
-
79
- try {
80
-
81
- File vf = new File("/system/etc/vold.fstab");
82
-
83
- if (vf.exists()) {
84
-
85
- scanner = new Scanner(vf);
86
-
87
- while (scanner.hasNext()) {
88
-
89
- String line = scanner.nextLine();
90
-
91
- if (line.startsWith("dev_mount")) {
92
-
93
- String[] lineElements = line.split(" ");
94
-
95
- String element = lineElements[2];
96
-
97
-
98
-
99
- if (element.contains(":")) element = element.substring(0, element.indexOf(":"));
100
-
101
- if (!element.equals("/mnt/sdcard")) map.add(element);
102
-
103
- }
104
-
105
- }
106
-
107
- }
108
-
109
- } catch (Exception ex) {
110
-
111
- ex.printStackTrace();
112
-
113
- } finally {
114
-
115
- try { if (scanner != null) scanner.close(); } catch (Exception ex) {}
116
-
117
- scanner = null;
118
-
119
- }
120
-
121
- ```
122
-
123
-
124
-
125
- もちろん、デバッグアプリのマニフェストに「WRITE_EXTERNAL_STORAGE」属性を追加し、システム設定より「STORAGE」パーミションを有効にして、アプリからの外部ストレージへのアクセスができるようにしています。
126
-
127
-
128
-
129
- 具体的な解決策やシステムの設定方法をご存じでしたらお教えください。
1
+ ------------------------------

1

パスの直うちに関する追記

2018/06/03 14:39

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -3,6 +3,10 @@
3
3
  ![配置イメージ](5eadfcfb2bdbff2dc27516bec1b647f9.png)
4
4
 
5
5
  エミュレーター内のファイルマネージャーの「SDCARD」に保存したの任意の画像ファイルを取得するプログラムを作ってはみたのですが、ウェブ上のサンプルコードを元に、「getExternalFilesDirs()」や「new FileReader("/proc/mounts")」、「new File("/system/etc/vold.fstab")」を用いてパスを取得しようとしても、そのパスが返されないため、この画像を取得することができませんでした。
6
+
7
+
8
+
9
+ また、好ましい方法ではありませんが、「mnt/sdcard/test.txt」とパスを決め打ちしてファイル保存してみたところ、SDカードではなく、端末本体の領域に保存されました。
6
10
 
7
11
 
8
12