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 kamerę za pomocąandroid.provider.MediaStore.ACTION_IMAGE_CAPTURE
zamierzone działanie i przekazuję Uri pliku jako parametrEXTRA_OUTPUT
aby przywrócić obraz do pliku. To działa doskonale i jestem w stanie uzyskać przechwycony obraz, jeśli użyjęexternal storage uri
jakEXTRA_OUTPUT
ale jeśli korzystam z folderu danych uri, to nie działa i kamera nie zamyka się, a wszystkie przyciski nie działają.
Oto mój kod, aby uzyskać wynik w zewnętrznym katalogu pamięci
<code>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); </code>
Ten kod służy do pobierania obrazu do folderu danych
<code>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); </code>
Wiedziałem, żefolder danych nie jest dostępny dla trzeciej aplikacji więc może to powodować problem, więc utworzyłem jednego dostawcę treści, aby udostępnić plik.
Oto moje treści, które zapewniają klasę
<code>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); } } </code>
Aby użyć tej zawartości, używam następującego kodu, aby przekazać uri do aktywności kamery
<code>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); </code>
Teraz, jeśli przekazam adres URL innego niż zewnętrzny katalog pamięci, kamera się otwiera, ale nie zamyka się w emulatorze, ale w urządzeniu kamera się zamknie, ale nie otrzymam wyniku.
Oświadczyłem, że ta treść znajduje się w pliku manifestu
<code><provider android:name=".contentproviders.MyContentProvider" android:authorities="x.y.z" /> </code>
Również dałem pozwolenienapisz pamięć zewnętrzną a także dlaużyj aparatu.
Jestem w stanie przechwycić obraz za pomocą pamięci zewnętrznej, ale chcę zapisać obraz w katalogu danych zamiast pamięci zewnętrznej, ponieważ jeśli pamięć zewnętrzna nie jest dostępna, chcę przechwycić obraz i wysłać pocztę.
Jeśli tworzę treść, to mogę również udostępnić mój obraz aplikacji e-mail.
Jeśli nie udostępnimy dodatków z intencją aparatu, obraz zostanie zwrócony jako bajt [] w wyniku działania jako dodatek do danych, ale jest to dla celów miniatury, więc nie mogę uzyskać obrazu o wysokiej rozdzielczości w ten sposób .