¿Cómo obtener el resultado de la cámara como un uri en la carpeta de datos?

Estoy creando una aplicación en la que quiero capturar una imagen y luego deseo enviar esa imagen en el correo electrónico como un archivo adjunto.

Estoy abriendo una cámara usandoandroid.provider.MediaStore.ACTION_IMAGE_CAPTURE intento de acción y estoy pasando el Uri del archivo como un parámetroEXTRA_OUTPUT para devolver la imagen al archivo. Esto funciona perfectamente y puedo obtener la imagen capturada si uso elexternal storage uri como unEXTRA_OUTPUT pero si uso la carpeta de datos uri, no funciona y la cámara no se cierra y todos sus botones no funcionan.

Aquí está mi código para obtener el resultado en el directorio de almacenamiento externo

<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>

Y este código es para obtener la imagen en la carpeta de datos.

<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>

Yo sabía que elcarpeta de datos no es accesible a la tercera aplicación por lo que puede ser que esto cause un problema, así que he creado un proveedor de contenido para compartir el archivo.

Aquí está mi contenido proporcionar clase

<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>

Entonces, para usar este contenido, estoy usando el siguiente código para pasar el uri a la actividad de la cámara

<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>

Ahora, si paso la url en otro directorio externo de almacenamiento, la cámara se está abriendo pero no se está cerrando en el emulador, pero en el dispositivo la cámara se cerrará, pero no obtendré el resultado.

He declarado este contenido proporcionar en el archivo de manifiesto.

<code><provider
android:name=".contentproviders.MyContentProvider"
android:authorities="x.y.z" />
</code>

También he dado permiso paraescribe el almacenamiento externo y también parausa la camara.

Puedo capturar la imagen utilizando el almacenamiento externo, pero quiero almacenar la imagen en el directorio de datos en lugar del almacenamiento externo porque si el almacenamiento externo no está disponible, quiero capturar la imagen y enviar el correo.

Si creo contenido, también puedo compartir mi imagen con la aplicación de correo electrónico.

Si no proporcionamos los extras con la intención de la cámara, devolverá la imagen como un byte [] en el resultado de la actividad como datos adicionales, pero esto es para el propósito de la miniatura, por lo que no puedo obtener la imagen de alta resolución de esta manera. .

Respuestas a la pregunta(6)

Su respuesta a la pregunta