Аз съм доста нов в света на 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, който все още работи за моята програма (като например да прочетете списъка с файлове на 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, за да получа Bitmap чрез 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 null след извикване на MediaStore.Images.Media.GetBitmap.
Предполагам, че съм напълно погрешен в подхода си, но прекарах няколко дни в опити и гугъл без никакъв резултат.
Всяка помощ за това как да получите растерно изображение от снимки, направени от приложение на трета страна в 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