i have write an android program to show google map and show the current location.
Here is a part of the code , please see:
public class MapActivity extends FragmentActivity implements OnMapReadyCallback,LocationListener {
public static GoogleMap googleMap;
private Geocoder geoCoder;
private ArrayAdapter<String> adapter;
private List<Address> addressSearchList;
private static final int MY_PERMISSION_ACCESS_COARSE_LOCATION = 11;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view_map);
Log.d("Test","success0");
geoCoder = new Geocoder(MapActivity.this, Locale.getDefault());
TextView textView = (TextView) findViewById(R.id.textTitle);
textView.setText(getString(R.string.TITLE_REPORT));
ListView list = (ListView) findViewById(R.id.listView1);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
list.setAdapter(adapter);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
String addressName = adapter.getItem(position);
adapter.clear();
adapter.notifyDataSetChanged();
ListView list = (ListView) findViewById(R.id.listView1);
list.setVisibility(View.GONE);
if ((addressSearchList == null) || (position >= addressSearchList.size()))
return;
Address address = addressSearchList.get(position);
googleMap.clear();
LatLng latLng = new LatLng(address.getLatitude(), address.getLongitude());
Marker marker = googleMap.addMarker(new MarkerOptions()
.position(latLng)
.title(addressName)
.snippet(getString(R.string.CONFIRM))
);
marker.showInfoWindow();
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
}
});
ImageView imageView = (ImageView) findViewById(R.id.btnCancelSearch);
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
EditText editText = (EditText) findViewById(R.id.editText1);
editText.setText("");
editText.clearFocus();
adapter.clear();
adapter.notifyDataSetChanged();
ListView list = (ListView) findViewById(R.id.listView1);
list.setVisibility(View.GONE);
try {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
} catch (Exception e) {
}
}
});
EditText editText = (EditText) findViewById(R.id.editText1);
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if ((actionId == EditorInfo.IME_ACTION_SEARCH) && (v.getText().length() > 0)) {
//Log.d("TEST", "onEditorAction");
try {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
} catch (Exception e) {
}
String locationName = v.getText().toString();
new SearchAddressTask(locationName).execute();
}
return false;
}
});
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (status != ConnectionResult.SUCCESS) {
//Log.d("TEST", "not success");
} else {
SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentByTag("mapClinic");
Log.d("Test","success1");
fm.getMapAsync(MapActivity.this);
Log.d("Test","success2");
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
///final GoogleMap googleMaps=googleMap;
// Your code heregoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
//Log.d("TEST", clinic.getLongitude() + ":" + clinic.getLatitude());
double latitude = 22.309994;
double longitude = 114.226036;
LatLng latLng = new LatLng(latitude, longitude);
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
googleMap.animateCamera(CameraUpdateFactory.zoomTo(10));
googleMap.getUiSettings().setRotateGesturesEnabled(false);
googleMap.getUiSettings().setCompassEnabled(false);
final GoogleMap googleMapF= googleMap;
googleMap.setOnMapClickListener(new OnMapClickListener() {
@Override
public void onMapClick(LatLng point) {
googleMapF.clear();
String address = "";
//Geocoder geoCoder = new Geocoder(MapActivity.this, Locale.getDefault());
try {
List<Address> addresses = geoCoder.getFromLocation(point.latitude, point.longitude, 1);
if (addresses.size() <= 0)
return;
//address = addresses.get(0).getAddressLine(1);
StringBuilder longAddress = new StringBuilder();
String temp;
int j = 0;
while ((temp = addresses.get(0).getAddressLine(j++)) != null) {
longAddress.append(temp);
}
address = longAddress.toString();
//EditText editText = (EditText) findViewById(R.id.textLocation);
//editText.setText(addresses.get(0).getFeatureName());
/*addresses = geoCoder.getFromLocationName("�Ի��{", 10);
if (addresses.size() <= 0) {
Log.d("TEST", "can't find");
}
else {
Log.d("TEST", addresses.toString());
Log.d("TEST", "find it");
}*/
} catch (IOException e) {
//e.printStackTrace();
}
Marker marker = googleMapF.addMarker(new MarkerOptions()
.position(point)
.title(address)
.snippet(getString(R.string.CONFIRM))
);
marker.showInfoWindow();
}
});
googleMap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
LatLng point = marker.getPosition();
Intent intent = new Intent();
intent.putExtra("LatLng", point);
setResult(RESULT_OK, intent);
finish();
}
});
if( ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) {
Log.d("Test","success3...1");
ActivityCompat.requestPermissions( this, new String[] { android.Manifest.permission.ACCESS_COARSE_LOCATION },
MY_PERMISSION_ACCESS_COARSE_LOCATION );
}
String provider = locationManager.getBestProvider(criteria, false);
if (provider == null){
Log.d("Test","success3");
return;
}
Log.d("Test","success3.1");
Location location = getLastKnownLocationS();
//Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
Log.d("Test", "success4");
if (location != null) {
Log.d("Test", "success5");
LatLng point = new LatLng(location.getLatitude(), location.getLongitude());
Log.d("Test", "success6");
googleMap.clear();
String address = "";
Geocoder geoCoder = new Geocoder(MapActivity.this, Locale.getDefault());
Log.d("Test", "success7");
try {
List<Address> addresses = geoCoder.getFromLocation(point.latitude, point.longitude, 1);
if (addresses.size() <= 0)
return;
//address = addresses.get(0).getAddressLine(1);
StringBuilder longAddress = new StringBuilder();
String temp;
int j = 0;
Log.d("Test", "success8");
while ((temp = addresses.get(0).getAddressLine(j++)) != null) {
longAddress.append(temp);
}
address = longAddress.toString();
Log.d("Test", "success9");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("Test", "success10");
Marker marker = googleMap.addMarker(new MarkerOptions()
.position(point)
.title(address)
.snippet(getString(R.string.CONFIRM))
);
Log.d("Test", "success11");
marker.showInfoWindow();
Log.d("Test", "success12.1");
onLocationChanged(location);
Log.d("Test", "success12.2");
}
locationManager.requestLocationUpdates(provider, 10000, 0, this);
Log.d("Test", "success13");
}
private Location getLastKnownLocationS() {
LocationManager mLocationManager = (LocationManager)getApplicationContext().getSystemService(LOCATION_SERVICE);
List<String> providers = mLocationManager.getProviders(true);
Location bestLocation = null;
if( ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) {
Log.d("Test","success3...2");
ActivityCompat.requestPermissions( this, new String[] { android.Manifest.permission.ACCESS_COARSE_LOCATION },
MY_PERMISSION_ACCESS_COARSE_LOCATION );
}
for (String provider : providers) {
Location l = mLocationManager.getLastKnownLocation(provider);
if (l == null) {
continue;
}
if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
// Found best last known location: %s", l);
bestLocation = l;
}
}
Log.d("Test","success_async");
return bestLocation;
}
Updated the error parts,please help ,thanks for reminds the error occur in onLocationChanged method, Thanks.
Updated the error parts,please help ,thanks for reminds the error occur in onLocationChanged method, Thanks
@Override
public void onLocationChanged(Location location) {
double latitude = location.getLatitude();
double longitude = location.getLongitude();
LatLng latLng = new LatLng(latitude, longitude);
Log.d("Test","onLocationChange");
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));
}
And debugger have below error:
10-26 08:47:12.493 26361-26361/com.afcd.redtidesystem E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.afcd.redtidesystem, PID: 26361
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.moveCamera(com.google.android.gms.maps.CameraUpdate)' on a null object reference
at com.afcd.redtidesystem.MapActivity.onLocationChanged(MapActivity.java:379)
at com.afcd.redtidesystem.MapActivity.onMapReady(MapActivity.java:329)
at com.google.android.gms.maps.zzaj.zza(Unknown Source)
at com.google.android.gms.maps.internal.zzaq.onTransact(Unknown Source)
at android.os.Binder.transact(Binder.java:499)
at gl.b(:com.google.android.gms.DynamiteModulesB@11518470:20)
at com.google.android.gms.maps.internal.bf.a(:com.google.android.gms.DynamiteModulesB@11518470:5)
at com.google.maps.api.android.lib6.impl.bc.run(:com.google.android.gms.DynamiteModulesB@11518470:5)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)