Como obter o resultado da câmera como uri na pasta de dados?

Eu estou criando um aplicativo no qual eu quero capturar uma imagem e, em seguida, quero enviar essa imagem no email como um anexo.

Eu estou abrindo uma câmera usandoandroid.provider.MediaStore.ACTION_IMAGE_CAPTURE ação intent e eu estou passando o Uri do arquivo como um parâmetroEXTRA_OUTPUT para obter a imagem de volta ao arquivo. Isso está funcionando perfeitamente e eu sou capaz de obter a imagem capturada se eu usar oexternal storage uri como umEXTRA_OUTPUT mas se eu usar a pasta de dados uri não está funcionando e a câmera não está fechando e todos os seus botões não estão funcionando.

Aqui está o meu código para obter o resultado no diretório de armazenamento 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>

E esse código é para obter a imagem na pasta de dados

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

Eu sabia que opasta de dados não está acessível ao terceiro aplicativo Portanto, isso pode causar um problema, por isso criei um provedor de conteúdo para compartilhar o arquivo.

Aqui está o meu conteúdo fornecer classe

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

Então, para usar este conteúdo, estou usando o seguinte código para passar o uri para a atividade da câmera

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

Agora, se eu passar o url outro diretório de armazenamento externo, em seguida, a câmera está abrindo, mas não está fechando no emulador, mas no dispositivo a câmera vai fechada, mas eu não estou recebendo o resultado.

Eu declarei este conteúdo fornecido no arquivo de manifesto

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

Também dei a permissão paraescreva o armazenamento externo e também parause a câmera.

Eu sou capaz de capturar a imagem usando o armazenamento externo, mas eu quero armazenar a imagem no diretório de dados em vez de armazenamento externo, porque se o armazenamento externo não estiver disponível eu quero capturar a imagem e deseja enviar e-mail.

Se eu criar conteúdo, então também posso compartilhar minha imagem para o aplicativo de e-mail.

Se não fornecermos os extras com a intenção da câmera, ela retornará a imagem como um byte [] no resultado da atividade como um extra de dados, mas isso é para o propósito da miniatura, então não consigo obter a imagem de alta resolução usando esse caminho .

questionAnswers(6)

yourAnswerToTheQuestion