IS_PENDING по умолчанию равен 1?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 IS_PENDING по умолчанию равен 1?

Сообщение Anonymous »

У меня наблюдается странное поведение с файлами IS_PENDING и MediaStore. Документация очень ясна:

Если ваше приложение выполняет потенциально трудоемкие операции, такие как
запись в медиафайлы, полезно иметь монопольный доступ к
файлу во время его обработки. На устройствах под управлением Android 10 или
более поздней версии ваше приложение может получить этот эксклюзивный доступ, установив значение
флага IS_PENDING равным 1. Только ваше приложение сможет просматривать файл, пока ваше
приложение не изменит значение IS_PENDING обратно на 0.

Похоже, что IS_PENDING полностью управляется моим приложением. Тем не менее, я столкнулся с ситуацией, когда похоже, что IS_PENDING автоматически устанавливается MediaStore, потому что я вынужден установить его на 0, чтобы все работало.
Ситуация такова: я создаю изображение в загрузках, используя что-то вроде этого:

Код: Выделить всё

values.put(MediaStore.Downloads.DISPLAY_NAME, "foo.png");
values.put(MediaStore.Downloads.MIME_TYPE, "image/png");
values.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);
target = MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
uri = resolver.insert(target, values);
pfd = resolver.openFileDescriptor(uri, "w");
...
pfd.close();
Теперь я пытаюсь запросить размер этого вновь созданного файла сразу после его закрытия, используя что-то вроде этого:

Код: Выделить всё

cursor = resolver.query(uri, new String[]{OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE}, null, null, null);
cursor.moveToFirst();
size = cursor.getLong(1)
Удивительно, но SIZE равен 0, хотя это явно не размер файла, поскольку я записал в него несколько байтов.
К моему большому замешательству, я могу легко решить проблему, просто установив для IS_PENDING значение 0 в Uri, например:

Код: Выделить всё

ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.IS_PENDING, 0);
resolver.update(uri, values, null, null);
Если я сделаю это после pfd.close(), то я смогу запросить SIZE, и он вернет правильный размер файла вместо 0. Но такое поведение не имеет для меня смысла, потому что я никогда не устанавливал IS_PENDING равным 1, так почему же мне вдруг придется снова установить его на 0?
Вот почему я хотел бы попросить дать некоторое объяснение этому поведению. Может быть, MediaStore автоматически присваивает IS_PENDING значение 1, или почему я наблюдаю такое странное поведение?
Моя тестовая система — Android 16, целевой SDK — 35.

Подробнее здесь: https://stackoverflow.com/questions/798 ... fault-to-1
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»