Для вызова требуется разрешение, которое может быть отклонено пользователем

Я пытаюсь сделать приложение, которое отправляет обновления местоположения пользователя через каждые пять минут. Я полагаю, что мой код работает нормально, но я получаю сообщение об ошибках, которые используются приложением. Я уверен, что я добавил разрешения в файл манифеста. Может кто-нибудь сказать мне, что случилось? Вот мой код.

MainActivity.java

LocationManager locationManager ; String provider; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Getting LocationManager object locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); // Creating an empty criteria object Criteria criteria = new Criteria(); // Getting the name of the provider that meets the criteria provider = locationManager.getBestProvider(criteria, false); if(provider!=null && !provider.equals("")){ // Get the location from the given provider Location location = locationManager.getLastKnownLocation(provider); locationManager.requestLocationUpdates(provider,5*60*1000,0,this); if(location!=null) onLocationChanged(location); else Toast.makeText(getBaseContext(), "Location can't be retrieved", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(getBaseContext(), "No Provider Found", Toast.LENGTH_SHORT).show(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onLocationChanged(Location location) { // Getting reference to TextView tv_longitude TextView tvLongitude = (TextView)findViewById(R.id.tv_longitude); // Getting reference to TextView tv_latitude TextView tvLatitude = (TextView)findViewById(R.id.tv_latitude); // Setting Current Longitude tvLongitude.setText("Longitude:" + location.getLongitude()); // Setting Current Latitude tvLatitude.setText("Latitude:" + location.getLatitude() ); } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } 

}

Я получаю сообщение об ошибке, поскольку для вызова требуется разрешение, которое может быть отклонено пользователем в этих строках –

 Location location = locationManager.getLastKnownLocation(provider); locationManager.requestLocationUpdates(provider,5*60*1000,0,this); 

Мой AndroidManifest похож на этот

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET"/> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> 

Solutions Collecting From Web of "Для вызова требуется разрешение, которое может быть отклонено пользователем"

Какой SDK вы используете? Если вы используете Marshmallow, вам нужно проверить, что пользователь предоставил разрешение для каждого вызова местоположения.

Взгляните сюда.

Вы должны сделать что-то вроде этого:

 if ( ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions( this, new String[] { android.Manifest.permission.ACCESS_COARSE_LOCATION }, LocationService.MY_PERMISSION_ACCESS_COURSE_LOCATION ); } 

Если у вас его нет.

Проверьте ссылку выше для получения дополнительной информации.

Попробуйте мой код:

 public class MainActivity extends AppCompatActivity { /* GPS Constant Permission */ private static final int MY_PERMISSION_ACCESS_COARSE_LOCATION = 11; private static final int MY_PERMISSION_ACCESS_FINE_LOCATION = 12; /* Position */ private static final int MINIMUM_TIME = 10000; // 10s private static final int MINIMUM_DISTANCE = 50; // 50m /* GPS */ private String mProviderName; private LocationManager mLocationManager; private LocationListener mLocationListener; @Override protected void onCreate(Bundle savedInstanceState) { ... mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // Get the best provider between gps, network and passive Criteria criteria = new Criteria(); mProviderName = mLocationManager.getBestProvider(criteria, true); // API 23: we have to check if ACCESS_FINE_LOCATION and/or ACCESS_COARSE_LOCATION permission are granted if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { // No one provider activated: prompt GPS if (mProviderName == null || mProviderName.equals("")) { startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); } // At least one provider activated. Get the coordinates switch (mProviderName) { case "passive": mLocationManager.requestLocationUpdates(mProviderName, MINIMUM_TIME, MINIMUM_DISTANCE, this); Location location = mLocationManager.getLastKnownLocation(mProviderName); break; case "network": break; case "gps": break; } // One or both permissions are denied. } else { // The ACCESS_COARSE_LOCATION is denied, then I request it and manage the result in // onRequestPermissionsResult() using the constant MY_PERMISSION_ACCESS_FINE_LOCATION if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, MY_PERMISSION_ACCESS_COARSE_LOCATION); } // The ACCESS_FINE_LOCATION is denied, then I request it and manage the result in // onRequestPermissionsResult() using the constant MY_PERMISSION_ACCESS_FINE_LOCATION if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, MY_PERMISSION_ACCESS_FINE_LOCATION); } } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSION_ACCESS_COARSE_LOCATION: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted } else { // permission denied } break; case MY_PERMISSION_ACCESS_FINE_LOCATION: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted } else { // permission denied } break; } } } } 

Источник: ССЫЛКА

Это сработало для меня

  if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. Toast.makeText(YourService.this, "First enable LOCATION ACCESS in settings.", Toast.LENGTH_LONG).show(); return; } locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 1, listener); 

Вот несколько шагов, которые необходимо выполнить, чтобы исправить это

Основная деятельность .java

 if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { locationManager.requestLocationUpdates (locationManager.requestLocationUpdates(provider,5*60*1000,0,this); }//end of if 

Теперь вам также нужно обновить build.gradle

 dependencies{ ------------- //your pre-generated code compile 'com.android.support:support-v4:23.0.1' } 

Об этом говорят разработчики Android.Developers.

И не забудьте предоставить разрешения от параметров приложения, если вы используете эмулятор, потому что он может не запрашивать такие