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) {
}
}