Pergunta

Estou usando o seguinte código para abrir uma galeria dentro do meu aplicativo

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, FIND_RESULT);

É possível limitar uma lista de imagens para mostrar apenas imagens tiradas pela câmera? Galeria de visualização no meu sistema 2.1, as imagens são agrupadas, portanto, deve haver um parâmetro que defina a qual pasta pertence.

Verificando o MediaStore.images.imagecolumns Não encontrei nenhuma coluna que definisse isso.

Eu poderia estar errado? Porque se eu pudesse criar uma consulta para filtrar por pasta e criar minha própria visualização da galeria, meu problema seria resolvido.

Foi útil?

Solução

Você só precisa implementar o MediaSCannerConnectionClient em sua atividade e, depois disso, precisa fornecer o caminho exato de um dos arquivos dentro desse nome de pasta aqui como scan_path e ele digitalizará todos os arquivos que contêm nessa pasta e o abrirão dentro da galeria construída. Então, basta dar o nome de sua pasta e você obterá todos os arquivos dentro, incluindo vídeo. Se você quiser abrir apenas imagens mudam FILE_TYPE="image/*"

public class SlideShow extends Activity implements MediaScannerConnectionClient {

        public String[] allFiles;
        private String SCAN_PATH ;
        private static final String FILE_TYPE = "*/*";
        private MediaScannerConnection conn;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);

            setContentView(R.layout.main);

            File folder = new File("/sdcard/yourfoldername/");
            allFiles = folder.list();

            SCAN_PATH=Environment.getExternalStorageDirectory().toString()+"/yourfoldername/"+allFiles[0];

            Button scanBtn = (Button) findViewById(R.id.scanBtn);
            scanBtn.setOnClickListener(new OnClickListener()
            {
                public void onClick(View v)
                {
                    startScan();
                }
            });
        }

        private void startScan()
        {
            if(conn!=null)
            {
                conn.disconnect();
            }

            conn = new MediaScannerConnection(this, this);
            conn.connect();
        }


        public void onMediaScannerConnected()
        {
            conn.scanFile(SCAN_PATH, FILE_TYPE);    
        }


        public void onScanCompleted(String path, Uri uri)
        {
            try
            {
                if (uri != null) 
                {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(uri);
                    startActivity(intent);
                }
            }
            finally 
            {
                conn.disconnect();
                conn = null;
            }
        }
    }

Outras dicas

Nenhuma das respostas acima está correta, incluindo a marcada como correta.

Aqui está a solução correta real:

O segredo está encontrando o balde/álbum, sua pasta é representada como. Os baldes aparecem após um mídia bem -sucedido, portanto, certifique -se de que as imagens/vídeos que você desejam mostrar sejam primeiro digitalizadas, conforme demonstrado várias vezes acima.

Vamos supor que eu tenha uma pasta indexada em/sdcard/myApp/MyAppsmediaFolder:

String bucketId = "";

final String[] projection = new String[] {"DISTINCT " + MediaStore.Images.Media.BUCKET_DISPLAY_NAME + ", " + MediaStore.Images.Media.BUCKET_ID};
final Cursor cur = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, null);

while (cur != null && cur.moveToNext()) {
    final String bucketName = cur.getString((cur.getColumnIndex(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME)));
    if (bucketName.equals("myappsmediafolder")) {
        bucketId = cur.getString((cur.getColumnIndex(MediaStore.Images.ImageColumns.BUCKET_ID)));
        break;
    }
}

Agora que temos o Bucketid para o nosso álbum, podemos abri -lo com uma intenção simples.

Filtra arquivos de vídeo:

Uri mediaUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;

Filtros arquivos de imagem:

Uri mediaUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

...

if (bucketId.length() > 0) {
    mediaUri = mediaUri.buildUpon()
            .authority("media")
            .appendQueryParameter("bucketId", bucketId)
            .build();
}

Intent intent = new Intent(Intent.ACTION_VIEW, mediaUri);
startActivity(intent);

Posso verificar isso com o aplicativo de galeria interno. A milhagem pode variar com outros aplicativos, como o Google Photos.

Ainda não descobri como não filtrar imagens/vídeo, embora na Galeria você possa selecionar um álbum específico sem filtro.

Eu descobri isso olhando para a fonte do AOSP para o aplicativo da galeria.

