Android 如何获取位置?
我正在使用android studio 3.1.4学习开发android应用程序。 我正在尝试获取gps定位。但是,它不起作用。我已经试了一整天了。求你了,谁来帮我渡过难关 我的gpsTracker课程Android 如何获取位置?,android,location,android-gps,Android,Location,Android Gps,我正在使用android studio 3.1.4学习开发android应用程序。 我正在尝试获取gps定位。但是,它不起作用。我已经试了一整天了。求你了,谁来帮我渡过难关 我的gpsTracker课程 package com.prios.pratice; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.locati
package com.prios.pratice;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
public class GPSTracker extends AppCompatActivity implements LocationListener
{
private LocationManager locationManager;
private String provider, LOCATION = "N/A";
public String getLocation() {
// Get the location manager
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Define the criteria how to select the locatioin provider -> use
// default
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, false);
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 "Cannot Get Location!";
}
Location location = locationManager.getLastKnownLocation(provider);
// Initialize the location fields
if (location != null) {
System.out.println("Provider " + provider + " has been selected.");
onLocationChanged(location);
} else {
Log.d("Location:", "Not Available");
}
return LOCATION;
// Boolean isGPSenabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
/* Request updates at startup */
@Override
protected void onResume() {
super.onResume();
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;
}
locationManager.requestLocationUpdates(provider, 400, 1, this);
}
/* Remove the locationlistener updates when Activity is paused */
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location) {
int lat = (int) (location.getLatitude());
int lng = (int) (location.getLongitude());
Log.d("Location:", lat+", "+lng);
LOCATION = lat + ", " + lng;
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
Toast.makeText(this, "Enabled new provider " + provider,
Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider) {
Toast.makeText(this, "Disabled provider " + provider,
Toast.LENGTH_SHORT).show();
}
}
还有我的清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.prios.practice">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
您还需要在运行时(从代码)请求权限 在使用与位置相关的内容之前,请调用方法
ActivityCompat#requestPermissions()
阅读文档了解更多详细信息:为什么
GPSTracker
继承AppCompatActivity
?你不能在你的片段中这样使用它
GPSTracker
必须是单例或类似的,但与活动无关
你读过这本指南吗?
它终于起作用了
package com.prios.practice;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
public class GPSTracker extends AppCompatActivity implements LocationListener {
private LocationManager locationManager;
private String provider, LOCATION="N/A";
private Context context;
private Activity activity;
public GPSTracker(Activity activity) {
this.context = activity.getApplicationContext();
this.activity = activity;
// Get the location manager
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
// Define the criteria how to select the locatioin provider -> use
// default
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, false);
if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.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.
ActivityCompat.requestPermissions(this.activity,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
99);
}
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
Log.e("TAG", "GPS is on");
LOCATION = location.getLatitude()+","+location.getLongitude();
}
else{
//This is what you need:
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
}
}
public String getLocation() {
return LOCATION;
}
@Override
public void onLocationChanged(Location location) {
if(location!=null) {
locationManager.removeUpdates(this);
Double lat = (Double) (location.getLatitude());
Double lng = (Double) (location.getLongitude());
LOCATION = lat.toString() + "," + lng.toString();
// Toast.makeText(this, LOCATION, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// Toast.makeText(this, "Enabled new provider " + provider,
// Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider) {
// Toast.makeText(this, "Disabled provider " + provider,
// Toast.LENGTH_SHORT).show();
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 99: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// location-related task you need to do.
if (ContextCompat.checkSelfPermission(context,
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
//Request location updates:
locationManager.requestLocationUpdates(provider, 400, 1, this);
}
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
}
}
}
请发布您的日志,以及您在哪里使用了getLocation方法,哪项是主要活动?我从HomeFragement文件调用getLocation。我应该发布它的代码吗?我还编辑了我的问题,忘记撤销了一些东西。请也发帖子检查我的答案
package com.prios.practice;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
public class GPSTracker extends AppCompatActivity implements LocationListener {
private LocationManager locationManager;
private String provider, LOCATION="N/A";
private Context context;
private Activity activity;
public GPSTracker(Activity activity) {
this.context = activity.getApplicationContext();
this.activity = activity;
// Get the location manager
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
// Define the criteria how to select the locatioin provider -> use
// default
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, false);
if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.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.
ActivityCompat.requestPermissions(this.activity,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
99);
}
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
Log.e("TAG", "GPS is on");
LOCATION = location.getLatitude()+","+location.getLongitude();
}
else{
//This is what you need:
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
}
}
public String getLocation() {
return LOCATION;
}
@Override
public void onLocationChanged(Location location) {
if(location!=null) {
locationManager.removeUpdates(this);
Double lat = (Double) (location.getLatitude());
Double lng = (Double) (location.getLongitude());
LOCATION = lat.toString() + "," + lng.toString();
// Toast.makeText(this, LOCATION, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// Toast.makeText(this, "Enabled new provider " + provider,
// Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider) {
// Toast.makeText(this, "Disabled provider " + provider,
// Toast.LENGTH_SHORT).show();
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 99: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// location-related task you need to do.
if (ContextCompat.checkSelfPermission(context,
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
//Request location updates:
locationManager.requestLocationUpdates(provider, 400, 1, this);
}
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
}
}
}