当用户允许权限时,我在 onRequestPermissionsResult 中放入权限授予的函数没有调用

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

在这个应用程序中,我将在整个应用程序中请求 2 个权限 1) 当前位置 2) 在应用程序打开对话框获取权限和用户允许权限时调用,然后任务将完成在 onRequestPermissionsResult

中授予的权限

当用户点击呼叫时,呼叫对话框打开,当用户允许呼叫权限时,不拨打电话,用户再次点击呼叫,现在应用程序拨打电话

所以我的问题是当用户允许权限但没有调用我在 onRequestPermissionsResult

中授予权限的函数

地图片段

在这个片段中,我请求当前位置权限,当用户允许时,然后调用 getlastlocation 函数,但 getlastlocation 函数在允许权限后没有调用

 @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);
}

底页

请求权限

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();
        }
    }
}

清单

 <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>

所以请给一些建议问题是用户允许权限但没有执行用户允许权限时应该完成的任务

您正在使用

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

而不是

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

当您使用 ActivityCompat.requestPermissions 时,它将在包含片段的 Activity 中为您提供结果。因此,您应该直接使用 requestPermissions 来获取片段中的回调。