我正在 Xamarin 上编写一个项目,我的任务是限制用户从除默认 Android 相机之外的任何应用程序获取照片。我曾尝试使用 ActionImageCapture 打开相机,但遇到了一些问题,特别是在将照片保存到文件时。所以我决定回到 TakePhotoAsync 方法,但我真的不知道如何限制用户选择相机应用程序并在其上启动主 Android 相机。如果您能帮助我一点点,我会感到很自豪!
使用 ActionImageCapture,甚至启动应用程序都遇到麻烦
private void LaunchCamera()
{
try
{
Intent takePictureIntent = new Intent(MediaStore.ActionImageCapture);
if (context != null)
{
if (takePictureIntent.ResolveActivity(context.PackageManager) != null) - problem was here
{
// Создаем временный файл для сохранения изображения
if (photoFile != null)
{
// Получаем URI для временного файла
Android.Net.Uri photoUri = Android.Support.V4.Content.FileProvider.GetUriForFile(context, context.PackageName + ".fileprovider", photoFile);
// Передаем URI в Intent для сохранения изображения
takePictureIntent.PutExtra(MediaStore.ExtraOutput, photoUri);
// Запускаем камеру с запросом на получение результата
PhotoActivity.activityA.StartActivityForResult(takePictureIntent, 1);
}
}
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex);
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if (requestCode == 1)
{
if (resultCode == Result.Ok)
{
Android.Net.Uri imageUri = Android.Support.V4.Content.FileProvider.GetUriForFile(this, this.PackageName + ".fileprovider", PhotoTypeArrayAdapter.photoFile);
try
{
// Открыть поток для чтения изображения
using (var inputStream = Application.Context.ContentResolver.OpenOutputStream(imageUri))
{
if (inputStream != null)
{
// Создайте Bitmap из потока
var javaStream = new Java.IO.BufferedOutputStream(inputStream); - problem was here as well
// Сохраните Bitmap в "Публичные документы"
/*string path = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "saved_image.jpg");
System.IO.File.WriteAllBytes(path, BitmapToByteArray(bitmap));*/
// Дополнительная обработка или сохранение изображения
}
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex);
}
}
else
{
// Обработка случаев, когда операция была отменена или завершилась с ошибкой
}
}
}
var fileApp = await Plugin.Media.CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
{
PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium,
CompressionQuality = 50,
Name = "systemImgApp.jpg",
Directory = "sample"
});
if (fileApp == null)
{
return;
}
Activity.PhotoActivity.imgSave.Text = fileApp.Path;
目前我只有这个,但没有必要选择将启动的应用程序,甚至限制用户选择相机应用程序的能力