Newer
Older
NemophilaClient / app / src / main / java / com / example / nemophila / MainActivity.java
  1. package com.example.nemophila;
  2.  
  3. import androidx.annotation.NonNull;
  4. import androidx.core.content.res.ResourcesCompat;
  5. import androidx.fragment.app.FragmentActivity;
  6.  
  7. import androidx.activity.result.ActivityResultLauncher;
  8. import androidx.activity.result.contract.ActivityResultContracts;
  9. import androidx.appcompat.app.AppCompatActivity;
  10. import androidx.core.app.ActivityCompat;
  11. import androidx.core.content.ContextCompat;
  12.  
  13. import android.content.res.Resources;
  14. import android.graphics.drawable.Drawable;
  15. import android.os.Bundle;
  16. import android.widget.Toast;
  17. import android.annotation.SuppressLint;
  18. import android.net.Uri;
  19. import android.os.Bundle;
  20. import android.content.pm.PackageManager;
  21. import android.location.Location;
  22. import android.location.LocationListener;
  23. import android.location.LocationManager;
  24. import android.widget.TextView;
  25. import android.content.Intent;
  26. import android.provider.Settings;
  27. import android.util.Log;
  28. import android.widget.Toast;
  29. import android.Manifest;
  30.  
  31. import com.google.android.gms.maps.CameraUpdate;
  32. import com.google.android.gms.maps.CameraUpdateFactory;
  33. import com.google.android.gms.maps.GoogleMap;
  34. import com.google.android.gms.maps.OnMapReadyCallback;
  35. import com.google.android.gms.maps.SupportMapFragment;
  36. import com.google.android.gms.maps.model.BitmapDescriptor;
  37. import com.google.android.gms.maps.model.BitmapDescriptorFactory;
  38. import com.google.android.gms.maps.model.GroundOverlay;
  39. import com.google.android.gms.maps.model.GroundOverlayOptions;
  40. import com.google.android.gms.maps.model.LatLng;
  41. import com.google.android.gms.maps.model.LatLngBounds;
  42. import com.google.android.gms.maps.model.Marker;
  43. import com.google.android.gms.maps.model.MarkerOptions;
  44. import com.example.nemophila.databinding.ActivityMainBinding;
  45.  
  46. import java.util.Locale;
  47.  
  48. public class MainActivity extends FragmentActivity implements OnMapReadyCallback,LocationListener {
  49.  
  50. private GoogleMap mMap;
  51. private ActivityMainBinding binding;
  52. private LatLng latlng;
  53. private LatLng latlng2;
  54. private LatLng location;
  55.  
  56. LocationManager locationManager;
  57.  
  58. @Override
  59. protected void onCreate(Bundle savedInstanceState) {
  60. super.onCreate(savedInstanceState);
  61. //現在地アイコンの取得
  62. Drawable ic_current = ResourcesCompat.getDrawable(getResources(),R.drawable.ic_current_location,null);
  63.  
  64. binding = ActivityMainBinding.inflate(getLayoutInflater());
  65. setContentView(binding.getRoot());
  66.  
  67. if (ActivityCompat.checkSelfPermission(this,
  68. Manifest.permission.ACCESS_FINE_LOCATION)
  69. != PackageManager.PERMISSION_GRANTED) {
  70.  
  71. requestPermissionLauncher.launch(
  72. Manifest.permission.ACCESS_FINE_LOCATION);
  73. }
  74. else{
  75. locationStart();
  76. }
  77.  
  78. // Obtain the SupportMapFragment and get notified when the map is ready to be used.
  79. SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
  80. .findFragmentById(R.id.map);
  81. assert mapFragment != null;
  82. mapFragment.getMapAsync(this);
  83. }
  84.  
  85. /*
  86. ここからマップに関する操作
  87. */
  88. /*
  89. @Override
  90. public void onMapReady(GoogleMap googleMap) {
  91. mMap = googleMap;
  92.  
  93. //マーカー(ピン)の登録・表示方法(例)
  94. LatLng ntlab = new LatLng(34.73, 135.26);
  95. mMap.addMarker(new MarkerOptions().position(ntlab).title("Marker in ntlab"));
  96. mMap.moveCamera(CameraUpdateFactory.newLatLng(ntlab));
  97.  
  98. //カメラの移動処理方法(例)
  99. CameraUpdate cUpdate = CameraUpdateFactory.newLatLngZoom(
  100. new LatLng(34.73, 135.26), 15);
  101. mMap.moveCamera(cUpdate);
  102. }
  103. */
  104.  
  105. @Override
  106. public void onMapReady(GoogleMap googleMap) {
  107. mMap = googleMap;
  108.  
  109. //研究室周辺の緯度経度
  110. double latitude = 34.7308032;
  111. double longitude = 135.2630272;
  112.  
  113. latlng = new LatLng(latitude, longitude);
  114. //テスト用
  115. latlng2 = new LatLng(34.74, 135.26);
  116.  
  117. // 標準のマーカー
  118. setMarker(latitude, longitude);
  119.  
  120. // アイコン画像をマーカーに設定
  121. //画像関連がわかっていないのでパス
  122. //setIcon(latitude, longitude);
  123.  
  124. // camera 移動 (初期画面)
  125. //mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, 15));
  126.  
  127. /*
  128. //多分使わない
  129. // タップした時のリスナーをセット
  130. mMap.setOnMapClickListener(tapLocation -> {
  131. // map(ピン以外)をtapされた位置の緯度経度
  132. latlng = new LatLng(tapLocation.latitude, tapLocation.longitude);
  133. String str = String.format(Locale.US, "%f, %f", tapLocation.latitude, tapLocation.longitude);
  134. mMap.addMarker(new MarkerOptions().position(location).title(str));
  135. mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, 18));
  136. });
  137. */
  138.  
  139. //長押し時にその座標にピンを立てる
  140. //長押し時にその座標を保存し、投稿画面に移り、投稿完了時にはピンを立てる
  141. mMap.setOnMapLongClickListener(longpushLocation -> {
  142. //長押しされた位置の緯度経度を取得
  143. LatLng newlocation = new LatLng(longpushLocation.latitude, longpushLocation.longitude);
  144.  
  145. //投稿処理
  146.  
  147.  
  148. //投稿が完了した場合
  149. //ピンをその座標に立て、緯度経度をタイトルに設定
  150. //タイトルはnullにする予定
  151. mMap.addMarker(new MarkerOptions().position(newlocation).title(""+longpushLocation.latitude+" :"+ longpushLocation.longitude));
  152. //ピンを立てた位置にカメラを移動
  153. mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(newlocation, 18));
  154. });
  155.  
  156. // ピンをクリックした場合
  157. mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
  158. @Override
  159. public boolean onMarkerClick(Marker marker) {
  160. //店の詳細と投稿一覧を表示
  161. //ここでshopActivityを呼び出す
  162.  
  163. //下からクリックしたことを通知
  164. Toast.makeText(MainActivity.this, "ピンクリック", Toast.LENGTH_SHORT).show();
  165. return false;
  166. }
  167. });
  168.  
  169. }
  170.  
  171. //ピンの設定
  172. private void setMarker(double latitude, double longitude){
  173.  
  174. MarkerOptions markerOptions = new MarkerOptions();
  175. MarkerOptions markerOptions2 = new MarkerOptions();
  176.  
  177. markerOptions.position(latlng);
  178. markerOptions.title("ntlab");
  179. mMap.addMarker(markerOptions);
  180.  
  181. //テスト用
  182. markerOptions2.position(latlng2);
  183. markerOptions2.title(null);
  184. mMap.addMarker(markerOptions2);
  185.  
  186. // ズーム
  187. zoomMap(latitude, longitude);
  188.  
  189. }
  190.  
  191. private void zoomMap(double latitude, double longitude){
  192. // 表示する東西南北の緯度経度を設定
  193. double south = latitude * (1-0.00005);
  194. double west = longitude * (1-0.00005);
  195. double north = latitude * (1+0.00005);
  196. double east = longitude * (1+0.00005);
  197.  
  198. // LatLngBounds (LatLng southwest, LatLng northeast)
  199. //左下、右上
  200. LatLngBounds bounds = LatLngBounds.builder()
  201. .include(new LatLng(south , west))
  202. .include(new LatLng(north, east))
  203. .build();
  204.  
  205. int width = getResources().getDisplayMetrics().widthPixels;
  206. int height = getResources().getDisplayMetrics().heightPixels;
  207.  
  208. // static CameraUpdate.newLatLngBounds(LatLngBounds bounds, int width, int height, int padding)
  209. mMap.moveCamera(CameraUpdateFactory.
  210. newLatLngBounds(bounds, width, height, 0));
  211.  
  212. //ズーム処理
  213. mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, 15f));
  214. }
  215.  
  216. private void setIcon(double latitude, double longitude){
  217. Drawable ic_current = ResourcesCompat.getDrawable(getResources(),R.drawable.icon,null);
  218.  
  219. //LatLng current_location = new LatLng(34.73080,135.2630272);
  220. LatLng current_location = new LatLng(latitude,longitude);
  221. //mMap.addMarker(new MarkerOptions().position(current_location).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon)));
  222. // マップに貼り付ける BitmapDescriptor生成
  223. // 画像は自分で適当に用意します。ここではmipmapから持ってきましたが
  224. BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.drawable.icon);
  225. //Drawable ic_current = ResourcesCompat.getDrawable(getResources(),R.drawable.ic_current_location,null);
  226.  
  227. // 貼り付設定
  228. GroundOverlayOptions overlayOptions = new GroundOverlayOptions();
  229. overlayOptions.image(descriptor);
  230.  
  231. // public GroundOverlayOptions anchor (float u, float v)
  232. // (0,0):top-left, (0,1):bottom-left, (1,0):top-right, (1,1):bottom-right
  233. overlayOptions.anchor(0.5f, 0.5f);
  234.  
  235. // 張り付け画像の大きさ メートル単位
  236. // public GroundOverlayOptions position(LatLng location, float width, float height)
  237. overlayOptions.position(current_location, 300f, 300f);
  238.  
  239. // マップに貼り付け・アルファを設定
  240. GroundOverlay overlay = mMap.addGroundOverlay(overlayOptions);
  241. // ズーム
  242. zoomMap(latitude, longitude);
  243.  
  244. // 透明度
  245. assert overlay != null;
  246. overlay.setTransparency(0.0F);
  247. }
  248.  
  249. private final ActivityResultLauncher<String>
  250. requestPermissionLauncher = registerForActivityResult(
  251. new ActivityResultContracts.RequestPermission(),
  252. isGranted -> {
  253. if (isGranted) {
  254. locationStart();
  255. }
  256. else {
  257. Toast toast = Toast.makeText(this,
  258. "これ以上なにもできません", Toast.LENGTH_SHORT);
  259. toast.show();
  260. }
  261. });
  262.  
  263. @SuppressLint("MissingPermission")
  264. private void locationStart(){
  265. Log.d("debug","locationStart()");
  266.  
  267. // LocationManager インスタンス生成
  268. locationManager =
  269. (LocationManager) getSystemService(LOCATION_SERVICE);
  270.  
  271. if (locationManager != null && locationManager.isProviderEnabled(
  272. LocationManager.GPS_PROVIDER)) {
  273.  
  274. Log.d("debug", "location manager Enabled");
  275. } else {
  276. // GPSを設定するように促す
  277. Intent settingsIntent =
  278. new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
  279. startActivity(settingsIntent);
  280. Log.d("debug", "not gpsEnable, startActivity");
  281. }
  282.  
  283. if (ContextCompat.checkSelfPermission(this,
  284. Manifest.permission.ACCESS_FINE_LOCATION) !=
  285. PackageManager.PERMISSION_GRANTED) {
  286. ActivityCompat.requestPermissions(this,
  287. new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, 1000);
  288.  
  289. Log.d("debug", "checkSelfPermission false");
  290. return;
  291. }
  292.  
  293. //解決しているはずの問題にエラーが起きています
  294. //実行はできます
  295. locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
  296. 1000, 50, this);
  297.  
  298. }
  299.  
  300. @Override
  301. public void onLocationChanged(Location location) {
  302. //現在地が変更されるたびに現在地アイコンを移動
  303.  
  304. /*
  305. テスト用。現在座標を画面に表示
  306. */
  307. // 緯度の表示
  308. TextView textView1 = findViewById(R.id.text_view1);
  309. String str1 = "Latitude:"+location.getLatitude();
  310. textView1.setText(str1);
  311.  
  312. // 経度の表示
  313. TextView textView2 = findViewById(R.id.text_view2);
  314. String str2 = "Longitude:"+location.getLongitude();
  315. textView2.setText(str2);
  316.  
  317. setIcon(location.getLatitude(),location.getLongitude());
  318. }
  319.  
  320. @Override
  321. public void onProviderEnabled(String provider) {
  322.  
  323. }
  324.  
  325. @Override
  326. public void onProviderDisabled(String provider) {
  327.  
  328. }
  329. }