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

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

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> 

Какой 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.

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

Intereting Posts