2015-01-31 4 views
7

Я использую поставщика контента KITKAT в своем приложении. После получения uri выбранного изображения я храню его в базе данных, чтобы использовать его позже. Проблема в том, что после перезагрузки телефона у меня возникло исключение для разрешения при использовании сохраненного uri.android takePersistableUriPermission не компилируется

После поиска я попытался использовать takePersistableUriPermission() Но по какой-то причине он не компилируется (я использую androidstudio).

Ошибка: должна быть одна или несколько из IntentFLAG_GRANT_READ_URI_PERMISSION или Intent.FLAG_GRANT_WRITE_URI_PERMISSION. Это происходит на второй аргумент метода takePersistableUriPermission (флаг)

Вот код:

Intent intent; 
      if (Build.VERSION.SDK_INT < 19){ 
       intent = new Intent(); 
       intent.setAction(Intent.ACTION_GET_CONTENT); 
       intent.setType("image/*"); 
       startActivityForResult(intent, ANDROID_LESS_19); 
      } else { 
       intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
       intent.addCategory(Intent.CATEGORY_OPENABLE); 
       intent.setType("image/*"); 
       startActivityForResult(intent, ANDROID_MORE_19); 
      }` 

case ANDROID_MORE_19: 
      if(resultCode == RESULT_OK){ 
       Uri selectedImage = data.getData(); 
       mImage = selectedImage.toString(); 
       String[] filePathColumn = {MediaStore.Images.Media.DATA}; 

       // this part means to keep permanent permissions, so no exception after rebooting the device 
       final int takeFlags = data.getFlags() 
         & (Intent.FLAG_GRANT_READ_URI_PERMISSION 
         | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 

       getContentResolver().takePersistableUriPermission(selectedImage, takeFlags); 

       grantUriPermission("com.main.bonappetit", selectedImage, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 

       Cursor cursor = getContentResolver().query(
         selectedImage, filePathColumn, null, null, null); 
       cursor.moveToFirst(); 

       int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
       String filePath = cursor.getString(columnIndex); 
       cursor.close(); 

Кто-то знает, что здесь не так?

+0

Используйте побитового OR вместо AND, чтобы объединить дополнительные флаги. – corsair992

+0

Благодарим вас за ответ. Я попытался заменить его, но у меня все еще такая же ошибка. – totomac

+0

Я, наконец, смог скомпилировать его, используя eclipse вместо androidstudio. – totomac

ответ

17

На Android Studio, я должен был разлагаться линию, чтобы иметь возможность компилировать:

int takeFlags = data.getFlags(); 
takeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
+0

С SDK Tools 26.0.2 исходная конструкция по-прежнему отображается как ошибка, но это ее решает. – user905686

Смежные вопросы