Intereting Posts
ProGuard и Gson на Android (ClassCastException) Как избежать отклонения DialogFragment при нажатии кнопки «Поиск» – Android Какой из лучших макетов в андроиде мы можем использовать для разработки пользовательского интерфейса? Установленное соединение было прервано программным обеспечением вашей хост-машины Обновление виджета через короткие промежутки времени с использованием API 19+ Проблема с & и двойными кавычками в моем приложении для Android Proguard с кодом ошибки возврата Unity3d 1 Как объединить навигационный ящик и Spinner Keycode для Android минимизирует кнопку мягкой клавиатуры Как установить значок для диалога в Android Android «Только исходный поток, создавший иерархию представлений, может коснуться его представлений». Error in Fragment Android, как изменить ширину и высоту элемента Как обрезать изображение в Android? Как правильно восстановить состояние представления после поворота Странное поведение при потоковой передаче через Android MediaPlayer на HTC Desire с Android 2.2

Как сохранить разрешение в API API 19 (KitKat)?

В моем приложении я сохраняю путь изображения в моем SQlite db для дальнейшего использования. Путь, который я получаю, это

content://com.android.providers.media.documents/document/image%3A71964 

Когда я извлекаю этот путь из базы данных и пытаюсь извлечь изображение с этого пути,

 java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{42c84ec8 23911:com.gots.gb/u0a248} (pid=23911, uid=10248) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS 

Согласно https://developer.android.com/guide/topics/providers/document-provider.html#permissions, мне нужно сохранить разрешение, добавив следующий код

 final int takeFlags = intent.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); // Check for the freshest data. getContentResolver().takePersistableUriPermission(uri, takeFlags); 

Когда я добавил этот код к моему классу ImageAdapter, который расширяет броузеры Android-адаптера BaseAdapter

 08-21 02:14:38.530: W/System.err(24452): java.lang.SecurityException: No permission grant found for UID 10248 and Uri content://com.android.providers.media.documents/document/image:71964 

Это важная часть моего кода ImageAdapter

 public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView ; if (convertView == null){ imageView = new ImageView(mContext); imageView.setLayoutParams(new GridView.LayoutParams(185, 185)); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setPadding(8, 8, 8, 8); } else{ imageView = (ImageView)convertView ; } InputStream is = null; Bitmap bitmap = null ; try { Log.d(TAG,String.valueOf(list.get(position))); Intent intent = new Intent(Intent.ACTION_GET_CONTENT); final int takeFlags = intent.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); // Check for the freshest data. if (Build.VERSION.SDK_INT >= 19){ mContext.getContentResolver().takePersistableUriPermission(list.get(position), takeFlags); } is = mContext.getContentResolver().openInputStream(list.get(position)); final BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 8; bitmap = BitmapFactory.decodeStream(is,null, options); is.close(); imageView.setImageBitmap(bitmap); return imageView; } catch (Exception e) { e.printStackTrace(); return null; } 

Что я делаю не так? благодаря

Solutions Collecting From Web of "Как сохранить разрешение в API API 19 (KitKat)?"

Кажется, я решил это. Цель запроса:

 Intent intent; if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){ intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); }else{ intent = new Intent(Intent.ACTION_GET_CONTENT); } intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setType("image/*"); startActivityForResult(Intent.createChooser(intent, getResources().getString(R.string.form_pick_photos)), REQUEST_PICK_PHOTO); 

И onActivityResult

 ... // kitkat fixed (broke) content access; to keep the URIs valid over restarts need to persist access permission if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { final int takeFlags = data.getFlags() & Intent.FLAG_GRANT_READ_URI_PERMISSION; ContentResolver resolver = getActivity().getContentResolver(); for (Uri uri : images) { resolver.takePersistableUriPermission(uri, takeFlags); } } ... 

Я не тестировал этот pre-kitkat, мой телефон работает 5.1, может ли кто-нибудь проверить это на старых телефонах?

Код, указанный ниже,

 // kitkat fixed (broke) content access; to keep the URIs valid over restarts need to persist access permission if(Utils.isKitkat()) { final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION); ContentResolver resolver = getActivity().getContentResolver(); for (Uri uri : images) { resolver.takePersistableUriPermission(uri, takeFlags); } } 

Работал отлично для меня, в любом случае я заметил, что максимальное количество сохраняемых uri, предоставленных моему приложению, ограничено 128. Если я выберу более 128 uri, я получаю ошибку:

 java.lang.SecurityException: Permission Denial: opening provider........ 

Просто когда я пытаюсь обработать изображение, для которого я не смог сохранить разрешение. Можете ли вы найти решение?