ด้วยระดับ API ของ Android (23) เราจำเป็นต้องตรวจสอบสิทธิ์
https://developer.android.com/training/permissions/requesting.html
ฉันมีปัญหาเดียวกันกับคุณ แต่สิ่งต่อไปนี้ใช้ได้ผลสำหรับฉันและฉันสามารถดึงข้อมูลตำแหน่งได้สำเร็จ:
(1) ตรวจสอบให้แน่ใจว่าคุณมีสิทธิ์ของคุณอยู่ในรายการ Manifest:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
(2) ตรวจสอบให้แน่ใจว่าคุณขอสิทธิ์จากผู้ใช้:
if ( ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) {
ActivityCompat.requestPermissions( this, new String[] { android.Manifest.permission.ACCESS_COARSE_LOCATION },
LocationService.MY_PERMISSION_ACCESS_COURSE_LOCATION );
}
(3) ตรวจสอบให้แน่ใจว่าคุณใช้ ContextCompat เนื่องจากมีความเข้ากันได้กับระดับ API ที่เก่ากว่า
(4) ในบริการระบุตำแหน่งของคุณหรือคลาสที่เริ่มต้น LocationManager ของคุณและรับตำแหน่งที่รู้จักล่าสุดเราจำเป็นต้องตรวจสอบสิทธิ์:
if ( Build.VERSION.SDK_INT >= 23 &&
ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return ;
}
(5) วิธีนี้ใช้ได้ผลเฉพาะกับฉันหลังจากที่ฉันรวม @TargetApi (23) ไว้ที่ด้านบนของเมธอด initLocationService
(6) ฉันยังเพิ่มสิ่งนี้ในงานสร้างระดับประถมศึกษาของฉัน:
compile 'com.android.support:support-v4:23.0.1'
นี่คือ LocationService ของฉันสำหรับการอ้างอิง:
public class LocationService implements LocationListener {
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0;
private static final long MIN_TIME_BW_UPDATES = 0;
private final static boolean forceNetwork = false;
private static LocationService instance = null;
private LocationManager locationManager;
public Location location;
public double longitude;
public double latitude;
public static LocationService getLocationManager(Context context) {
if (instance == null) {
instance = new LocationService(context);
}
return instance;
}
private LocationService( Context context ) {
initLocationService(context);
LogService.log("LocationService created");
}
@TargetApi(23)
private void initLocationService(Context context) {
if ( Build.VERSION.SDK_INT >= 23 &&
ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return ;
}
try {
this.longitude = 0.0;
this.latitude = 0.0;
this.locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
this.isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
this.isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (forceNetwork) isGPSEnabled = false;
if (!isNetworkEnabled && !isGPSEnabled) {
this.locationServiceAvailable = false;
}
{
this.locationServiceAvailable = true;
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
if (locationManager != null) {
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
updateCoordinates();
}
}
if (isGPSEnabled) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
if (locationManager != null) {
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
updateCoordinates();
}
}
}
} catch (Exception ex) {
LogService.log( "Error creating location service: " + ex.getMessage() );
}
}
@Override
public void onLocationChanged(Location location) {
}
}
ฉันทดสอบกับอุปกรณ์ Android Lollipop แล้วเท่านั้น หวังว่านี่จะเหมาะกับคุณ