Как получить результат камеры как URI в папке данных?
Я создаю приложение, в котором я хочу захватить изображение, а затем я хочу отправить это изображение в электронном письме в виде вложения.
Я открываю камеру используяandroid.provider.MediaStore.ACTION_IMAGE_CAPTURE
намеренное действие, и я передаю Uri файла в качестве параметраEXTRA_OUTPUT
чтобы вернуть изображение в файл. Это работает отлично, и я могу получить захваченное изображение, если я используюexternal storage uri
какEXTRA_OUTPUT
но если я использую папку данных URI, она не работает, и камера не закрывается, и все ее кнопки не работают.
Вот мой код для получения результата в каталоге внешнего хранилища
<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>
И этот код для получения изображения в папке данных
<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>
Я знал, чтоdata folder is not accessible to third application возможно, это вызывает проблему, поэтому я должен создать один поставщик контента для общего доступа к файлу.
Вот мой контент предоставит класс
<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>
Таким образом, чтобы использовать этот контент, я использую следующий код, чтобы передать URI для активности камеры
<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>
Теперь, если я передаю URL-адрес, отличный от каталога внешнего хранилища, камера открывается, но не закрывается в эмуляторе, а в устройстве камера закрывается, но я не получаю результат.
Я объявил, что это содержание предоставить в файле манифеста
<code><provider android:name=".contentproviders.MyContentProvider" android:authorities="x.y.z" /> </code>
Также я дал разрешение наwrite the external storage а также дляuse the camera.
Я могу захватить изображение, используя внешнее хранилище, но я хочу сохранить изображение в каталоге данных вместо внешнего хранилища, потому что, если внешнее хранилище недоступно, я хочу захватить изображение и отправить почту.
Если я создаю контент, то могу также поделиться своим изображением с приложением электронной почты.
If we not provide the extras with the camera intent it will return the image as a byte[] in the activity result as a data extra but this is for the purpose of the thumbnail so I can't get the high resolution image using this way.