Imagem em getExternalFilesDir()
-
13-12-2019 - |
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?
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