回答編集履歴

3

idが違った

2018/12/15 06:57

投稿

keicha_hrs
keicha_hrs

スコア6768

test CHANGED
@@ -182,7 +182,7 @@
182
182
 
183
183
  (SupportMapFragment) getSupportFragmentManager()
184
184
 
185
- .findFragmentById(R.id.map);
185
+ .findFragmentById(R.id.map_goo_fra);
186
186
 
187
187
  mapFragment.getMapAsync(this);
188
188
 

2

追記

2018/12/15 06:57

投稿

keicha_hrs
keicha_hrs

スコア6768

test CHANGED
@@ -35,3 +35,253 @@
35
35
 
36
36
 
37
37
  なお、許可しない選択をしたときもやはり同様に落ちると思われますので、その処理は別途必要になるでしょう。
38
+
39
+
40
+
41
+ ---
42
+
43
+
44
+
45
+ (15:13追記)
46
+
47
+ 許可を得られる前にonMapReady()が走ってしまったりとか、いろいろ前後関係がありそうですね。処理を組み直さないと解決できなさそうなので、ざっと書いてみましたが、こんな感じで解決できるでしょうか?
48
+
49
+
50
+
51
+ ```java
52
+
53
+ public class MapsActivity extends FragmentActivity
54
+
55
+ implements OnMapReadyCallback, LocationListener,
56
+
57
+ CompoundButton.OnCheckedChangeListener {
58
+
59
+ private GoogleMap mMap;
60
+
61
+ private LatLng latlong;
62
+
63
+ private static Location location1;
64
+
65
+ LocationManager locationmanager1;
66
+
67
+ private static final int LOCATION_CODE = 100;
68
+
69
+ private static final String[] LOCATION_PERMISSION = {
70
+
71
+ Manifest.permission.ACCESS_FINE_LOCATION,
72
+
73
+ Manifest.permission.ACCESS_COARSE_LOCATION
74
+
75
+ };
76
+
77
+ private static final int GRANTED = PackageManager.PERMISSION_GRANTED;
78
+
79
+
80
+
81
+ @Override
82
+
83
+ protected void onCreate(Bundle savedInstanceState) {
84
+
85
+ super.onCreate(savedInstanceState);
86
+
87
+ // ここではまだsetContentView()は呼ばない
88
+
89
+
90
+
91
+ locationmanager1 = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
92
+
93
+
94
+
95
+ if (ActivityCompat.checkSelfPermission(this, LOCATION_PERMISSION[0]) != GRANTED &&
96
+
97
+ ActivityCompat.checkSelfPermission(this, LOCATION_PERMISSION[1]) != GRANTED) {
98
+
99
+ // ↓「アクセスを許可しますか?」
100
+
101
+ requestPermissions(LOCATION_PERMISSION, LOCATION_CODE);
102
+
103
+ } else {
104
+
105
+ startLocation();
106
+
107
+ }
108
+
109
+ }
110
+
111
+
112
+
113
+
114
+
115
+ @Override
116
+
117
+ public void onMapReady(GoogleMap googleMap) {
118
+
119
+
120
+
121
+ mMap = googleMap;
122
+
123
+ double lat = location1.getLatitude();
124
+
125
+ double lon = location1.getLongitude();
126
+
127
+ latlong = new LatLng(lat, lon);
128
+
129
+ mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latlong, 19));
130
+
131
+ locationmanager1.removeUpdates(this);
132
+
133
+ }
134
+
135
+
136
+
137
+ // アクセス許可のダイアログで操作を行ったときに呼ばれるメソッド
138
+
139
+ @Override
140
+
141
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
142
+
143
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
144
+
145
+ if (requestCode == LOCATION_CODE) {
146
+
147
+ if (grantResults[0] == GRANTED) {
148
+
149
+ startLocation();
150
+
151
+ } else {
152
+
153
+ // 拒否されたのならアプリ続行不可能
154
+
155
+ finish();
156
+
157
+ }
158
+
159
+ }
160
+
161
+
162
+
163
+ }
164
+
165
+
166
+
167
+ void startLocation() {
168
+
169
+ if (ActivityCompat.checkSelfPermission(this, LOCATION_PERMISSION[0]) == GRANTED ||
170
+
171
+ ActivityCompat.checkSelfPermission(this, LOCATION_PERMISSION[1]) == GRANTED) {
172
+
173
+
174
+
175
+ // 許可を得られたことを確認できた段階で初めてsetContentView()を呼ぶ
176
+
177
+ // onMapReady()が走るのはこれ以後になる
178
+
179
+ setContentView(R.layout.activity_maps);
180
+
181
+ SupportMapFragment mapFragment =
182
+
183
+ (SupportMapFragment) getSupportFragmentManager()
184
+
185
+ .findFragmentById(R.id.map);
186
+
187
+ mapFragment.getMapAsync(this);
188
+
189
+
190
+
191
+ Criteria criteria = new Criteria();
192
+
193
+ criteria.setAccuracy(Criteria.ACCURACY_FINE);
194
+
195
+ String provider = locationmanager1.getBestProvider(criteria, true);
196
+
197
+ locationmanager1.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
198
+
199
+ location1 = locationmanager1.getLastKnownLocation(provider);
200
+
201
+ }
202
+
203
+ }
204
+
205
+
206
+
207
+ @Override
208
+
209
+ protected void onDestroy() {
210
+
211
+ super.onDestroy();
212
+
213
+ locationmanager1.removeUpdates(this);
214
+
215
+ }
216
+
217
+
218
+
219
+ @Override
220
+
221
+ public void onStatusChanged(String provider, int status, Bundle extras) {
222
+
223
+ switch (status) {
224
+
225
+ case LocationProvider.AVAILABLE:
226
+
227
+ Log.d("debug", "LocationProvider.AVAILABLE");
228
+
229
+ break;
230
+
231
+ case LocationProvider.OUT_OF_SERVICE:
232
+
233
+ Log.d("debug", "LocationProvider.OUT_OF_SERVICE");
234
+
235
+ break;
236
+
237
+ case LocationProvider.TEMPORARILY_UNAVAILABLE:
238
+
239
+ Log.d("debug", "LocationProvider.TEMPORARILY_UNAVAILABLE");
240
+
241
+ break;
242
+
243
+ }
244
+
245
+ }
246
+
247
+
248
+
249
+ @Override
250
+
251
+ public void onLocationChanged(Location location) {
252
+
253
+ //LatLng curr = new LatLng(location.getLatitude(), location.getLongitude());
254
+
255
+ //mMap.animateCamera(CameraUpdateFactory.newLatLng(curr));
256
+
257
+ }
258
+
259
+
260
+
261
+ @Override
262
+
263
+ public void onProviderEnabled(String s) {
264
+
265
+ }
266
+
267
+
268
+
269
+ @Override
270
+
271
+ public void onProviderDisabled(String s) {
272
+
273
+ }
274
+
275
+
276
+
277
+ @Override
278
+
279
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
280
+
281
+
282
+
283
+ }
284
+
285
+ }
286
+
287
+ ```

1

修正

2018/12/15 06:13

投稿

keicha_hrs
keicha_hrs

スコア6768

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
 
32
32
 
33
- この構造だと、初回の起動でrequestPermissions()側に進むと、許可を得たら即座にreturnによって抜けてしまい、location1がnullのまま設定されることなく進行してしまうので、NullPointerExceptionになるのは必然と思われます。returnを除去することで解決できませんか?
33
+ この構造だと、初回の起動でrequestPermissions()側に進むと、許可を得たら即座にreturnによって抜けてしまい、location1が設定されることなく進行してしまうので、NullPointerExceptionになるのは必然と思われます。returnを除去することで解決できませんか?
34
34
 
35
35
 
36
36