Não tenho reputação suficiente para votar ou comentar sua resposta, mas a resposta do Shelldude permite que você coloque um URI de diretório na intenção da galeria. Portanto, quando o aplicativo da galeria é aberto, ele exibe todas as imagens em vez de 1.

Para mim, examinar meus arquivos como as respostas acima não funcionou. Consultar o MediaStore.images.media.external_content_uri só funcionou depois de inserir novas linhas na tabela MediaStore.images.media.data com o contentResolver:

ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, image.getPath());  
values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpeg");
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

Aqui está um simplificado

private  MediaScannerConnection conn;
private void notifySystemWithImage(final File imageFile) {

        conn = new MediaScannerConnection(this, new MediaScannerConnectionClient() {

        @Override
        public void onScanCompleted(String path, Uri uri) {

            try {
                if (uri != null) {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setDataAndType(uri, "image/*");
                    startActivity(intent);
                }
            } finally {
                conn.disconnect();
                conn = null;
            }
        }

        @Override
        public void onMediaScannerConnected() {
            conn.scanFile(imageFile.getAbsolutePath(), "*/*"); 

        }
    });

        conn.connect();
}

Para aqueles que isso ainda dão atividade não encontrada exceção:

Você precisa especificar o diretório da sua pasta de aplicativos interna. Não é o root padrão do usuário se imagens e tudo mais.

public class SlideShow extends Activity implements MediaScannerConnectionClient {

        public String[] allFiles;
        private String SCAN_PATH ;
        private static final String FILE_TYPE = "*/*";
        private MediaScannerConnection conn;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);

            setContentView(R.layout.main);

            File folder = new File(HistoryActivity.this.getExternalFilesDir(null)+"/a/");
            allFiles = folder.list();

            SCAN_PATH= HistoryActivity.this.getExternalFilesDir(null)+"/a/"+allFiles[0];

            Button scanBtn = (Button) findViewById(R.id.scanBtn);
            scanBtn.setOnClickListener(new OnClickListener()
            {
                public void onClick(View v)
                {
                    startScan();
                }
            });
        }

        private void startScan()
        {
            if(conn!=null)
            {
                conn.disconnect();
            }

            conn = new MediaScannerConnection(this, this);
            conn.connect();
        }


        public void onMediaScannerConnected()
        {
            conn.scanFile(SCAN_PATH, FILE_TYPE);    
        }


        public void onScanCompleted(String path, Uri uri)
        {
            try
            {
                if (uri != null) 
                {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(uri);
                    startActivity(intent);
                }
            }
            finally 
            {
                conn.disconnect();
                conn = null;
            }
        }
    }

Funciona ... mas o kitkat mostra apenas uma foto. Consegui corrigi -lo para versões anteriores com (Atualizando Gallery, ao armazenar a imagem):

public void savePhoto(Bitmap bmp)
{
    File imageFileFolder = new File(context.getExternalFilesDir(null)+"/a/") ;
    imageFileFolder.mkdir();
    FileOutputStream out = null;
    Calendar c = Calendar.getInstance();
    String date = fromInt(c.get(Calendar.MONTH))
            + fromInt(c.get(Calendar.DAY_OF_MONTH))
            + fromInt(c.get(Calendar.YEAR))
            + fromInt(c.get(Calendar.HOUR_OF_DAY))
            + fromInt(c.get(Calendar.MINUTE))
            + fromInt(c.get(Calendar.SECOND));
    File imageFileName = new File(imageFileFolder, date.toString() + ".jpg");
    try
    {
        out = new FileOutputStream(imageFileName);
        bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);
        out.flush();
        out.close();
        scanPhoto(imageFileName.toString());
        out = null;
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}


public String fromInt(int val)
{
    return String.valueOf(val);
}


public void scanPhoto(final String imageFileName)
{
    msConn = new MediaScannerConnection(context,new MediaScannerConnection.MediaScannerConnectionClient()
    {
        public void onMediaScannerConnected()
        {
            msConn.scanFile(imageFileName, null);
            Log.i("msClient obj  in Photo Utility", "connection established");
        }
        public void onScanCompleted(String path, Uri uri)
        {
            msConn.disconnect();
            Log.i("msClient obj in Photo Utility","scan completed");
        }
    });
    msConn.connect();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top