调用ActivityCompat.requestPermissions后,不会显示任何对话框

时间:2016-05-18 20:20:54

标签: android android-6.0-marshmallow

我正在尝试在Android Marshmallow中实现位置权限。我创建了一个小型测试应用程序,一切都运行良好。但是,当我将相同的代码复制到我的真实应用程序时,对话框“允许[应用程序名称]访问此设备的位置?”永远不会出现。

我可以单步执行调试器,看看它应该调用ActivityCompat.requestPermissions()。

我能想到的唯一区别是,真正的应用程序还有更多功能。地图活动是在ScrollableTabActivity中创建的,如下所示:

this.addTab(getString(R.string.map), R.drawable.iconmap,
            RadioStateDrawable.SHADE_GRAY,
            RadioStateDrawable.SHADE_BLUE, new Intent(this, MapsActivity.class));

我是否需要考虑线程或类似的东西?或者以不同的方式创建活动?

以下是示例活动的完整源代码(一切正常):

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, LocationListener {
private GoogleMap map;
private Button gpsButton;
private static String[] LOCATION_PERMISSIONS = {Manifest.permission.ACCESS_FINE_LOCATION};
private static int ACCESS_FINE_LOCATION_PERMISSION_REQUEST_CODE = 1;
private LocationManager locationManager;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
    locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

    gpsButton = (Button) findViewById(R.id.GPS);
    gpsButton.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View v)
        {
            requestLocationPermissions();
        }
    });
}

private void requestLocationPermissions()
{
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
    {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION))
        {
            new AlertDialog.Builder(MapsActivity.this)
                    .setMessage("Without access to your location, the app's location function cannot be used.  Will you allow this access?")
                    .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener()
                    {
                        @Override
                        public void onClick(DialogInterface dialog, int which)
                        {
                            ActivityCompat.requestPermissions(MapsActivity.this,
                                    LOCATION_PERMISSIONS, ACCESS_FINE_LOCATION_PERMISSION_REQUEST_CODE);
                        }
                    }).setNegativeButton(R.string.no, null).show();
        }
        else
        {
            ActivityCompat.requestPermissions(this, LOCATION_PERMISSIONS, ACCESS_FINE_LOCATION_PERMISSION_REQUEST_CODE);
        }
    }
    else
    {
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults)
{
    if (requestCode == ACCESS_FINE_LOCATION_PERMISSION_REQUEST_CODE)
    {
        if (verifyPermissions(grantResults))
        {
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        }
        else
        {
            new AlertDialog.Builder(MapsActivity.this)
                    .setMessage("Without access to your location, the app's location function cannot be used.")
                    .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener()
                    {
                        @Override
                        public void onClick(DialogInterface dialog, int which)
                        {
                        }
                    }).show();
        }
    }
}

private void updateUserLocation(Location location)
{
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
    map.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    locationManager.removeUpdates(this);
}

public static boolean verifyPermissions(int[] grantResults)
{
    boolean verified = false;

    for (int result : grantResults)
    {
        if (result == PackageManager.PERMISSION_GRANTED)
        {
            verified = true;
        }
    }
    return verified;
}

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

    // Add a marker in Sydney and move the camera
    LatLng sydney = new LatLng(-34, 151);
    map.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
    map.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}

@Override
public void onLocationChanged(Location location)
{
    updateUserLocation(location);
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{
}

@Override
public void onProviderEnabled(String provider)
{
}

@Override
public void onProviderDisabled(String provider)
{
}

}

0 个答案:

没有答案