Создайте многоразовую камеру и галерею ⇐ Android
-
Anonymous
Создайте многоразовую камеру и галерею
Я хочу создать класс для управления камерой и галереей, который я смогу использовать с разными фрагментами.
import androidx.appcompat.app.AppCompatActivity; импортировать androidx.activity.result.ActivityResultLauncher; импортировать androidx.activity.result.contract.ActivityResultContracts; импортировать android.app.Activity; импортировать android.content.Context; импортировать android.content.Intent; импортировать android.graphics.Bitmap; импортировать android.os.Environment; импортировать android.provider.MediaStore; импортировать java.io.FileOutputStream; импортировать java.io.IOException; импортировать java.io.OutputStream; импортировать java.text.SimpleDateFormat; импортировать java.util.Date; импортировать java.util.Locale; публичный класс GalleryAndCamera { частная деятельность; частный ActivityResultLauncher takePictureLauncher; частный ActivityResultLauncher PickImageLauncher; частный ImageCaptureListener imageCaptureListener; public GalleryAndCamera (активность AppCompatActivity) { this.activity = активность; takePictureLauncher = Activity.registerForActivityResult( новый ActivityResultContracts.StartActivityForResult(), результат -> { if (result.getResultCode() == Activity.RESULT_OK) { Данные намерения = result.getData(); если (данные!= ноль) { Растровое фото = (Растровое изображение) data.getExtras().get("data"); saveImageToGallery(photo, Activity.getApplicationContext()); imageCaptureListener.onImageCaptured(фото); } } else if (result.getResultCode() == Activity.RESULT_CANCELED) { } } ); PickImageLauncher = Activity.registerForActivityResult( новый ActivityResultContracts.StartActivityForResult(), результат -> { if (result.getResultCode() == Activity.RESULT_OK) { Данные намерения = result.getData(); если (данные!= ноль) { } } else if (result.getResultCode() == Activity.RESULT_CANCELED) { } } ); } общественная недействительность takePicture() { Намерение cameraIntent = новое намерение (MediaStore.ACTION_IMAGE_CAPTURE); takePictureLauncher.launch(cameraIntent); } общественный недействительный PickImage () { Намерение галереиIntent = новое намерение (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); PickImageLauncher.launch(galleryIntent); } public void setImageCaptureListener (прослушиватель ImageCaptureListener) { this.imageCaptureListener = прослушиватель; } } публичный класс Myfragment расширяет Fragment и реализует ImageCaptureListener{ @Override public View onCreateView(@NonNull LayoutInflater инфлятор, контейнер @Nullable ViewGroup, @Nullable Bundle saveInstanceState) { привязка = FragmentMyfragmentBinding.inflate(инфлятор, контейнер, ложь); Просмотр представления =binding.getRoot(); GalleryAndCamera GalleryAndCamera = новая GalleryAndCamera((AppCompatActivity) requireActivity()); привязка.idBtnWDCamera.setOnClickListener(новый View.OnClickListener() { @Override public void onClick (Просмотр) { Helper.clickSound(getContext()); Обработчик изображения(); } }); } проблема: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основное Процесс: com.hepszolg.birdcontrol, PID: 11293 java.lang.IllegalStateException: LifecycleOwner com.myproject.MainActivity@288c540 пытается зарегистрироваться, хотя текущее состояние ВОЗОБНОВЛЕНО. Владельцы жизненного цикла должны вызвать регистр перед их ЗАПУСКОМ.
Я хочу создать класс для управления камерой и галереей, который я смогу использовать с разными фрагментами.
import androidx.appcompat.app.AppCompatActivity; импортировать androidx.activity.result.ActivityResultLauncher; импортировать androidx.activity.result.contract.ActivityResultContracts; импортировать android.app.Activity; импортировать android.content.Context; импортировать android.content.Intent; импортировать android.graphics.Bitmap; импортировать android.os.Environment; импортировать android.provider.MediaStore; импортировать java.io.FileOutputStream; импортировать java.io.IOException; импортировать java.io.OutputStream; импортировать java.text.SimpleDateFormat; импортировать java.util.Date; импортировать java.util.Locale; публичный класс GalleryAndCamera { частная деятельность; частный ActivityResultLauncher takePictureLauncher; частный ActivityResultLauncher PickImageLauncher; частный ImageCaptureListener imageCaptureListener; public GalleryAndCamera (активность AppCompatActivity) { this.activity = активность; takePictureLauncher = Activity.registerForActivityResult( новый ActivityResultContracts.StartActivityForResult(), результат -> { if (result.getResultCode() == Activity.RESULT_OK) { Данные намерения = result.getData(); если (данные!= ноль) { Растровое фото = (Растровое изображение) data.getExtras().get("data"); saveImageToGallery(photo, Activity.getApplicationContext()); imageCaptureListener.onImageCaptured(фото); } } else if (result.getResultCode() == Activity.RESULT_CANCELED) { } } ); PickImageLauncher = Activity.registerForActivityResult( новый ActivityResultContracts.StartActivityForResult(), результат -> { if (result.getResultCode() == Activity.RESULT_OK) { Данные намерения = result.getData(); если (данные!= ноль) { } } else if (result.getResultCode() == Activity.RESULT_CANCELED) { } } ); } общественная недействительность takePicture() { Намерение cameraIntent = новое намерение (MediaStore.ACTION_IMAGE_CAPTURE); takePictureLauncher.launch(cameraIntent); } общественный недействительный PickImage () { Намерение галереиIntent = новое намерение (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); PickImageLauncher.launch(galleryIntent); } public void setImageCaptureListener (прослушиватель ImageCaptureListener) { this.imageCaptureListener = прослушиватель; } } публичный класс Myfragment расширяет Fragment и реализует ImageCaptureListener{ @Override public View onCreateView(@NonNull LayoutInflater инфлятор, контейнер @Nullable ViewGroup, @Nullable Bundle saveInstanceState) { привязка = FragmentMyfragmentBinding.inflate(инфлятор, контейнер, ложь); Просмотр представления =binding.getRoot(); GalleryAndCamera GalleryAndCamera = новая GalleryAndCamera((AppCompatActivity) requireActivity()); привязка.idBtnWDCamera.setOnClickListener(новый View.OnClickListener() { @Override public void onClick (Просмотр) { Helper.clickSound(getContext()); Обработчик изображения(); } }); } проблема: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основное Процесс: com.hepszolg.birdcontrol, PID: 11293 java.lang.IllegalStateException: LifecycleOwner com.myproject.MainActivity@288c540 пытается зарегистрироваться, хотя текущее состояние ВОЗОБНОВЛЕНО. Владельцы жизненного цикла должны вызвать регистр перед их ЗАПУСКОМ.
Мобильная версия