- package com.example.nemophila;
-
- import androidx.annotation.NonNull;
- import androidx.core.content.res.ResourcesCompat;
- import androidx.fragment.app.FragmentActivity;
-
- import androidx.activity.result.ActivityResultLauncher;
- import androidx.activity.result.contract.ActivityResultContracts;
- import androidx.appcompat.app.AppCompatActivity;
- import androidx.core.app.ActivityCompat;
- import androidx.core.content.ContextCompat;
-
- import android.content.res.Resources;
- import android.graphics.drawable.Drawable;
- import android.os.Bundle;
- import android.widget.Toast;
- import android.annotation.SuppressLint;
- import android.net.Uri;
- import android.os.Bundle;
- import android.content.pm.PackageManager;
- import android.location.Location;
- import android.location.LocationListener;
- import android.location.LocationManager;
- import android.widget.TextView;
- import android.content.Intent;
- import android.provider.Settings;
- import android.util.Log;
- import android.widget.Toast;
- import android.Manifest;
-
- import com.google.android.gms.maps.CameraUpdate;
- import com.google.android.gms.maps.CameraUpdateFactory;
- import com.google.android.gms.maps.GoogleMap;
- import com.google.android.gms.maps.OnMapReadyCallback;
- import com.google.android.gms.maps.SupportMapFragment;
- import com.google.android.gms.maps.model.BitmapDescriptor;
- import com.google.android.gms.maps.model.BitmapDescriptorFactory;
- import com.google.android.gms.maps.model.GroundOverlay;
- import com.google.android.gms.maps.model.GroundOverlayOptions;
- import com.google.android.gms.maps.model.LatLng;
- import com.google.android.gms.maps.model.LatLngBounds;
- import com.google.android.gms.maps.model.Marker;
- import com.google.android.gms.maps.model.MarkerOptions;
- import com.example.nemophila.databinding.ActivityMainBinding;
-
- import java.util.Locale;
-
- public class MainActivity extends FragmentActivity implements OnMapReadyCallback,LocationListener {
-
- private GoogleMap mMap;
- private ActivityMainBinding binding;
- private LatLng latlng;
- private LatLng latlng2;
- private LatLng location;
-
- LocationManager locationManager;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- //現在地アイコンの取得
- Drawable ic_current = ResourcesCompat.getDrawable(getResources(),R.drawable.ic_current_location,null);
-
- binding = ActivityMainBinding.inflate(getLayoutInflater());
- setContentView(binding.getRoot());
-
- if (ActivityCompat.checkSelfPermission(this,
- Manifest.permission.ACCESS_FINE_LOCATION)
- != PackageManager.PERMISSION_GRANTED) {
-
- requestPermissionLauncher.launch(
- Manifest.permission.ACCESS_FINE_LOCATION);
- }
- else{
- locationStart();
- }
-
- // Obtain the SupportMapFragment and get notified when the map is ready to be used.
- SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
- .findFragmentById(R.id.map);
- assert mapFragment != null;
- mapFragment.getMapAsync(this);
- }
-
- /*
- ここからマップに関する操作
- */
- /*
- @Override
- public void onMapReady(GoogleMap googleMap) {
- mMap = googleMap;
-
- //マーカー(ピン)の登録・表示方法(例)
- LatLng ntlab = new LatLng(34.73, 135.26);
- mMap.addMarker(new MarkerOptions().position(ntlab).title("Marker in ntlab"));
- mMap.moveCamera(CameraUpdateFactory.newLatLng(ntlab));
-
- //カメラの移動処理方法(例)
- CameraUpdate cUpdate = CameraUpdateFactory.newLatLngZoom(
- new LatLng(34.73, 135.26), 15);
- mMap.moveCamera(cUpdate);
- }
- */
-
- @Override
- public void onMapReady(GoogleMap googleMap) {
- mMap = googleMap;
-
- //研究室周辺の緯度経度
- double latitude = 34.7308032;
- double longitude = 135.2630272;
-
- latlng = new LatLng(latitude, longitude);
- //テスト用
- latlng2 = new LatLng(34.74, 135.26);
-
- // 標準のマーカー
- setMarker(latitude, longitude);
-
- // アイコン画像をマーカーに設定
- //画像関連がわかっていないのでパス
- //setIcon(latitude, longitude);
-
- // camera 移動 (初期画面)
- //mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, 15));
-
- /*
- //多分使わない
- // タップした時のリスナーをセット
- mMap.setOnMapClickListener(tapLocation -> {
- // map(ピン以外)をtapされた位置の緯度経度
- latlng = new LatLng(tapLocation.latitude, tapLocation.longitude);
- String str = String.format(Locale.US, "%f, %f", tapLocation.latitude, tapLocation.longitude);
- mMap.addMarker(new MarkerOptions().position(location).title(str));
- mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, 18));
- });
- */
-
- //長押し時にその座標にピンを立てる
- //長押し時にその座標を保存し、投稿画面に移り、投稿完了時にはピンを立てる
- mMap.setOnMapLongClickListener(longpushLocation -> {
- //長押しされた位置の緯度経度を取得
- LatLng newlocation = new LatLng(longpushLocation.latitude, longpushLocation.longitude);
-
- //投稿処理
-
-
- //投稿が完了した場合
- //ピンをその座標に立て、緯度経度をタイトルに設定
- //タイトルはnullにする予定
- mMap.addMarker(new MarkerOptions().position(newlocation).title(""+longpushLocation.latitude+" :"+ longpushLocation.longitude));
- //ピンを立てた位置にカメラを移動
- mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(newlocation, 18));
- });
-
- // ピンをクリックした場合
- mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
- @Override
- public boolean onMarkerClick(Marker marker) {
- //店の詳細と投稿一覧を表示
- //ここでshopActivityを呼び出す
-
- //下からクリックしたことを通知
- Toast.makeText(MainActivity.this, "ピンクリック", Toast.LENGTH_SHORT).show();
- return false;
- }
- });
-
- }
-
- //ピンの設定
- private void setMarker(double latitude, double longitude){
-
- MarkerOptions markerOptions = new MarkerOptions();
- MarkerOptions markerOptions2 = new MarkerOptions();
-
- markerOptions.position(latlng);
- markerOptions.title("ntlab");
- mMap.addMarker(markerOptions);
-
- //テスト用
- markerOptions2.position(latlng2);
- markerOptions2.title(null);
- mMap.addMarker(markerOptions2);
-
- // ズーム
- zoomMap(latitude, longitude);
-
- }
-
- private void zoomMap(double latitude, double longitude){
- // 表示する東西南北の緯度経度を設定
- double south = latitude * (1-0.00005);
- double west = longitude * (1-0.00005);
- double north = latitude * (1+0.00005);
- double east = longitude * (1+0.00005);
-
- // LatLngBounds (LatLng southwest, LatLng northeast)
- //左下、右上
- LatLngBounds bounds = LatLngBounds.builder()
- .include(new LatLng(south , west))
- .include(new LatLng(north, east))
- .build();
-
- int width = getResources().getDisplayMetrics().widthPixels;
- int height = getResources().getDisplayMetrics().heightPixels;
-
- // static CameraUpdate.newLatLngBounds(LatLngBounds bounds, int width, int height, int padding)
- mMap.moveCamera(CameraUpdateFactory.
- newLatLngBounds(bounds, width, height, 0));
-
- //ズーム処理
- mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, 15f));
- }
-
- private void setIcon(double latitude, double longitude){
- Drawable ic_current = ResourcesCompat.getDrawable(getResources(),R.drawable.icon,null);
-
- //LatLng current_location = new LatLng(34.73080,135.2630272);
- LatLng current_location = new LatLng(latitude,longitude);
- //mMap.addMarker(new MarkerOptions().position(current_location).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon)));
- // マップに貼り付ける BitmapDescriptor生成
- // 画像は自分で適当に用意します。ここではmipmapから持ってきましたが
- BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.drawable.icon);
- //Drawable ic_current = ResourcesCompat.getDrawable(getResources(),R.drawable.ic_current_location,null);
-
- // 貼り付設定
- GroundOverlayOptions overlayOptions = new GroundOverlayOptions();
- overlayOptions.image(descriptor);
-
- // public GroundOverlayOptions anchor (float u, float v)
- // (0,0):top-left, (0,1):bottom-left, (1,0):top-right, (1,1):bottom-right
- overlayOptions.anchor(0.5f, 0.5f);
-
- // 張り付け画像の大きさ メートル単位
- // public GroundOverlayOptions position(LatLng location, float width, float height)
- overlayOptions.position(current_location, 300f, 300f);
-
- // マップに貼り付け・アルファを設定
- GroundOverlay overlay = mMap.addGroundOverlay(overlayOptions);
- // ズーム
- zoomMap(latitude, longitude);
-
- // 透明度
- assert overlay != null;
- overlay.setTransparency(0.0F);
- }
-
- private final ActivityResultLauncher<String>
- requestPermissionLauncher = registerForActivityResult(
- new ActivityResultContracts.RequestPermission(),
- isGranted -> {
- if (isGranted) {
- locationStart();
- }
- else {
- Toast toast = Toast.makeText(this,
- "これ以上なにもできません", Toast.LENGTH_SHORT);
- toast.show();
- }
- });
-
- @SuppressLint("MissingPermission")
- private void locationStart(){
- Log.d("debug","locationStart()");
-
- // LocationManager インスタンス生成
- locationManager =
- (LocationManager) getSystemService(LOCATION_SERVICE);
-
- if (locationManager != null && locationManager.isProviderEnabled(
- LocationManager.GPS_PROVIDER)) {
-
- Log.d("debug", "location manager Enabled");
- } else {
- // GPSを設定するように促す
- Intent settingsIntent =
- new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
- startActivity(settingsIntent);
- Log.d("debug", "not gpsEnable, startActivity");
- }
-
- if (ContextCompat.checkSelfPermission(this,
- Manifest.permission.ACCESS_FINE_LOCATION) !=
- PackageManager.PERMISSION_GRANTED) {
- ActivityCompat.requestPermissions(this,
- new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, 1000);
-
- Log.d("debug", "checkSelfPermission false");
- return;
- }
-
- //解決しているはずの問題にエラーが起きています
- //実行はできます
- locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
- 1000, 50, this);
-
- }
-
- @Override
- public void onLocationChanged(Location location) {
- //現在地が変更されるたびに現在地アイコンを移動
-
- /*
- テスト用。現在座標を画面に表示
- */
- // 緯度の表示
- TextView textView1 = findViewById(R.id.text_view1);
- String str1 = "Latitude:"+location.getLatitude();
- textView1.setText(str1);
-
- // 経度の表示
- TextView textView2 = findViewById(R.id.text_view2);
- String str2 = "Longitude:"+location.getLongitude();
- textView2.setText(str2);
-
- setIcon(location.getLatitude(),location.getLongitude());
- }
-
- @Override
- public void onProviderEnabled(String provider) {
-
- }
-
- @Override
- public void onProviderDisabled(String provider) {
-
- }
- }