Domanda

Sto usando seguente codice per aprire una galleria all'interno della mia app

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

E 'possibile limitare un elenco di immagini a solo immagini mostrano prese dalla macchina fotografica? Guarda Galleria sul mio sistema 2.1, le immagini vengono raggruppati in modo ci deve essere un parametro che definisce a quale cartella essa appartiene.

MediaStore.Images.ImageColumns I non ha a find qualsiasi colonna che avrebbe definito cosa del genere.

Potrei essere sbagliato? Perché se potessi creare una query per il filtro per cartella e creare il mio punto di vista galleria, allora il mio problema sarebbe risolto.

È stato utile?

Soluzione

Hai solo bisogno di implementare MediaScannerConnectionClient nella vostra attività e dopo che si deve dare il percorso esatto di uno dei file all'interno di tale nome della cartella qui come SCAN_PATH e sarà scansione di tutti i file contenenti in quella cartella e aprirlo all'interno costruito in galleria. Quindi, solo dare il nome di voi cartella e si ottengono tutti i file al suo interno tra cui video. Se si vuole solo aprire le immagini cambiare 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;
            }
        }
    }

Altri suggerimenti

Nessuna delle risposte sopra sono esatte, compreso quello contrassegnato come corretta.

Ecco la soluzione reale corretta:

Il segreto è trovare il secchio / album la cartella è rappresentato come. Benne appaiono dopo Mediascan successo in modo da assicurarsi eventuali immagini / video che si desidera visualizzare vengono esaminati prima come dimostrato più volte in precedenza.

Supponiamo che ho un indicizzato cartella in / sdcard / frontend / 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;
    }
}

Ora che abbiamo la bucketId per il nostro album possiamo aprirlo con un semplice intento.

Filtri file video:

Uri mediaUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;

Filtri I file di immagine:

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

I grado di verificare Questo funziona con l'applicazione integrata nella Galleria. Situazione potrebbe essere diversa con altre applicazioni come Google Foto.

Devo ancora capire come non immagini Filtro / video, anche se all'interno di Galleria è possibile selezionare un determinato album senza nessun filtro.

ho pensato che questo fuori guardando il sorgente AOSP alla galleria app.

Non ho abbastanza reputazione da upvote o un commento sulla sua risposta, ma la risposta di ShellDude ti permette di mettere una directory URI nella galleria intento. Così, quando si apre la galleria app visualizza tutte le immagini invece di 1.

Per quanto mi riguarda, la scansione i miei file, come le risposte di cui sopra non ha funzionato. Interrogando il MediaStore.Images.Media.EXTERNAL_CONTENT_URI funzionava solo dopo l'inserimento di nuove righe nella tabella MediaStore.Images.Media.DATA con la 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);

Ecco uno semplificato

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();
}

Per chi questo ancora dare attività non trovato eccezione:

È necessario specificare la directory della cartella dell'applicazione interna. Non utente root di default se le immagini e tutto il resto.

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

opere ... ma mostrano kitkat solo una foto. Sono riuscito a risolvere il problema per le versioni precedenti con (galleria di aggiornamento, di immagini durante la memorizzazione):

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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top