
Merhaba arkadaşlar bu yazımızda sizlerele konum izinleri nasıl alınır ve konum ayarları sayfasına gitmeden veya üst barı aşağıya çekip konumu aktif et demek yerine kullanıcıya konumu aktif değilse bir dilog çıkartıp açıp açmayacağımızı nasıl yapıldığını anlatan bir yazı hazırladım. Eğer fragment kullanıyorsanız kodlarınızı ona göre düzenleyiniz.
Önce her zaman yaptığımız gibi google servisini gradle’a ekleyelim
1 |
implementation 'com.google.android.gms:play-services-location:17.0.0' |
sonra manifest de konum izni alacaklar için iznimizi ekliyoruz.
1 |
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> |
Mainactivity.java dosyamıza geldik global tanımlamalarımızı en üstte yapalım
1 2 3 |
private static final int REQUEST_CHECK_SETTINGS = 0x1; private static GoogleApiClient mGoogleApiClient; private static final int ACCESS_FINE_LOCATION_INTENT_ID=3; |
oncreate içerisinde veya showLocationState() den hemen önce google api kontrolünü yapmamız gerekiyor.
1 |
initGoogleAPIClient(); |
1 2 3 4 5 6 7 |
private void initGoogleAPIClient() { //Without Google API Client Auto Location Dialog will not work mGoogleApiClient = new GoogleApiClient.Builder(MainActivity.this) .addApi(LocationServices.API) .build(); mGoogleApiClient.connect(); } |
Şimdi dialog göstereceğimiz methodumuz var onu da ekleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
private void showLocationState(){ LocationRequest locationRequest = LocationRequest.create(); locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);//Setting priotity of Location request to high locationRequest.setInterval(30 * 1000); locationRequest.setFastestInterval(5 * 1000);//5 sec Time interval for location update LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() .addLocationRequest(locationRequest); builder.setAlwaysShow(true); //this is the key ingredient to show dialog always when GPS is off PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build()); result.setResultCallback(new ResultCallback<LocationSettingsResult>() { @Override public void onResult(LocationSettingsResult result) { final Status status = result.getStatus(); final LocationSettingsStates state = result.getLocationSettingsStates(); switch (status.getStatusCode()) { case LocationSettingsStatusCodes.SUCCESS: //Konum ayarları etkin ise buraya // istekler burda //updateGPSStatus("GPS is Enabled in your device"); Log.d("locationEnable","SUCCESS"); break; case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: // Konum ayarları etkin değil fakat dialog gösterip konum açılmasını sağlıyor isek buraya // Dialog göster try { // startResolutionForResult(), çağırıp kontrol edilir Log.d("locationEnable","RESOLUTION_REQUIRED"); status.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); // Ignore the error. } break; case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: // Konum eğer açılamıyor ise buraya düşer Log.d("locationEnable","SETTINGS_CHANGE_UNAVAILABLE"); break; } } }); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CHECK_SETTINGS) { if (resultCode == RESULT_OK) { Toast.makeText(MainActivity.this, "GPS enabled", Toast.LENGTH_LONG).show(); } else { Toast.makeText(MainActivity.this, "GPS is not enabled", Toast.LENGTH_LONG).show(); } } } |
Bir button click veya oncreate içerisinde de aşağıdaki location gösterimini çağırıyoruz.
1 |
showLocationState(); |
Bu bölüme kadar olan kısım sadece konum değerini ayarlara gitmeden açmak ile ilgili olan bölümdü. Peki biz konum iznini nasıl alacağız onu da anlatayım.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* Konum izni için User Permission */ private void requestLocationPermission() { if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION)) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, ACCESS_FINE_LOCATION_INTENT_ID); } else { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, ACCESS_FINE_LOCATION_INTENT_ID); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode==ACCESS_FINE_LOCATION_INTENT_ID){ if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ Toast.makeText(MainActivity.this, "İzin verildi", Toast.LENGTH_LONG).show(); }else { Toast.makeText(MainActivity.this, "İzin verilmedi", Toast.LENGTH_LONG).show(); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* Marshmallow ve üzeri cihazlar için geçerli olduğu için kontrol yapıyoruz */ private void checkPermissions() { if ( Build.VERSION.SDK_INT >= 23) { if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) requestLocationPermission(); else showLocationState(); } else showLocationState(); } |
Tek kalan izni bir yerde çağırmak. Buton click veya oncreate içerisinde çağırabilirsiniz.
1 |
checkPermissions();//konum izni al |
yani en son olarak artık methodlarımızı çağırmak kalıyor onları da oncreate içerisine yazarsak projemiz çalışacaktır.
1 2 3 4 5 6 |
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); initGoogleAPIClient(); checkPermissions(); } |
Kod’un Tamamı
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
public class MainActivity extends AppCompatActivity{ private static final int REQUEST_CHECK_SETTINGS = 0x1; private static GoogleApiClient mGoogleApiClient; private static final int ACCESS_FINE_LOCATION_INTENT_ID=3; @Override public int getContentView() { return R.layout.activity_login; } @Override public void initView() { } @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); initGoogleAPIClient(); checkPermissions(); } private void initGoogleAPIClient() { //Without Google API Client Auto Location Dialog will not work mGoogleApiClient = new GoogleApiClient.Builder(MainActivity.this) .addApi(LocationServices.API) .build(); mGoogleApiClient.connect(); } private void showLocationState(){ LocationRequest locationRequest = LocationRequest.create(); locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);//Setting priotity of Location request to high locationRequest.setInterval(30 * 1000); locationRequest.setFastestInterval(5 * 1000);//5 sec Time interval for location update LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() .addLocationRequest(locationRequest); builder.setAlwaysShow(true); //this is the key ingredient to show dialog always when GPS is off PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build()); result.setResultCallback(new ResultCallback<LocationSettingsResult>() { @Override public void onResult(LocationSettingsResult result) { final Status status = result.getStatus(); final LocationSettingsStates state = result.getLocationSettingsStates(); switch (status.getStatusCode()) { case LocationSettingsStatusCodes.SUCCESS: //Konum ayarları etkin ise buraya // istekler burda //updateGPSStatus("GPS is Enabled in your device"); Log.d("locationEnable","SUCCESS"); break; case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: // Konum ayarları etkin değil fakat dialog gösterip konum açılmasını sağlıyor isek buraya // Dialog göster try { // startResolutionForResult(), çağırıp kontrol edilir Log.d("locationEnable","RESOLUTION_REQUIRED"); status.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); // Ignore the error. } break; case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: // Konum eğer açılamıyor ise buraya düşer Log.d("locationEnable","SETTINGS_CHANGE_UNAVAILABLE"); break; } } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CHECK_SETTINGS) { if (resultCode == RESULT_OK) { Toast.makeText(MainActivity.this, "GPS enabled", Toast.LENGTH_LONG).show(); //Konum bilgileri alınacak } else { Toast.makeText(MainActivity.this, "GPS is not enabled", Toast.LENGTH_LONG).show(); } } } /*request permission için konum izni kontrolü*/ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode==ACCESS_FINE_LOCATION_INTENT_ID){ if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ Toast.makeText(MainActivity.this, "İzin verildi", Toast.LENGTH_LONG).show(); }else { Toast.makeText(MainActivity.this, "İzin verilmedi", Toast.LENGTH_LONG).show(); } } } /* Konum izni için User Permission */ private void requestLocationPermission() { if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION)) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, ACCESS_FINE_LOCATION_INTENT_ID); } else { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, ACCESS_FINE_LOCATION_INTENT_ID); } } /* Marshmallow ve üzeri cihazlar için geçerli olduğu için kontrol yapıyoruz */ private void checkPermissions() { if ( Build.VERSION.SDK_INT >= 23) { if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) requestLocationPermission(); else showLocationState(); } else showLocationState(); } } |
Yazıyı okuduğunuz için teşekkürler, artık medium üzerinde yazılarımı yayınlayacağım.
Medium hesabımı takip etmeyi unutmayın.
İlk yazımı yayınladım ulaşmak için tıklayınız.
Medium : https://medium.com/@unalzafer
Bir yanıt bırakın