Intereting Posts
Включить / отключить Wi-Fi через скрипты bash на Android Установка атрибута screenBrightness на 0.0f в Android 4.2.2 больше не отключает экран? Время поездки между двумя точками в Google Map Android API V2 Как обрабатывать кнопку «Назад» на андроиде при появлении диалогового окна прогресса Использование ECC Curve25519 для шифрования / дешифрования данных в Java Где хранить большие данные приложения на устройствах Android? Android Bluetooth Low Energy Pairing Raw не может быть разрешен или не является полем Обнаружено повреждение стека, dalvik VM crash Android TranslateAnimation сбрасывается после анимации Cordova / Phonegap / Ionic – получение Push-сообщения через PushPlugin и сохранение данных на localStorage, даже если пользователь отклоняет уведомление Не удалось найти плагин DRM Android Создание настраиваемого измерения в Google Analytics Does PhoneGap / Apache Cordova предлагает API для зашифрованной базы данных SQLite Создайте 360-градусный интерактивный просмотр продукта

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

Я создаю функцию, которая может получить / установить ресурс из SD и если не найдена из sd, а затем взять его из Asset и, если возможно, записать актив обратно в SD
Эта функция может проверяться путем вызова метода, если SD установлен и доступен …

boolean bSDisAvalaible = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); 

Моя разработанная функция может использоваться из одного приложения (проекта) в другое (с или без android.permission.WRITE_EXTERNAL_STORAGE)

Затем я хотел бы проверить, имеет ли текущее приложение это конкретное разрешение, не играя с SecurityException.

Существует ли «хороший» способ справиться с текущими установленными разрешениями во время выполнения?

Для этого вы можете использовать Context.checkCallingorSelfPermission() . Вот пример:

 private boolean checkWriteExternalPermission() { String permission = "android.permission.WRITE_EXTERNAL_STORAGE"; int res = getContext().checkCallingOrSelfPermission(permission); return (res == PackageManager.PERMISSION_GRANTED); } 

Это еще одно решение

 PackageManager pm = context.getPackageManager(); int hasPerm = pm.checkPermission( android.Manifest.permission.WRITE_EXTERNAL_STORAGE, context.getPackageName()); if (hasPerm != PackageManager.PERMISSION_GRANTED) { // do stuff } 

Вы также можете использовать это:

 private boolean doesUserHavePermission() { int result = context.checkCallingOrSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); return result == PackageManager.PERMISSION_GRANTED; } 

Подобно документации Google:

 // Assume thisActivity is the current activity int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE); 

Совместное использование моих методов в случае, если кто-то нуждается в них:

  /** Determines if the context calling has the required permission * @param context - the IPC context * @param permissions - The permissions to check * @return true if the IPC has the granted permission */ public static boolean hasPermission(Context context, String permission) { int res = context.checkCallingOrSelfPermission(permission); Log.v(TAG, "permission: " + permission + " = \t\t" + (res == PackageManager.PERMISSION_GRANTED ? "GRANTED" : "DENIED")); return res == PackageManager.PERMISSION_GRANTED; } /** Determines if the context calling has the required permissions * @param context - the IPC context * @param permissions - The permissions to check * @return true if the IPC has the granted permission */ public static boolean hasPermissions(Context context, String... permissions) { boolean hasAllPermissions = true; for(String permission : permissions) { //return false instead of assigning, but with this you can log all permission values if (! hasPermission(context, permission)) {hasAllPermissions = false; } } return hasAllPermissions; } 

И назвать это:

 boolean hasAndroidPermissions = SystemUtils.hasPermissions(mContext, new String[] { android.Manifest.permission.ACCESS_WIFI_STATE, android.Manifest.permission.READ_PHONE_STATE, android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.INTERNET, }); 

Вы должны проверить права доступа следующим образом (как описано здесь Android-разрешения ):

 int result = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.READ_PHONE_STATE); 

Затем сравните свой результат с тем, чтобы:

 result == PackageManager.PERMISSION_DENIED 

или:

 result == PackageManager.PERMISSION_GRANTED 

Код, который отлично подходит для меня: –

  final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 102; if ((ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) { requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); } else { // user already provided permission // perform function for what you want to achieve } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { boolean canUseExternalStorage = false; switch (requestCode) { case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { canUseExternalStorage = true; } if (!canUseExternalStorage) { Toast.makeText(getActivity(), "Cannot use this feature without requested permission", Toast.LENGTH_SHORT).show(); } else { // user now provided permission // perform function for what you want to achieve } } } } 

Включить местоположение GPS Android Studio

  1. Добавить запись разрешения в AndroidManifest.Xml
  1. MapsActivity.java

     public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { private GoogleMap mMap; private Context context; private static final int PERMISSION_REQUEST_CODE = 1; Activity activity; /** * ATTENTION: This was auto-generated to implement the App Indexing API. * See https://g.co/AppIndexing/AndroidStudio for more information. */ private GoogleApiClient client; @Override protected void onCreate(Bundle savedInstanceState) { context = getApplicationContext(); activity = this; super.onCreate(savedInstanceState); requestPermission(); checkPermission(); setContentView(R.layout.activity_maps); // Obtain the SupportMapFragment and get notified when the map is ready to be used. SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; LatLng location = new LatLng(0, 0); mMap.addMarker(new MarkerOptions().position(location).title("Marker in Bangalore")); mMap.moveCamera(CameraUpdateFactory.newLatLng(location)); mMap.setMyLocationEnabled(true); } private void requestPermission() { if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_FINE_LOCATION)) { Toast.makeText(context, "GPS permission allows us to access location data. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show(); } else { ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_CODE); } } private boolean checkPermission() { int result = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION); if (result == PackageManager.PERMISSION_GRANTED) { return true; } else { return false; } }