diff options
author | Tobrun Van Nuland <tobrun.van.nuland@gmail.com> | 2016-06-23 11:24:25 +0200 |
---|---|---|
committer | Antonio Zugaldia <antonio@mapbox.com> | 2016-06-24 08:56:11 -0400 |
commit | b37de9f8f42d9a2ffd956310087532af3dc9e865 (patch) | |
tree | 879701f328db4b3a690dce4b352a4a348dfd34d5 | |
parent | cff1a8929fe38e724592532df990eb5481de06b6 (diff) | |
download | qtlocation-mapboxgl-b37de9f8f42d9a2ffd956310087532af3dc9e865.tar.gz |
[android] - Fix locational runtime permissions
Fixes #5450
3 files changed, 126 insertions, 23 deletions
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/FeatureOverviewActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/FeatureOverviewActivity.java index 9d514b2870..89b08a6787 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/FeatureOverviewActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/FeatureOverviewActivity.java @@ -1,5 +1,6 @@ package com.mapbox.mapboxsdk.testapp.activity; +import android.Manifest; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ActivityInfo; @@ -9,7 +10,11 @@ import android.content.pm.PackageManager; import android.content.res.Resources; import android.os.AsyncTask; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.StringRes; +import android.support.design.widget.Snackbar; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; @@ -61,10 +66,16 @@ public class FeatureOverviewActivity extends AppCompatActivity { @Override public void onItemClicked(RecyclerView recyclerView, int position, View v) { if (!sectionAdapter.isSectionHeaderPosition(position)) { - Intent intent = new Intent(); int realPosition = sectionAdapter.getConvertedPosition(position); - intent.setComponent(new ComponentName(getPackageName(), features.get(realPosition).getName())); - startActivity(intent); + Feature feature = features.get(realPosition); + if (feature.getCategory().equals(getString(R.string.category_userlocation))) { + if ((ContextCompat.checkSelfPermission(FeatureOverviewActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) || + (ContextCompat.checkSelfPermission(FeatureOverviewActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)) { + ActivityCompat.requestPermissions(FeatureOverviewActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, realPosition); + return; + } + } + startFeature(feature); } } }); @@ -104,6 +115,22 @@ public class FeatureOverviewActivity extends AppCompatActivity { recyclerView.setAdapter(sectionAdapter); } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + startFeature(features.get(requestCode)); + }else{ + Snackbar.make(findViewById(android.R.id.content),"Can't open without the location permission.",Snackbar.LENGTH_SHORT).show(); + } + } + + private void startFeature(Feature feature) { + Intent intent = new Intent(); + intent.setComponent(new ComponentName(getPackageName(), feature.getName())); + startActivity(intent); + } + @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationDrawableActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationDrawableActivity.java index e5e21fd03e..d630ee6d21 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationDrawableActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationDrawableActivity.java @@ -1,9 +1,14 @@ package com.mapbox.mapboxsdk.testapp.activity.userlocation; +import android.Manifest; +import android.content.pm.PackageManager; import android.graphics.Color; import android.location.Location; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.UiThread; +import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; @@ -26,6 +31,8 @@ import com.mapbox.mapboxsdk.testapp.R; public class MyLocationDrawableActivity extends AppCompatActivity implements LocationListener { + private static final int PERMISSIONS_LOCATION = 0; + private MapView mapView; private MapboxMap mapboxMap; private Location location; @@ -45,20 +52,13 @@ public class MyLocationDrawableActivity extends AppCompatActivity implements Loc } findViewById(R.id.progress).setVisibility(View.GONE); - location = LocationServices.getLocationServices(this).getLastLocation(); MapboxMapOptions mapboxMapOptions = new MapboxMapOptions(); mapboxMapOptions.accessToken(getString(R.string.mapbox_access_token)); mapboxMapOptions.styleUrl(Style.MAPBOX_STREETS); - mapboxMapOptions.locationEnabled(true); - mapboxMapOptions.camera(new CameraPosition.Builder() - .target(location != null ? new LatLng(location) : new LatLng(0, 0)) - .zoom(11) - .tilt(25) - .build()); - - mapboxMapOptions.myLocationForegroundDrawables(ContextCompat.getDrawable(this, R.drawable.ic_chelsea), - ContextCompat.getDrawable(this, R.drawable.ic_chelsea)); + + // configure MyLocationView drawables + mapboxMapOptions.myLocationForegroundDrawable(ContextCompat.getDrawable(this, R.drawable.ic_chelsea)); mapboxMapOptions.myLocationBackgroundDrawable(ContextCompat.getDrawable(this, R.drawable.ic_arsenal)); mapboxMapOptions.myLocationForegroundTintColor(Color.GREEN); mapboxMapOptions.myLocationBackgroundTintColor(Color.YELLOW); @@ -78,17 +78,53 @@ public class MyLocationDrawableActivity extends AppCompatActivity implements Loc @Override public void onMapReady(MapboxMap map) { mapboxMap = map; + toggleGps(true); } }); + } + + public void toggleGps(boolean enableGps) { + if (enableGps) { + if ((ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) || + (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)) { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_LOCATION); + } else { + enableLocation(true); + } + } else { + enableLocation(false); + } + } - LocationServices.getLocationServices(this).addLocationListener(this); + private void enableLocation(boolean enabled) { + if (enabled) { + mapboxMap.setMyLocationEnabled(true); + Location location = mapboxMap.getMyLocation(); + if (location != null) { + onLocationChanged(location); + }else{ + LocationServices.getLocationServices(this).addLocationListener(this); + } + } else { + mapboxMap.setMyLocationEnabled(false); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { + switch (requestCode) { + case PERMISSIONS_LOCATION: { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + enableLocation(true); + } + } + } } @Override public void onLocationChanged(Location location) { - if (mapboxMap != null && firstRun) { - mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location), 10)); - firstRun = false; + if (mapboxMap != null) { + mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location), 14)); } } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationTrackingModeActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationTrackingModeActivity.java index fcd61e70b4..273b5134c3 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationTrackingModeActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationTrackingModeActivity.java @@ -1,10 +1,15 @@ package com.mapbox.mapboxsdk.testapp.activity.userlocation; +import android.Manifest; +import android.content.pm.PackageManager; import android.location.Location; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.UiThread; import android.support.design.widget.Snackbar; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; @@ -33,6 +38,7 @@ public class MyLocationTrackingModeActivity extends AppCompatActivity implements private MapboxMap mMapboxMap; private Spinner mLocationSpinner, mBearingSpinner; private Location mLocation; + private static final int PERMISSIONS_LOCATION = 0; @Override protected void onCreate(Bundle savedInstanceState) { @@ -57,8 +63,9 @@ public class MyLocationTrackingModeActivity extends AppCompatActivity implements mMapboxMap = mapboxMap; // disable dismissal when a gesture occurs - mMapboxMap.getTrackingSettings().setDismissLocationTrackingOnGesture(false); - mMapboxMap.getTrackingSettings().setDismissBearingTrackingOnGesture(false); + TrackingSettings trackingSettings = mapboxMap.getTrackingSettings(); + trackingSettings.setDismissLocationTrackingOnGesture(false); + trackingSettings.setDismissBearingTrackingOnGesture(false); mapboxMap.setOnMyLocationChangeListener(MyLocationTrackingModeActivity.this); @@ -96,13 +103,46 @@ public class MyLocationTrackingModeActivity extends AppCompatActivity implements } }); + toggleGps(!mapboxMap.isMyLocationEnabled()); + } + }); + } + + @UiThread + public void toggleGps(boolean enableGps) { + if (enableGps) { + if ((ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) || + (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)) { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_LOCATION); + } else { + enableLocation(true); + } + } else { + enableLocation(false); + } + } - mLocation = LocationServices.getLocationServices(MyLocationTrackingModeActivity.this).getLastLocation(); - if(mLocation!=null){ - setInitialPosition(new LatLng(mLocation)); + private void enableLocation(boolean enabled) { + if (enabled) { + mMapboxMap.setMyLocationEnabled(true); + Location location = mMapboxMap.getMyLocation(); + if (location != null) { + setInitialPosition(new LatLng(location)); + } + } else { + mMapboxMap.setMyLocationEnabled(false); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { + switch (requestCode) { + case PERMISSIONS_LOCATION: { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + enableLocation(true); } } - }); + } } private void setInitialPosition(LatLng latLng){ |