To, co próbuję zrobić, wydaje się bardzo proste, ale po kilku dniach poszukiwań nie mogę tego zrozumieć.
Mam aplikację, która pozwala użytkownikowi wybrać wiele (do 5) obrazów. Używam ImageView
. Gdy użytkownik kliknie ImageView
, chcę dać mu opcję
- Wybierz obraz z galerii lub
- Użyj aparatu, aby zrobić zdjęcie.
Zacząłem od ACTION_GET_CONTENT
zamiaru, a to dobrze sprawdza się w przypadku dotarcia do galerii. Więc spróbowałem użyć ACTION_PICK_ACTIVITY
intencji, aby pozwolić użytkownikowi wybrać aparat lub galerię:
Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);
Intent gallIntent=new Intent(Intent.ACTION_GET_CONTENT);
gallIntent.setType("image/*");
Intent camIntent = new Intent("android.media.action.IMAGE_CAPTURE");
pickIntent.putExtra(Intent.EXTRA_INTENT, camIntent);
pickIntent.putExtra(Intent.EXTRA_INTENT, gallIntent)
pickIntent.putExtra(Intent.EXTRA_TITLE, "Select Source");
startActivityForResult(pickIntent, IMAGE_SELECTOR);
Ale wygląda na to, że mogę dodać tylko jeden EXTRA_INTENT
. Menu wyświetla się zgodnie z oczekiwaniami, ale jedynymi opcjami są Galeria i Pliki .... bez aparatu).
Czy istnieje lepszy / łatwiejszy sposób na zrobienie tego, którego mi brakuje? Dzięki za wszelką pomoc.
Odpowiedzi:
Będziesz musiał utworzyć własne okno dialogowe wyboru, łącząc oba wyniki rozwiązywania intencji.
Aby to zrobić, musisz wysłać zapytanie do PackageManager za pomocą PackageManager.queryIntentActivities () dla obu pierwotnych zamiarów i utworzyć ostateczną listę możliwych intencji z jedną nową intencją dla każdego pobranego działania, takiego jak to:
(Napisałem to bezpośrednio tutaj, więc może się nie skompilować)
Następnie, aby uzyskać więcej informacji na temat tworzenia niestandardowego okna dialogowego z listy, zobacz https://developer.android.com/guide/topics/ui/dialogs.html#AlertDialog
źródło
Jak uruchomić pojedynczy zamiar, aby wybrać obrazy z Galerii lub Aparatu lub dowolnej aplikacji zarejestrowanej do przeglądania systemu plików.
Zamiast tworzyć okno dialogowe z listą opcji intencji, znacznie lepiej jest użyć programu Intent.createChooser, aby uzyskać dostęp do graficznych ikon i krótkich nazw różnych aplikacji „Aparat”, „Galeria”, a nawet przeglądarki systemów plików innych firm takie jak „Astro” itp.
Opisuje, jak używać standardowej intencji wybieracza i dodawać do niej dodatkowe intencje.
źródło
final String fname = Utils.getUniqueImageFilename();
nie działa ... jest napisaneUtils cannot be resolved
:(Utils.getUniqueImageFilename()
to moja własna metoda generowania unikatowej nazwy pliku. Można to zrobić na wiele sposobów. Jednym z najprostszych jest użycie czegoś takiego jak"img_"+ System.currentTimeMillis() + ".jpg"
. Innym jestFile.createTempFile()
.if (data == null || data.getData() == null)
.Znalazłem to . Za pomocą:
z jednej strony pokazuje użytkownikowi opcję wyboru „dokumentów” w Androidzie 4, co wydało mi się bardzo mylące. Użycie tego zamiast tego pokazuje opcję „galeria”:
źródło
Miałem też ten problem i stworzyłem AlertDialog i użyłem metody setItems () wraz z detektorem DialogInterface:
źródło
Połączyłem niektóre rozwiązania, aby w pełni wykorzystać do wybierania obrazu z Galerii lub Aparatu. Oto funkcje narzędzia ImagePicker (również w bibliotece Github ):
Zrzut ekranu:
Edycja : Oto fragment kodu, aby uzyskać połączone intencje dla aplikacji Galeria i Aparat. Możesz zobaczyć pełny kod w ImagePicker util (również w bibliotece Github ):
źródło
getRotationFromCamera
(ImagePicker.java
) i jaką wartość zwraca? W którym telefonie testujesz?boolean isCamera = (imageReturnedIntent == null || imageReturnedIntent.getData() == null);
ten kod pomoże ci, ponieważ są dwa przyciski, jeden do aparatu, a drugi do galerii, a obraz zostanie wyświetlony w ImageView
https://github.com/siddhpuraamitr/Choose-Image-From-Gallery-Or-Camera
źródło
Dla tych, którzy otrzymują błąd w wersji 4.4 w górę, próbując użyć wyboru obrazu, mogą użyć poniższego kodu.
Zamiast tworzyć okno dialogowe z listą opcji intencji, znacznie lepiej jest użyć programu Intent.createChooser, aby uzyskać dostęp do graficznych ikon i krótkich nazw różnych aplikacji „Aparat”, „Galeria”, a nawet przeglądarki systemów plików innych firm takie jak „Astro” itp.
Opisuje, jak używać standardowej intencji wybieracza i dodawać do niej dodatkowe intencje.
źródło
Powinno to rozwiązać problem z pustym plikiem outputFileUri Tiny:
Uwaga: używam tego kodu w android.support.v4.app.Fragment Twoje nadpisane metody mogą się zmienić w zależności od używanej wersji fragmentu / działania.
źródło
Możesz utworzyć okno dialogowe opcji
Otwarta kamera:
Otwórz galerię:
Aby uzyskać wynik selekcji
Metoda zapisywania przechwyconego obrazu
źródło
Rozwiązano problem ze zbyt dużym obrazem i uniknięto braku pamięci.
źródło
Dodając moje rozwiązanie - zwróci callback bez względu na to, czy będzie z kamery, czy z kuchni obok intencji:
źródło
Możesz spróbować tego:
źródło
Jest to proste dzięki zastosowaniu AlertDialog i Intent.ACTION_PICK
źródło
Opierając się na odpowiedzi Davida, moje dwa pensy za
onActivityResult()
część. Dba o zmiany wprowadzone w 5.1.1 i wykrywa, czy użytkownik wybrał jeden, czy wiele obrazów z biblioteki.źródło
Spróbuj w ten sposób
Następnie utwórz metodę onactivityresult i zrób coś takiego
Zobacz ten http://www.theappguruz.com/blog/android-take-photo-camera-gallery-code-sample
źródło
Ciężko pracowałem nad wyborem obrazu w aparacie lub galerii i stworzyłem klasę użytkową dla tej pracy. Przy użyciu tej klasy „Wybór aparatu fotograficznego lub galerii jest zbyt łatwy” zajęło Ci to 5-10 minut.
ImagePickerUtils: - http://www.codesend.com/view/f8f7c637716bf1c693d1490635ed49b3/
BitmapUtils: - http://www.codesend.com/view/81c1c2a3f39f1f7e627f01f67be282cf/
ConvertUriToFilePath: - http://www.codesend.com/view/f4668a29860235dd1b66eb419c5a58b5/
MediaUtils: - https://codeshare.io/5vKEMl
Musimy dodać te uprawnienia w menifest:
Ta funkcja klasy (checkAndRequestPermissions) automatycznie sprawdza uprawnienia w Android-Marshmallow i Android-Nougat.
Mam nadzieję, że ci to pomoże. Jeśli ktoś ma sugestie dotyczące ulepszenia tych zajęć, dodaj swoją recenzję w komentarzach.
źródło
Jak podaje David Manpearl,
https://stackoverflow.com/a/12347567/7226732
musimy tylko zmodyfikować onActivityResult () jak
i ustaw przechwytywanie lub wybierz obrazy w widoku obrazu.
źródło