Как получить результат камеры как 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.

Ответы на вопрос(6)

Ваш ответ на вопрос