Chcę napisać moduł, w którym po kliknięciu przycisku otwiera się kamera i mogę kliknąć i zrobić zdjęcie. Jeśli obraz mi się nie podoba, mogę go usunąć i kliknąć jeszcze jeden obraz, a następnie wybrać obraz, który powinien powrócić i wyświetlić ten obraz w działaniu.
278
Odpowiedzi:
Oto przykładowe działanie, które uruchomi aplikację aparatu, a następnie pobierze obraz i wyświetli go.
Pamiętaj, że sama aplikacja aparatu umożliwia przeglądanie / ponowne zapisywanie obrazu, a po zaakceptowaniu obrazu aktywność wyświetla go.
Oto układ, którego używa powyższe działanie. Jest to po prostu LinearLayout zawierający przycisk o identyfikatorze button1 i ImageView o identyfikatorze imageview1:
I jeszcze jeden szczegół, koniecznie dodaj:
a jeśli aparat jest opcjonalny w stosunku do funkcji Twojej aplikacji. upewnij się, że ustawiłeś opcję false w pozwoleniu. lubię to
do pliku manifest.xml.
źródło
<uses-feature/>
zandroid:required="false"
atrybutu:<uses-feature android:name="android.hardware.camera" android:required="false"></uses-feature>
Bitmap photo = (Bitmap) data.getExtras().get("data");
nie przechwytuje zrobionego zdjęcia. Pobiera miniaturę wykonanego zdjęcia.Aktualizacja (2020)
Google dodał nowy
ActivityResultRegistry
interfejs API, który „pozwala obsłużyćstartActivityForResult()
+onActivityResult()
jakrequestPermissions()
+onRequestPermissionsResult()
płynie bez przesłanianie metod w swojej działalności lub fragment przynosi zwiększone bezpieczeństwo typu urządzeńActivityResultContract
, a także zapewnia haki do testowania tych przepływów” - źródło .Interfejs API został dodany w androidx.activity 1.2.0-alpha02 i androidx.fragment 1.3.0-alpha02 .
Możesz teraz zrobić coś takiego:
Przejrzyj dokumentację, aby dowiedzieć się, jak korzystać z nowego interfejsu API wyników działania: https://developer.android.com/training/basics/intents/result#kotlin
Istnieje wiele wbudowanych działań ActivityResultContracts, które pozwalają wykonywać różne czynności, takie jak wybieranie kontaktów, uzyskiwanie uprawnień, robienie zdjęć lub nagrywanie filmów. Prawdopodobnie interesuje Cię ActivityResultContracts.TakePicture pokazany powyżej.
Zauważ, że androidx.fragment 1.3.0-alpha04 deprecates z
startActivityForResult()
+onActivityResult()
irequestPermissions()
+onRequestPermissionsResult()
API na fragmentem. Dlatego wydaje się, żeActivityResultContracts
od teraz jest to nowy sposób robienia rzeczy.Oryginalna odpowiedź (2015)
Zajęło mi to kilka godzin, żeby to zadziałało. Kod to prawie kopiowanie-wklej z developer.android.com , z niewielką różnicą.
Poproś o pozwolenie na
AndroidManifest.xml
:Na twoim
Activity
, zacznij od zdefiniowania tego:Następnie uruchom to
Intent
wonClick
:Dodaj następującą metodę obsługi:
Następnie otrzymaj wynik:
To, co sprawiło, że działało
MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath))
, różni się od kodu z developer.android.com . Oryginalny kod dał miFileNotFoundException
.źródło
android.os.FileUriExposedException: file:///storage/emulated/0/Pictures/JPEG_20180823_102340_722874009725833047.jpg exposed beyond app through ClipData.Item.getUri()
. Masz pomysł, jak to naprawić? @AlbertVilaCalvostorageDir = Context.getFilesDir();
zamiast plikustorageDir = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES);
. W przeciwnym razie dostaję błąd odmowy uprawnień.Zrób zdjęcie + wybierz z galerii:
źródło
ResultCode == 1
w środkuResultCode == RESULT_OK
?requestCode==1
pomaga zidentyfikować który zainicjował żądanie.Wiem, że to dość stary wątek, ale wszystkie te rozwiązania nie są kompletne i nie działają na niektórych urządzeniach, gdy użytkownik obraca kamerę, ponieważ dane w onActivityResult są zerowe. Oto rozwiązanie, które przetestowałem na wielu urządzeniach i jak dotąd nie napotkałem żadnego problemu.
Najpierw zadeklaruj swoją zmienną Uri w swojej aktywności:
Następnie utwórz folder tymczasowy do przechowywania przechwyconego obrazu i zrób zamiar przechwycenia obrazu za pomocą aparatu:
A teraz nadchodzi jedna z najważniejszych rzeczy, musisz zapisać swoją ścieżkę uriFilePath w onSaveInstanceState, ponieważ jeśli tego nie zrobiłeś, a użytkownik obróciłby urządzenie podczas korzystania z kamery, twój identyfikator uri byłby zerowy.
Następnie zawsze powinieneś odzyskać swoje URI w metodzie onCreate:
I tutaj jest ostatnia część, aby wprowadzić swój Uri do onActivityResult:
PS Nie zapomnij dodać uprawnień do aparatu i rozszerzenia. zapisywanie w pamięci do manifestu.
źródło
Tutaj możesz otworzyć kamerę lub galerię i ustawić wybrane zdjęcie w widoku obrazu
Dodaj uprawnienia w manifeście
W funkcji onCreate ()
Pokaż okno dialogowe opcji (aby wybrać obraz z kamery lub galerii)
Pobierz zdjęcie z galerii
Pobierz zdjęcie z aparatu
Po wybraniu lub zarejestrowaniu obrazu,
Teraz nadszedł czas, aby zapisać zdjęcie
Prośba o pozwolenie
źródło
Musisz przeczytać o kamerze . (Myślę, że aby zrobić to, co chcesz, musisz zapisać bieżący obraz w aplikacji, wybrać / usunąć tam, a następnie przywołać aparat, aby spróbować ponownie, zamiast ponawiać próbę bezpośrednio w aparacie).
źródło
Oto kod, którego użyłem do przechwytywania i zapisywania obrazu z kamery, a następnie wyświetlania go do podglądu obrazu. Możesz używać zgodnie ze swoimi potrzebami.
Musisz zapisać obraz z kamery w określonej lokalizacji, a następnie pobrać z tej lokalizacji, a następnie przekonwertować na tablicę bajtów.
Oto metoda otwierania rejestrowania aktywności obrazu z kamery.
wtedy twoja metoda onActivityResult () powinna wyglądać tak.
Oto metoda getBitmap () używana w onActivityResult (). Zrobiłem wszystkie ulepszenia wydajności, które są możliwe podczas uzyskiwania bitmapy obrazu z kamery.
Mam nadzieję, że to pomoże!
źródło
Zrób zdjęcie z aparatu + wybierz obraz z galerii i ustaw go w tle układu lub podglądu obrazu. Oto przykładowy kod.
źródło
W działaniu:
w layout.xml:
w pliku manifest.xml:
źródło
Możesz użyć niestandardowej kamery z miniaturą. Możesz obejrzeć mój projekt .
źródło
Utworzyłem okno dialogowe z opcją wyboru obrazu z galerii lub aparatu. z oddzwanianiem jak
Najpierw musimy zdefiniować uprawnienia w AndroidManifest, ponieważ musimy pisać zewnętrzny sklep podczas tworzenia pliku i czytania obrazów z galerii
Utwórz xml ścieżki do pliku w app / src / main / res / xml / file_paths.xml
ze ścieżką
Następnie musimy zdefiniować dostawcę plików w celu wygenerowania treści Uri w celu uzyskania dostępu do pliku przechowywanego w pamięci zewnętrznej
Układ Dailog
ImagePicker Dailog
}
Wywołaj działanie lub fragment taki jak ten Zdefiniuj ImagePicker we fragmencie / działaniu
Następnie zadzwoń do dailog po kliknięciu przycisku
źródło
Oto pełny kod:
Pamiętaj, aby również dodać uprawnienia do kamery.
źródło
Możesz użyć tego kodu do nasłuchiwania onClick (możesz użyć ImageView lub przycisku)
Aby wyświetlić na swoim imageView
Uwaga: wstaw to do manifestu
źródło
Użyj poniższego kodu, aby zrobić zdjęcie za pomocą aparatu mobilnego. Jeśli używasz Androida o wersji wyższej niż Lolipop, powinieneś również dodać prośbę o pozwolenie.
źródło
Bitmap photo = (Bitmap) data.getExtras().get("data");
pobiera miniaturę z aparatu. Jest artykuł o tym, jak przechowywać zdjęcie w pamięci zewnętrznej z aparatu. przydatny linkźródło
Wykonaj ten przykład z tą implementacją, korzystając z obsługi Kotlin i Andoirdx:
A wynik działania:
Możesz uzyskać więcej szczegółów na https://github.com/joelmmx/take_photo_kotlin.git
Mam nadzieję, że Ci to pomoże!
źródło