androidgoogle-mapspermissionscallcurrentlocation

when user allow the permission then the function which i put in permission grant in onRequestPermissionsResult didn't call


In this app i will ask for 2 permission in entire app 1) for current location 2) for call in both when app open dialog for permission and when user allow the permission then the task is to be done which is in permission granted in onRequestPermissionsResult

when user click for call then call dialog open and when user allow the permission for call then the don't make call and again user click for call and now app make a call

so my problem is when user allow for permission but didn't call the function which i put in permission granted in onRequestPermissionsResult

mapfragment

In this fragment i ask for current location permission and when user allow then call getlastlocation function but getlastlocation function didn't call after allow the permission

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
     rootview = inflater.inflate(R.layout.fragment_map, container, false);

    latlng.add(new LatLng(22.32371, 73.16409));
    latlng.add(new LatLng(22.32737, 73.17566));
    latlng.add(new LatLng(22.28, 73.1903696));
    latlng.add(new LatLng(22.334, 73.21853));
    latlng.add(new LatLng(22.40303, 73.22369));
    latlng.add(new LatLng(22.55148, 72.97035));

    SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);  //use SuppoprtMapFragment for using in fragment instead of activity  MapFragment = activity   SupportMapFragment = fragment
    mapFragment.getMapAsync(this);

    createGoogleApi();

    mbtn = rootview.findViewById(R.id.myLocationButton);
    mbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           get();
        }
    });

    return rootview;
}

@Override
public void onMapReady(GoogleMap googleMap)
{
    mgoogleMap = googleMap;
    mgoogleMap.setOnMarkerClickListener(this);
}

@Override
public void onStart() {
    super.onStart();
    // Call GoogleApiClient connection when starting the Activity
    googleApiClient.connect();
}

@Override
public void onResume() {
    super.onResume();
    if(bottomSheetFragment!=null) {
        bottomSheetFragment.dismiss();
    }
}

@Override
public void onStop() {
    super.onStop();

    // Disconnect GoogleApiClient when stopping Activity
    googleApiClient.disconnect();

}


private void createGoogleApi()
{
    Log.d(TAG, "createGoogleApi()");
    if ( googleApiClient == null )
    {
        googleApiClient = new GoogleApiClient.Builder( getContext() )
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener( this )
                .addApi(LocationServices.API)
                .build();
    }
}


// Check for permission to access Location
private boolean checkPermission() {
    Log.d(TAG, "checkPermission()");
    // Ask for permission if it wasn't granted yet
    return (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED );
}

// Asks for permission
private void askPermission() {
    Log.d(TAG, "askPermission()");


    ActivityCompat.requestPermissions(
            (Activity) MapFragment.super.getContext(),
            new String[] { Manifest.permission.ACCESS_FINE_LOCATION },
            REQ_PERMISSION
    );
}

// Verify user's response of the permission requested
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            getLastKnownLocation();
        } else {
            Toast.makeText(getContext(), "Permission DENIED", Toast.LENGTH_SHORT).show();
        }

}

// Start location Updates
private void startLocationUpdates(){
    Log.i(TAG, "startLocationUpdates()");
    locationRequest = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
            .setInterval(6000)
            .setFastestInterval(3000)
            .setSmallestDisplacement(5);
    if ( checkPermission() )
        LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this);
}

@Override
public void onLocationChanged(Location location) {
    Log.d(TAG, "onLocationChanged ["+location+"]");
    lastLocation = location;
    writeActualLocation(location);

}


@Override
public void onConnected(@Nullable Bundle bundle) {
    Log.i(TAG, "onConnected()");
    getLastKnownLocation();
}

// GoogleApiClient.ConnectionCallbacks suspended
@Override
public void onConnectionSuspended(int i) {
    Log.w(TAG, "onConnectionSuspended()");
}

// GoogleApiClient.OnConnectionFailedListener fail
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    Log.w(TAG, "onConnectionFailed()");
}

// Get last known location
private void getLastKnownLocation() {
    Log.d(TAG, "getLastKnownLocation()");
    if ( checkPermission() ) {
        lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
        if ( lastLocation != null ) {
            Log.i(TAG, "LasKnown location. " +
                    "Long: " + lastLocation.getLongitude() +
                    " | Lat: " + lastLocation.getLatitude());
            writeLastLocation();
            startLocationUpdates();
        }
        else {
            Log.w(TAG, "No location retrieved yet");
            startLocationUpdates();
        }
    }
    else askPermission();
}

private void writeActualLocation(Location location)
{
    lastLocation = location;
    showmarker(latlng,location);
}

private void writeLastLocation() {
    writeActualLocation(lastLocation);
}

bottomsheet

for call permission

call.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
            makephonecall();
        }
    });


 private void makephonecall()
{
    if (ActivityCompat.checkSelfPermission(getContext(),
            Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(BottomSheetFragment.super.getActivity(),
                new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CALL);
    }
    else
    {
        startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+phone)));
    }

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == REQUEST_CALL) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            makephonecall();
        } else {
            Toast.makeText(getContext(), "Permission DENIED", Toast.LENGTH_SHORT).show();
        }
    }
}

manifest

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-feature android:name="android.hardware.location.gps" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

<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=".WebActivity"></activity>

    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="AIzaSyBmswwdOetUmvikH__n9zT9SftkgahJLyo" />
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

so please give some suggestion problem is that user allow permission but didn't do task which is to be done when user allow the permission


Solution

  • you are using

    ActivityCompat.requestPermissions(
                (Activity) MapFragment.super.getContext(),
                new String[] { Manifest.permission.ACCESS_FINE_LOCATION },
                REQ_PERMISSION
        );
    

    instead of

    requestPermissions(new String[] { Manifest.permission.ACCESS_FINE_LOCATION },REQ_PERMISSION );
    

    When you used the ActivityCompat.requestPermissions it will give you the result in the Activity that is containing the Fragment. So instead you should use requestPermissions directly to get the callback in fragment.