我正在开发我的第一个Android应用程序,它应该获得Android设备的纬度和经度,并通过Web服务将其发送到模板文档。
我遵循了从http://developer.android.com/training/location/retrieve-current.html获取位置的指南。
这是我的.java类的代码:
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationServices;
public class GetLocation extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
private GoogleApiClient mGoogleApiClient;
EditText textLat;
EditText textLong;
EditText lat;
EditText lon;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.get_location);
textLat = (EditText) findViewById(R.id.latitude);
textLong = (EditText) findViewById(R.id.longitude);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
private boolean isGPSEnabled() {
LocationManager cm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
return cm.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
@Override
public void onConnected(Bundle bundle) {
Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLastLocation != null) {
lat.setText(String.valueOf(mLastLocation.getLatitude()));
lon.setText(String.valueOf(mLastLocation.getLongitude()));
}
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
public void onButtonClick(View v){
if(v.getId() == R.id.getGpsLocation){
if(!isGPSEnabled()){
new AlertDialog.Builder(this)
.setMessage("Please activate your GPS Location!")
.setCancelable(false)
.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(i);
}
})
.setNegativeButton("Cancel", null)
.show();
} else {
textLat.setText(String.valueOf(lat));
textLong.setText(String.valueOf(lon));
}
}
}
}
我没有收到任何错误,但是当我点击应该获得坐标的按钮时,我在两个视图中都得到'null'文字。
我还包含了互联网权限,访问精细和粗略位置。
提前致谢!
答案 0 :(得分:1)
您需要定义LocationListener。
public class MainActivity extends Activity implements LocationListener{
protected LocationManager locationManager;
protected LocationListener locationListener;
protected Context context;
TextView txtLat;
String lat;
String provider;
protected String latitude,longitude;
protected boolean gps_enabled,network_enabled;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtLat = (TextView) findViewById(R.id.textview1);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
@Override
public void onLocationChanged(Location location) {
txtLat = (TextView) findViewById(R.id.textview1);
txtLat.setText("Latitude:" + location.getLatitude() + ", Longitude:" + location.getLongitude());
}
@Override
public void onProviderDisabled(String provider) {
Log.d("Latitude","disable");
}
@Override
public void onProviderEnabled(String provider) {
Log.d("Latitude","enable");
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
Log.d("Latitude","status");
}
}
需要提供以下许可:
ACCESS_COARSE_LOCATION :我们在Android应用中使用网络位置提供商时使用。
ACCESS_FINE_LOCATION :它为两家提供商提供权限。
INTERNET :必须使用网络提供商。
答案 1 :(得分:1)
首先,把它放在gradle文件中
compile 'com.google.android.gms:play-services:9.0.2'
然后实现必要的接口
public class MainActivity extends BaseActivitiy implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener
声明实例
private GoogleApiClient mGoogleApiClient;
private Location mLocation;
private LocationManager locationManager;
private LocationRequest mLocationRequest;
将其放在onCreate()
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
最后,重写必要的方法
@Override
public void onConnected(Bundle bundle) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
} startLocationUpdates();
mLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if(mLocation == null){
startLocationUpdates();
}
if (mLocation != null) {
double latitude = mLocation.getLatitude();
double longitude = mLocation.getLongitude();
} else {
// Toast.makeText(this, "Location not Detected", Toast.LENGTH_SHORT).show();
}
}
protected void startLocationUpdates() {
// Create the location request
mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(UPDATE_INTERVAL)
.setFastestInterval(FASTEST_INTERVAL);
// Request location updates
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
mLocationRequest, this);
Log.d("reque", "--->>>>");
}
@Override
public void onConnectionSuspended(int i) {
Log.i(TAG, "Connection Suspended");
mGoogleApiClient.connect();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.i(TAG, "Connection failed. Error: " + connectionResult.getErrorCode());
}
@Override
public void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
public void onStop() {
super.onStop();
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
@Override
public void onLocationChanged(Location location) {
}
在运行应用之前,不要忘记在设备中启动GPS。
答案 2 :(得分:0)
答案 3 :(得分:0)
您可以使用这些简单的步骤获取当前位置
在清单文件中授予互联网权限
在清单中授予 ACCESS_FINE_LOCATION 权限
public class MainActivity extends AppCompatActivity implements LocationListener {
Button button_location,button_locationinMap,Last_locationUser,shareBtn;
TextView textView_location;
LocationManager locationManager;
ProgressBar SHOW_PROGRESS;
String address;
double latitude;
double longitude;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button_location=findViewById(R.id.button_location);
textView_location=findViewById(R.id.text_location);
Last_locationUser=findViewById(R.id.Last_locationUser);
SHOW_PROGRESS=findViewById(R.id.SHOW_PROGRESS);
shareBtn=findViewById(R.id.shareBtn);
button_locationinMap=findViewById(R.id.button_locationinMap);
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(MainActivity.this,new String[]
{
Manifest.permission.ACCESS_FINE_LOCATION},100);
}
shareBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String uri = "https://www.google.com/maps/?q="+latitude+","+longitude ;
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, uri);
startActivity(Intent.createChooser(sharingIntent, "Share in..."));
}
});
button_location.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getLocation();
SHOW_PROGRESS.setVisibility(View.VISIBLE);
}
});
button_locationinMap.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(MainActivity.this,GoogleMapActivity.class);
startActivity(intent);
}
});
Last_locationUser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(MainActivity.this,UserLastLocation.class);
startActivity(intent);
}
});
}
@SuppressLint("MissingPermission")
private void getLocation() {
try
{
locationManager=(LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,50000,0,MainActivity.this);
}
catch (Exception e)
{
e.printStackTrace();
}
}
@Override
public void onLocationChanged(@NonNull Location location) {
Toast.makeText(this, ""+location.getLatitude()+","+location.getLongitude(), Toast.LENGTH_SHORT).show();
try {
Geocoder geocoder=new Geocoder(MainActivity.this, Locale.getDefault());
List<Address> addresses=geocoder.getFromLocation(location.getLatitude(),location.getLongitude(),1);
address=addresses.get(0).getAddressLine(0);
textView_location.setText(address);
SHOW_PROGRESS.setVisibility(View.GONE);
textView_location.setVisibility(View.VISIBLE);
latitude=location.getLatitude();
longitude=location.getLongitude();
}
catch (Exception e)
{
e.printStackTrace();
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(@NonNull String provider) {
}
@Override
public void onProviderDisabled(@NonNull String provider) {
}
}