Jak uzyskać wynik kamery jako uri w folderze danych?
Tworzę aplikację, w której chcę przechwycić obraz, a następnie chcę wysłać ten obraz w wiadomości e-mail jako załącznik.
Otwieram aparat za pomocą akcji intencyjnej
android.provider.MediaStore.ACTION_IMAGE_CAPTUREi przekazuję plik Uri jako parametr
EXTRA_OUTPUT, aby uzyskać obraz z powrotem do pliku. To działa dobrze i mogę uzyskać przechwycony obraz, jeśli używam
zewnętrznej pamięci masowej, na przykład
EXTRA_OUTPUT, ale jeśli używam folderu uri danych, nie działa, a aparat nie działa nie zamyka się i wszystkie jego przyciski nie działają.
Oto mój kod do pobrania wyniku w katalogu magazynu zewnętrznego
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File out = Environment.getExternalStorageDirectory();
out = new File(out, imagename);
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(out));
startActivityForResult(i, CAMERA_RESULT);
Ten kod służy do pobierania obrazu w folderze danych
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File out = getFilesDir();
out = new File(out, MyPharmacyOptions.PRESCRIPTION_IMAGE_NAME);
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(out));
startActivityForResult(i, CAMERA_RESULT);
wiedziałem to
folder danych nie jest dostępny dla trzeciej aplikacji
więc może to jest przyczyną problemu, więc muszę utworzyć jednego dostawcę zawartości, aby udostępnić plik.
Oto moje zasoby zapewniające najlepsze w swojej klasie
public class MyContentProvider extends ContentProvider {
private static final String Tag = RingtonContentProvider.class.getName();
public static final Uri CONTENT_URI = Uri
.parse("content://x.y.z/");
private static final HashMap<String, String> MIME_TYPES = new HashMap<String, String>(); static {
MIME_TYPES.put(".mp3", "audio/mp3");
MIME_TYPES.put(".wav", "audio/mp3");
MIME_TYPES.put(".jpg", "image/jpeg");
} @Override
public boolean onCreate() {
return true;
} @Override
public String getType(Uri uri) {
String path = uri.toString(); for (String extension : MIME_TYPES.keySet()) {
if (path.endsWith(extension)) {
return (MIME_TYPES.get(extension));
}
} return (null);
} @Override
public ParcelFileDescriptor openFile(Uri uri, String mode)
throws FileNotFoundException {
File f = new File(getContext().getFilesDir(), uri.getPath()); if (f.exists()) {
return (ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY));
} throw new FileNotFoundException(uri.getPath());
} @Override
public Cursor query(Uri url, String[] projection, String selection,
String[] selectionArgs, String sort) {
throw new RuntimeException("Operation not supported");
} @Override
public Uri insert(Uri uri, ContentValues initialValues) {
File file = new File(getContext().getFilesDir(), uri.getPath());
if(file.exists()) file.delete();
try {
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return Uri.fromFile(file);
} @Override
public int update(Uri uri, ContentValues values, String where,
String[] whereArgs) {
throw new RuntimeException("Operation not supported");
} @Override
public int delete(Uri uri, String where, String[] whereArgs) {
File f = new File(getContext().getFilesDir(), "image1.jpg");
if(f.exists()) f.delete();
f = new File(getContext().getFilesDir(), "image2.jpg");
if(f.exists()) f.delete(); getContext().getContentResolver().notifyChange(CONTENT_URI, null); }
}
Dlatego, aby użyć tej zawartości, używam następującego kodu, aby przekazać URI do akcji kamery
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
Uri uri = MyContentProvider.CONTENT_URI;
uri = Uri.withAppendedPath(uri, imagename);
getContentResolver().insert(uri, null);
getContentResolver().notifyChange(RingtonContentProvider.CONTENT_URI, null);
Log.d(Tag, uri.toString());
i.putExtra(MediaStore.EXTRA_OUTPUT, uri);startActivityForResult(i, CAMERA_RESULT);
Teraz jak przekażę url do innego, nie zewnętrznego katalogu pamięci, to aparat otworzy się ale nie zamknie w emulatorze, ale w urządzeniu aparat się zamknie, ale wyniku nie dostanę.
Zadeklarowałem tę treść w moim pliku manifestu
<provider
android:name=".contentproviders.MyContentProvider"
android:authorities="x.y.z"/>
Również dałem pozwolenie
zapis w pamięci zewnętrznej
jak również
użycie aparatu
.
Mogę przechwycić obraz przy użyciu pamięci zewnętrznej, ale chcę przechowywać obraz w katalogu danych zamiast w pamięci zewnętrznej, ponieważ jeśli nie jest dostępna pamięć zewnętrzna, chcę przechwycić obraz i wysłać pocztę.
Jeśli tworzę treść, mogę również udostępnić mój obraz z załącznikiem do wiadomości e-mail.
Jeśli nie dostarczymy dodatków z intencją kamery, zwróci obraz jako bajt [] w wyniku działania jako dodatkowe dane, ale jest to zrobione dla miniatury, więc nie mogę uzyskać wysokiej rozdzielczości obraz w ten sposób.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
6 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
1. zapisz bitmapę otrzymaną z metody
onActivityResult
Możesz uruchomić aparat, chcąc zrobić zdjęcie, używając poniższego kodu
Po zrobieniu zdjęcia otrzymasz mapę bitową w metodzie onActivityResult
Teraz możesz po prostu zapisać tę bitmapę w pamięci wewnętrznej
Uwaga: tutaj obiekt bitmapowy składa się z obrazu kciuka, nie będzie miał obrazu w pełnej rozdzielczości
2. Zapisz mapę bitową bezpośrednio w pamięci wewnętrznej za pomocą dostawcy zawartości
Tutaj utworzymy klasę dostawcy treści, aby umożliwić lokalnemu katalogowi pamięci dostęp do aktywności kamery
Przykład takiego dostawcy wg poniżej
Następnie możesz po prostu użyć URI, aby przejść do aktywności kamery, używając poniższego kodu
Jeśli nie chcesz tworzyć własnego dostawcy, możesz użyć
FileProvider
https://developer.android.com/ ... .html
z biblioteki-wsparcia-v4. Aby uzyskać szczegółowe informacje, możesz spojrzeć na
ten post
https://coderoad.ru/10042695/
Anonimowy użytkownik
Potwierdzenie od:
Wykorzystuje pamięć wewnętrzną!
https:// developer.android.com/link/android/support/v4/content/FileProvider.html
https://developer.android.com/ ... .html
4.1 Zamiar przechwytywania:
4.2 onActivityResult():
Anonimowy użytkownik
Potwierdzenie od:
Następnie weź Bitmapę w
Następnie napisz
to jest w pamięci wewnętrznej, zobacz
https://coderoad.ru/4135927/
Następnie następnym razem przeczytaj ten plik,
Anonimowy użytkownik
Potwierdzenie od:
Następnym celem jest
Anonimowy użytkownik
Potwierdzenie od:
w swoim możesz wziąć kod pozycji:
...
Anonimowy użytkownik
Potwierdzenie od:
w ten sposób, po ponownym uruchomieniu działania, obiekt zawierający ścieżkę lub Uri do przechwyconego obrazu jest aktualizowany (anulowany)
więc sugeruję, abyś złapał/wykrył obiekt zerowy w onActivityResult i poprosił użytkownika o zwolnienie miejsca na urządzeniu lub ponowne uruchomienie telefonu w celu szybkiej tymczasowej naprawy.