Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 首次启动应用程序时无法获取位置_Android_Google Maps_Fusedlocationproviderapi - Fatal编程技术网

Android 首次启动应用程序时无法获取位置

Android 首次启动应用程序时无法获取位置,android,google-maps,fusedlocationproviderapi,Android,Google Maps,Fusedlocationproviderapi,这是我的密码: public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { private GoogleMap mMap; FusedLocationProviderClient mFusedLocationClient; LocationRequest mLocationRequest; LocationCallback mLocationCallback

这是我的密码:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    FusedLocationProviderClient mFusedLocationClient;
    LocationRequest mLocationRequest;
    LocationCallback mLocationCallback;

    private void startLocationUpdates() {

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(MapsActivity.this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION},99);

            return;
        }

        mFusedLocationClient.requestLocationUpdates(mLocationRequest,
                mLocationCallback,
                null );
    }

    public void getLastLocationFun() {


        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "Not permitted", Toast.LENGTH_SHORT).show();
        }
        mFusedLocationClient.getLastLocation().addOnCompleteListener(new OnCompleteListener<Location>() {
            @Override
            public void onComplete(@NonNull Task<Location> task) {
                if (task.isSuccessful()) {
                    Location location = task.getResult();
                    mMap.clear();
                    LatLng currentLocation = new LatLng(location.getLatitude(), location.getLongitude());
                    mMap.addMarker(new MarkerOptions().position(currentLocation).title("Current Location"));
                    mMap.moveCamera(CameraUpdateFactory.newLatLng(currentLocation));
                    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(currentLocation,18.0f));
                }
            }
        });

    }

    public void reqP(){
        ActivityCompat.requestPermissions(MapsActivity.this,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION},
                99);
    }

    public boolean checkP(){
        return (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);
    }

    private void stopLocationUpdates() {
        mFusedLocationClient.removeLocationUpdates(mLocationCallback);
    }

    protected void createLocationRequest() {
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(2000);
        mLocationRequest.setFastestInterval(2000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        if(!checkP()){
            reqP();
        }

        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

        createLocationRequest();

        mLocationCallback = new LocationCallback(){
            @Override
            public void onLocationResult(LocationResult locationResult) {
                super.onLocationResult(locationResult);
                if(locationResult == null){
                    return;
                }
                for (Location location : locationResult.getLocations()) {

                    // Add a marker on current location and move the camera

                    mMap.clear();
                    LatLng currentLocation = new LatLng(location.getLatitude(), location.getLongitude());
                    mMap.addMarker(new MarkerOptions().position(currentLocation).title("Current Location"));
                    mMap.moveCamera(CameraUpdateFactory.newLatLng(currentLocation));
                    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(currentLocation,18.0f));
                }
            }
        };
        getLastLocationFun();
        startLocationUpdates();
        ProcessLifecycleOwner.get().getLifecycle().addObserver(new AppLifecycleListener());

    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        stopLocationUpdates();
    }

    public class AppLifecycleListener implements LifecycleObserver {

        @OnLifecycleEvent(Lifecycle.Event.ON_START)
        public void onMoveToForeground() {
            // app moved to foreground
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        public void onMoveToBackground() {
            Toast.makeText(MapsActivity.this, "LifeCycleEvent", Toast.LENGTH_SHORT).show();
            startService(new Intent(MapsActivity.this, MyService.class));
        }
    }
}
公共类MapsActivity扩展了FragmentActivity在MapreadyCallback上的实现{
私有谷歌地图;
FusedLocationProviderClient mFusedLocationClient;
位置请求mLocationRequest;
LocationCallback MLLocationCallback;
private void startLocationUpdates(){
if(ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u已授予和&ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS\u LOCATION)!=PackageManager.permission\u已授予){
ActivityCompat.requestPermissions(MapsActivity.this,新字符串[]{Manifest.permission.ACCESS\u rough\u LOCATION,Manifest.permission.ACCESS\u FINE\u LOCATION},99);
返回;
}
mFusedLocationClient.RequestLocationUpdate(MLLocationRequest,
mLocationCallback,
无效);
}
public void getLastLocationFun(){
if(ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u已授予和&ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS\u LOCATION)!=PackageManager.permission\u已授予){
Toast.makeText(此“不允许”,Toast.LENGTH_SHORT).show();
}
mFusedLocationClient.getLastLocation().addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
位置=task.getResult();
mMap.clear();
LatLng currentLocation=新LatLng(location.getLatitude(),location.getLength());
mMap.addMarker(新的MarkerOptions().position(当前位置).title(当前位置));
mMap.moveCamera(CameraUpdateFactory.newLatLng(当前位置));
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(当前位置,18.0f));
}
}
});
}
公共要求{
ActivityCompat.requestPermissions(MapsActivity.this,
新字符串[]{Manifest.permission.ACCESS\u FINE\u LOCATION,Manifest.permission.ACCESS\u rough\u LOCATION},
99);
}
公共布尔checkP(){
return(ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS\u FINE\u LOCATION)==PackageManager.permission\u provided);
}
私有void stopLocationUpdates(){
mFusedLocationClient.RemovelocationUpdate(mlLocationCallback);
}
受保护的void createLocationRequest(){
mlLocationRequest=新位置请求();
mLocationRequest.setInterval(2000);
mLocationRequest.setFastestInterval(2000);
mLocationRequest.setPriority(位置请求.优先级高精度);
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_映射);
//获取SupportMapFragment,并在地图准备好使用时收到通知。
SupportMapFragment mapFragment=(SupportMapFragment)getSupportFragmentManager()
.findFragmentById(R.id.map);
getMapAsync(这个);
如果(!checkP()){
reqP();
}
mFusedLocationClient=LocationServices.getFusedLocationProviderClient(此);
createLocationRequest();
mlLocationCallback=新位置Callback(){
@凌驾
public void onLocationResult(LocationResult LocationResult){
super.onLocationResult(定位结果);
if(locationResult==null){
返回;
}
对于(位置:locationResult.getLocations()){
//在当前位置添加标记并移动相机
mMap.clear();
LatLng currentLocation=新LatLng(location.getLatitude(),location.getLength());
mMap.addMarker(新的MarkerOptions().position(当前位置).title(当前位置));
mMap.moveCamera(CameraUpdateFactory.newLatLng(当前位置));
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(当前位置,18.0f));
}
}
};
getLastLocationFun();
startLocationUpdates();
ProcessLifecycleOwner.get().getLifecycle().addObserver(新的AppLifecycleListener());
}
@凌驾
4月1日公开作废(谷歌地图谷歌地图){
mMap=谷歌地图;
}
@凌驾
受保护的空onDestroy(){
super.ondestory();
stopLocationUpdates();
}
公共类AppLifecycleListener实现LifecycleObserver{
@onLiFeCycleeEvent(Lifecycle.Event.ON_START)
MoveToForeground上的公共无效(){
//应用程序移动到前台
}
@onLiFeCycleeEvent(Lifecycle.Event.ON_STOP)
MoveToBackground上的公共无效(){
Toast.makeText(MapsActivity.this,“LifeCycleEvent”,Toast.LENGTH_SHORT.show();
startService(新意图(MapsActivity.this、MyService.class));
}
}
}
在这里,我尝试使用FusedLocationListener获取位置,并在该位置显示一个标记。
但谷歌地图仅在应用程序首次启动时显示默认的世界地图。
随后,当我从最近的应用程序中删除应用程序并再次启动应用程序时,它工作正常。

在我第一次启动时,它是否无法获取位置?

您需要将其添加到您的类中。所以,当用户授予位置权限时,您可以获取位置

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (requestCode != 0) {
    mFusedLocationClient.requestLocationUpdates(mLocationRequest,
            mLocationCallback,
            null );
}
@覆盖
public void onRequestPermissionsResult(int-requestCode,@NonNull-String[]permissions,@NonNull-int[]grantResults){
super.onRequestPermissionsResult(请求代码、权限、授权结果);
列表片段=getSupportFragmentManag