Pergunta

Eu tenho algumas imagens armazenadas em getExternalFilesDir() e estou tentando mostrar essas imagens na galeria do Android (cooliris).Agora eu tenho feito isso:

Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(imgPath,"image/*");
startActivity(intent);

Mas nada acontece.Eu mudei o setDataAndType para isto:

intent.setDataAndType(Uri.fromFile(new File(imgPath)),"image/*");

Dessa forma funciona, mas leva de 5 a 10 segundos para a galeria passar de uma tela preta para mostrar minha imagem.

De qualquer forma, para resolver isso ou alguma abordagem melhor?

Foi útil?

Solução

Ao implementar um provedor de conteúdo de arquivo, você poderá evitar esse atraso de 5 a 10 segundos

import java.io.File;
import java.io.FileNotFoundException;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;

public class FileContentProvider extends ContentProvider {
    private static final String AUTHORITY = "content://com.yourprojectinfo.fileprovider";

    public static Uri constructUri(String url) {
        Uri uri = Uri.parse(url);
        return uri.isAbsolute() ? uri : Uri.parse(AUTHORITY + url);
    }

    public static Uri constructUri(File file) {
        Uri uri = Uri.parse(file.getAbsolutePath());
        return uri.isAbsolute() ? uri : Uri.parse(AUTHORITY
                + file.getAbsolutePath());
    }

    @Override
    public ParcelFileDescriptor openFile(Uri uri, String mode)
            throws FileNotFoundException {
        File file = new File(uri.getPath());
        ParcelFileDescriptor parcel = ParcelFileDescriptor.open(file,
                ParcelFileDescriptor.MODE_READ_ONLY);
        return parcel;
    }

    @Override
    public boolean onCreate() {
        return true;
    }

    @Override
    public int delete(Uri uri, String s, String[] as) {
        throw new UnsupportedOperationException(
                "Not supported by this provider");
    }

    @Override
    public String getType(Uri uri) {
        return "image/jpeg";
    }

    @Override
    public Uri insert(Uri uri, ContentValues contentvalues) {
        throw new UnsupportedOperationException(
                "Not supported by this provider");
    }

    @Override
    public Cursor query(Uri uri, String[] as, String s, String[] as1, String s1) {
        throw new UnsupportedOperationException(
                "Not supported by this provider");
    }

    @Override
    public int update(Uri uri, ContentValues contentvalues, String s,
            String[] as) {
        throw new UnsupportedOperationException(
                "Not supported by this provider");
    }

}

Então você pode ligar

Uri uri = FileContentProvider.constructUri(file);
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(uri,"image/*");
startActivity(intent);

Esta é uma solução estranha, mas acho que tem algo a ver com a forma como o Android abre imagens usando um URI.O método openFile (Uri uri, String mode) está errado/quebrado/não consegue resolver o URI corretamente.Não tenho 100% de certeza, mas achei essa solução alternativa eficaz.

não se esqueça de se registrar no provedor no manifesto

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top