Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.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
Java 为什么我的地图在收到位置许可后没有初始化?_Java_Android_Android Permissions_Fusedlocationproviderclient - Fatal编程技术网

Java 为什么我的地图在收到位置许可后没有初始化?

Java 为什么我的地图在收到位置许可后没有初始化?,java,android,android-permissions,fusedlocationproviderclient,Java,Android,Android Permissions,Fusedlocationproviderclient,用户第一次打开my MapsActivity时,会要求他们获得位置权限。然后它应该在不同的位置用标记启动我的卫星视图地图。但是,它会打开一个没有“我的标记”的通用谷歌地图,但是如果您退出该活动,并在授予位置权限后再次启动该活动,则效果良好。我很确定它没有调用initMap()函数,因此也没有调用onMapReady(GoogleMap,GoogleMap)函数,在该函数中,地图被设置为卫星视图并添加了标记。我很确定在我的onRequestPermissionsResult()函数中,它没有在应该

用户第一次打开my MapsActivity时,会要求他们获得位置权限。然后它应该在不同的位置用标记启动我的卫星视图地图。但是,它会打开一个没有“我的标记”的通用谷歌地图,但是如果您退出该活动,并在授予位置权限后再次启动该活动,则效果良好。我很确定它没有调用initMap()函数,因此也没有调用onMapReady(GoogleMap,GoogleMap)函数,在该函数中,地图被设置为卫星视图并添加了标记。我很确定在我的onRequestPermissionsResult()函数中,它没有在应该调用initMap()函数的时候调用它,但我不知道为什么

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleMap.OnMapClickListener {

    @Override
    public void onMapReady(GoogleMap googleMap) {
        Toast.makeText(this, "Map is Ready", Toast.LENGTH_SHORT).show();
        mMap = googleMap;
        Log.d("map", mMap.toString());
        mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        if (mLocationPermissionsGranted) {
            Log.d("map", "location permission granted");
            getDeviceLocation();
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,
                    Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            mMap.setMyLocationEnabled(true);
            mMap.getUiSettings().setMyLocationButtonEnabled(false);
            this.mMap.setOnMapClickListener(this);
            init();
        }
        myReference = FirebaseDatabase.getInstance().getReference().child("garbageSpots");
        myReference.addValueEventListener(stateValueEventListener4 = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot children : dataSnapshot.getChildren()) {
                    LatLng coords = new LatLng(Double.parseDouble(children.child("lat").getValue().toString()), Double.parseDouble(children.child("long").getValue().toString()));
                    MarkerOptions options = new MarkerOptions().title(children.getKey()).position(coords);
                    mMap.addMarker(options);
                    Log.d("map", "marker for loop");
                }
                Log.d("map", "end of mk for loop");
                myReference.removeEventListener(stateValueEventListener4);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                System.out.println("The read failed: " + databaseError.getCode());
            }
        });
        mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                Intent i = new Intent(MapsActivity.this, InfoWindowActivity.class);
                LatLng latLng = marker.getPosition();
                String title = marker.getTitle();
                i.putExtra("location", latLng);
                i.putExtra("title", title);
                startActivity(i);
                return false;
            }
        });
    }

    private static final String FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
    private static final String COURSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
    private static final int LOCATION_PERMISSION_REQUEST_CODE = 1234;
    private static final float DEFAULT_ZOOM = 15f;
    private DatabaseReference myReference;
    private ValueEventListener stateValueEventListener4;
    private EditText mSearchText;
    private ImageView mGps;
    private Boolean mLocationPermissionsGranted = false;
    private GoogleMap mMap;
    private FusedLocationProviderClient mFusedLocationProviderClient;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        mSearchText = findViewById(R.id.inputSearch);
        mGps = findViewById(R.id.ic_gps);
        Log.d("map", "onCreate");
        getLocationPermission();
    }

    private void init(){
        Log.d("map", "init now");
        mSearchText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
                if(actionId == EditorInfo.IME_ACTION_SEARCH
                        || actionId == EditorInfo.IME_ACTION_DONE
                        || keyEvent.getAction() == KeyEvent.ACTION_DOWN
                        || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER){
                    Log.d("map", "actionId in init");
                    geoLocate();
                }

                return false;
            }
        });
        mGps.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getDeviceLocation();
            }
        });

        hideSoftKeyboard();
    }

    private void geoLocate() {
        Log.d("map", "geoLocate start");
        String searchString = mSearchText.getText().toString();
        Geocoder geocoder = new Geocoder(MapsActivity.this);
        List<Address> list = new ArrayList<>();
        try{
            list = geocoder.getFromLocationName(searchString, 1);
        }catch (IOException e){
            Log.d("map", "geoLocate catch error");
        }

        if(list.size() > 0){
            Address address = list.get(0);
            moveCamera(new LatLng(address.getLatitude(), address.getLongitude()), DEFAULT_ZOOM,
                    address.getAddressLine(0));
        }
    }

    private void getDeviceLocation(){
        mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(MapsActivity.this);
        try{
            if(mLocationPermissionsGranted){
                final Task location = mFusedLocationProviderClient.getLastLocation();
                Log.d("map", "GDL mLPG");
                location.addOnCompleteListener(new OnCompleteListener() {
                    @Override
                    public void onComplete(@NonNull Task task) {
                        Log.d("map", "GDL on complete");
                        if(task.isSuccessful()){
                            Log.d("map", "GDL on success");
                            Location currentLocation = (Location)task.getResult();
                            moveCamera(new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude()),
                                    DEFAULT_ZOOM,
                                    "My Location");
                        }else{
                            Toast.makeText(MapsActivity.this, "unable to get current location", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
            }
        }catch (SecurityException e){
            Log.d("map", "getDeviceLocation catch error");
        }
    }

    private void moveCamera(LatLng latLng, float zoom, String title){
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, zoom));
        if(!title.equals("My Location")){
            MarkerOptions options = new MarkerOptions()
                    .position(latLng)
                    .title(title);
            mMap.addMarker(options);
        }
        hideSoftKeyboard();
    }

    private void initMap(){
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        Log.d("map", mapFragment + " initMap");
        mapFragment.getMapAsync(MapsActivity.this);
    }

    private void getLocationPermission(){
        Log.d("map", "getLocationPermission start");
        String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.ACCESS_COARSE_LOCATION};
        if(ContextCompat.checkSelfPermission(this.getApplicationContext(),
                FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
            Log.d("map", "first if");
            if(ContextCompat.checkSelfPermission(this.getApplicationContext(),
                    COURSE_LOCATION) == PackageManager.PERMISSION_GRANTED){
                Log.d("map", "second if");
                mLocationPermissionsGranted = true;
                Log.d("map", mLocationPermissionsGranted.toString() + " mLPG string");
                initMap();
            }else{
                ActivityCompat.requestPermissions(this,
                        permissions,
                        LOCATION_PERMISSION_REQUEST_CODE);
                Log.d("map", "second if failed");
            }
        }else{
            Log.d("map", "first if failed");
            ActivityCompat.requestPermissions(this,
                    permissions,
                    LOCATION_PERMISSION_REQUEST_CODE);
            Log.d("map", String.valueOf(LOCATION_PERMISSION_REQUEST_CODE) + " location permission request code");
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        Log.d("map", "ORPR");
        mLocationPermissionsGranted = false;
        switch (requestCode) {
            case LOCATION_PERMISSION_REQUEST_CODE: {
                if (grantResults.length > 0) {
                    for(int i = 0; i < grantResults.length; i++){
                        if(grantResults[i] != PackageManager.PERMISSION_GRANTED){
                            Log.d("map", String.valueOf(grantResults[i]));
                            Log.d("map", "false permission");
                            mLocationPermissionsGranted = false;
                            return;
                        }
                    }
                    mLocationPermissionsGranted = true;
                    Log.d("map", "initORPR");
                    initMap();
                }
            }
        }
    }
}
这是我的舱单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.garbagespots.garbagespotsapp">
    
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <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=".InstructionsActivity"
            android:parentActivityName=".HomePage"
            android:screenOrientation="portrait"/>
        <activity
            android:name=".PictureActivity"
            android:parentActivityName=".InfoWindowActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name=".ReportActivity"
            android:parentActivityName=".InfoWindowActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name=".CleanedUpActivity"
            android:parentActivityName=".InfoWindowActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name=".InfoWindowActivity"
            android:parentActivityName=".MapsActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name=".SignupActivity"
            android:parentActivityName=".WelcomeActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name=".WelcomeActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SpotAdderActivity"
            android:label="@string/title_activity_spot_adder"
            android:parentActivityName=".MapsActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name=".ProfileActivity"
            android:label="@string/title_activity_profile"
            android:parentActivityName=".HomePage"
            android:screenOrientation="portrait" />
        <activity
            android:name=".HomePage"
            android:screenOrientation="portrait" />
        <activity
            android:name=".LoginActivity"
            android:label="@string/title_activity_login"
            android:parentActivityName=".WelcomeActivity"
            android:screenOrientation="portrait" />
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="AIzaSyAF4V4wLa4OioU_taKsh59BfTVs1i02vgA" />

        <activity
            android:name=".MapsActivity"
            android:label="@string/title_activity_maps"
            android:parentActivityName=".InstructionsActivity"
            android:screenOrientation="portrait"/>
    </application>
</manifest>

添加了:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />


在我的清单中,它起作用了

请显示您的清单我添加了它@SarahKhanManifest.permission.ACCESS\u rough\u位置,它在您的清单中的什么位置?标签用于JS API v3。从你的问题中删除这个。今后,请确保您的问题使用适当的标签。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />