Intereting Posts
Лучший способ передачи аудио и видео с телефона Android на RTMP-сервер Таймер Замедляется в Сервисе, когда блокировка экрана устройства Изменение программного режима сети Как инструмент HierarchyViewer от android studio знает свойства просмотров экрана Android Ошибка входа в указанную учетную запись. Выберите другую учетную запись Android-карты v2 сбой при повторном открытии фрагмента Нарушение доступа в собственном коде с аппаратным ускорителем Android MediaCodec Java.lang.IllegalStateException: RecyclerView не имеет LayoutManager во фрагменте RequestLayout () неправильно вызван android.widget.RelativeLayout android Как использовать холст андроида, чтобы нарисовать прямоугольник с только тупиковыми и вертикальными углами вокруг? Переход анимации между действиями с использованием FLAG_ACTIVITY_CLEAR_TOP Странное поведение с использованием Java-тернарного оператора на Android Как потерять фокус edittext, когда нажата кнопка «done» на мягкой клавиатуре? «Не удалось выполнить повторную установку из-за разных подписей приложений» – возможно ли переопределить? Передача объектов в wcf с помощью android с помощью ksoap2; Он отправляет и получает 0

В Android> 6.0, получая исключение безопасности безопасности при обращении к изображению из галереи во второй раз

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

Java.lang.SecurityException: отказ в разрешении: чтение com.google.android.apps.photos.contentprovider.MediaContentProvider uri content: //com.google.android.apps.photos.contentprovider/0/1/content%3A%2F% 2Fmedia% 2Fexternal% 2Fimages% 2Fmedia% 2F1022 / ORIGINAL / NONE / 256350537 от pid = 7789, uid = 10145 требует, чтобы поставщик был экспортирован, или grantUriPermission ()

Я прошел через несколько ссылок и проверил, что андроид вводит разрешения времени выполнения, и я использовал ниже код для проверки разрешения во время выполнения.

То, что я пробовал до сих пор …

  1. Добавлено разрешение в манифесте.

2.Проверка разрешения на запуск из кода.

@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { Log.d("Enter", "onRequestPermissionsResult: "); switch (requestCode){ case REQUEST_CODE_PERMISSION:{ Map<String,Integer> perms = new HashMap<>(); //Initialize the map with the permissions perms.put(Manifest.permission.ACCESS_COARSE_LOCATION,PackageManager.PERMISSION_GRANTED); perms.put(Manifest.permission.CAMERA,PackageManager.PERMISSION_GRANTED); perms.put(Manifest.permission.READ_EXTERNAL_STORAGE,PackageManager.PERMISSION_GRANTED); // perms.put(Manifest.permission.READ_USER_DICTIONARY,PackageManager.PERMISSION_GRANTED); //Fill with actual results from user if (grantResults.length > 0){ for (int i = 0 ; i < permissions.length ; i++){ perms.put(permissions[i],grantResults[i]); //check for all permissions if (perms.get(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED && perms.get(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED && perms.get(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){ Log.d("Permission Granted", "onRequestPermissionsResult: "); }else{ Log.d("Some", "onRequestPermissionsResult: "); //if (perms.get(Manifest.permission.ACCESS_COARSE_LOCATION)) if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA) || ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.ACCESS_COARSE_LOCATION) || ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_EXTERNAL_STORAGE)){ new DialogInterface.OnClickListener(){ @Override public void onClick (DialogInterface dialog, int which){ switch (which){ case DialogInterface.BUTTON_POSITIVE: checkAndRequestPermission(); break; case DialogInterface.BUTTON_NEGATIVE: break; } } }; }else{ Toast.makeText(this,"Go to Settings and enable Permissions",Toast.LENGTH_LONG).show(); } } } } } } } private void showDialogOK(String message, DialogInterface.OnClickListener okListener){ new AlertDialog.Builder(this) .setMessage(message) .setPositiveButton("OK",okListener) .setNegativeButton("Cancel",okListener) .create() .show(); } 

}

И линия, где он падает, – это: –

 if (checkAndRequestPermission()){ InputStream fis = getContentResolver().openInputStream(Uri.parse(url)); //Crashing Line BitmapFactory.decodeStream(fis, null, o); fis.close(); } 

Ниже приведены разрешения, используемые в My Manifest:

 <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_USER_DICTIONARY"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/> <uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/> <!-- <uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> <!-- The following two permissions are not required to use Google Maps Android API v2, but are recommended. --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-feature android:name="android.hardware.location" android:required="true" /> <uses-feature android:name="android.hardware.location.gps" android:required="false" /> 

Проблема заключается не в разрешениях вашего манифеста, а в использовании URI. Как вы получили URI? Выход logcat сообщает вам, что URI предназначен для поставщика контента, который не был экспортирован, или что URI не был предоставлен в Intent предоставляющем временный доступ к ContentProvider .

После многих исследований я смог исправить проблему. Ошибка вызывалась, так как для фотографий Google требуется постоянный URI изображений, даже если у вас есть все коды для разрешения времени выполнения и флаги в файле манифеста.

С помощью ответа ниже я исправил свою проблему. https://stackoverflow.com/a/29588566/1842304

Запишите все ваши разрешения, которые работают в манифесте ниже андроида M. Нам не нужны дополнительные разрешения для android M. Мы должны просто запросить во время выполнения.

И попросите ваше разрешение так. Измените свое разрешение (только опасные разрешения), поскольку они находятся в манифесте. Поместите это в onCreate

 /// granting permission //// if(!checkPermission()) { requestPermission(); } ///////////////////////////// 

И в классе добавьте эти

  /////////////////////// permission for marshmallow /////////////////// private boolean checkPermission(){ int result1 = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE); int result2 = ContextCompat.checkSelfPermission(this, Manifest.permission.MODIFY_PHONE_STATE); int result3 = ContextCompat.checkSelfPermission(this, Manifest.permission.PROCESS_OUTGOING_CALLS); int result4 = ContextCompat.checkSelfPermission(this, Manifest.permission.PROCESS_INCOMING_CALLS); int result5 = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE); if (result1 == PackageManager.PERMISSION_GRANTED && result2 == PackageManager.PERMISSION_GRANTED && result3 == PackageManager.PERMISSION_GRANTED && result4 == PackageManager.PERMISSION_GRANTED && result5 == PackageManager.PERMISSION_GRANTED){ return true; } else { //Toast.makeText(this,"You don't have permission to use further features",Toast.LENGTH_LONG).show(); return false; } } private void requestPermission(){ if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_PHONE_STATE) && ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.MODIFY_PHONE_STATE) && ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.PROCESS_OUTGOING_CALLS) && ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.PROCESS_INCOMING_CALLS) && ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)){ Toast.makeText(this,"Application needs permission to use your camera, calls, storage and location.",Toast.LENGTH_LONG).show(); } else { ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_PHONE_STATE, Manifest.permission.MODIFY_PHONE_STATE, Manifest.permission.PROCESS_OUTGOING_CALLS, Manifest.permission.PROCESS_INCOMING_CALLS, Manifest.permission.CALL_PHONE},1); } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case 1: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED && grantResults[2] == PackageManager.PERMISSION_GRANTED && grantResults[3] == PackageManager.PERMISSION_GRANTED && grantResults[4] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this,"Permission Granted.",Toast.LENGTH_LONG).show(); } else { Toast.makeText(this,"Permission Denied.",Toast.LENGTH_LONG).show(); } break; } } //////////////////////////////////////////////////////////////////////// 

Попробуйте это решение

В методе OnCreate ()

 @Override protected void onCreate(Bundle savedInstanceState) { // your code ................. // call dynamic permission check_SD_CARD_Permissions(); } public void check_SD_CARD_Permissions() { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int permissionCheck = this.checkSelfPermission("Manifest.permission.WRITE_EXTERNAL_STORAGE"); permissionCheck += this.checkSelfPermission("Manifest.permission.READ_EXTERNAL_STORAGE"); if (permissionCheck != 0) { this.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 1001); //Any number } }else{ Log.d(TAG, "checkBTPermissions: No need to check permissions. SDK version < LOLLIPOP."); } } 

В AndroidManifest.xml

Добавить эти разрешения

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

И targetSdkVersion должно быть 23

 <uses-sdk android:minSdkVersion="13" android:targetSdkVersion="23" /> 

Создайте свой проект с помощью

 Version : Android 6.0 

И, наконец, цель project.properties должна быть 23

 target=android-23 

Он работает для меня