Я новичок в мире Android, и у меня возникают проблемы с приложением, написанным в среде Xamarin Android Mono.
Мне нужно обновить Android Target API как минимум до 29 (лучше до 30), и я застрял на изменении объема хранилища. Хотя я смог управлять своими собственными снимками, сделанными камерой (представляя FileProvider), у меня все еще есть проблема с внешними изображениями, сделанными приложением Microsoft Office Lens (хранящимся в общей папке Pictures/Office Lens).
Подводя итог, я использую для вызова OfficeLens намерение из моего приложения:
StartActivity(Android.App.Application.Context.PackageManager.GetLaunchIntentForPackage("com.microsoft.office.officelens"))
проверка новых файлов с помощью устаревшего GetExternalStoragePublicDirectory, который все еще работает для моего porpouse (например, чтение списка файлов Office Lens, чтобы найти новые):
var TmpDir = new File(Environment.GetExternalStoragePublicDirectory(Environment.DirectoryPictures), "Office Lens");
Прочитайте NewFiles, сохранив пути в список:
var LstFilesNew = new List<string>();
...
foreach (var I in TmpDir.ListFiles())
{
if (I.IsFile == true)
{
LstFilesNew.Add(I.Path);
}
}
Раньше просто вызывали эту функцию, передавая FilePath для получения BitMap:
public static Bitmap LoadBitmap(this string fileName)
{
var options = new BitmapFactory.Options();
options.InJustDecodeBounds = false;
return BitmapFactory.DecodeFile(fileName, options);
}
С хранилищем с областью действия я пытаюсь получить URI из URI, чтобы получить растровое изображение через MediaStore:
foreach (var FileNew in LstFilesNew)
{
if (Build.VERSION.SdkInt >= BuildVersionCodes.Q)
{
ContentValues contentValues = new ContentValues();
contentValues.Put(MediaStore.MediaColumns.DisplayName, FileNew);
contentValues.Put(MediaStore.MediaColumns.MimeType, "image/jpg");
contentValues.Put(MediaStore.MediaColumns.RelativePath, Environment.DirectoryPictures);
Uri imageUri = Application.Context.ContentResolver.Insert(MediaStore.Images.Media.ExternalContentUri, contentValues);
fos = Application.Context.ContentResolver.OpenOutputStream(imageUri);
Android.Graphics.Bitmap finalBitmap = MediaStore.Images.Media.GetBitmap(Application.Context.ContentResolver, imageUri);
finalBitmap.Compress(Android.Graphics.Bitmap.CompressFormat.Jpeg, 100, fos);
fos.Close();
}
}
Мой URI кажется в порядке (content://media/external/images/media/1563), но я получаю нулевое значение finalBitmap после вызова MediaStore.Images.Media.GetBitmap.
Думаю, я совершенно ошибаюсь в своем подходе, но я потратил несколько дней на попытки поиска в Google без каких-либо результатов.
Любая помощь в том, как получить растровое изображение из изображений, сделанных сторонним приложением в Pictures/xxx, будет очень признательна.
Заранее спасибо, здравствуйте
Whether before simply used to call this function passing the FilePath to get the BitMap
Хорошо. А если вы используете его на устройстве Android 11? Тогда это работает? Вы не сказали нам. А на устройстве Android 10? Я думаю, что если вы можете перечислить эти файлы, вы также можете их загрузить. Но может и нет... - person blackapps   schedule 28.01.2021public static Bitmap LoadBitmap(this string fileName)
Только имя файла не подойдет.public static Bitmap LoadBitmap(string path)
- person blackapps   schedule 28.01.2021