Frage

ich folgenden Code verwendet eine Galerie Innenseite meiner App zu öffnen

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

Ist es möglich, eine Liste der Bilder, um nur Bilder von der Kamera genommen zu begrenzen? Aussichtsplattform auf meinem 2.1-System, werden die Bilder gruppiert, so gibt es ein Parameter sein muss, dass definiert, in welchen Ordner es gehört.

Überprüfen der MediaStore.Images.ImageColumns I hat eine keine Spalte finden, die so etwas definieren würde.

Könnte ich falsch sein? Denn wenn ich eine Abfrage Filter nach Ordnern erstellen könnte und meine eigene Galerie-Ansicht erstellen, dann würde mein Problem gelöst werden.

War es hilfreich?

Lösung

Sie müssen nur MediaScannerConnectionClient in Ihrer Tätigkeit implementieren und nach, dass Sie den genauen Pfad eines der Datei in diesem Ordner Name hier als SCAN_PATH geben und es werden alle Dateien in diesem Ordner mit scannen und öffnen Sie sie im Inneren gebaut in der Galerie. So geben Sie einfach den Namen der Ordner geöffnet, und Sie werden alle Dateien innerhalb einschließlich Video. Wenn Sie öffnen sich nur Bilder wollen ändern 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;
            }
        }
    }

Andere Tipps

Keine der oben genannten Antworten sind richtig, einschließlich der, wie richtig markiert.

Hier ist die tatsächliche richtige Lösung:

Das Geheimnis ist das Finden der Eimer / Album deinen Ordner wie dargestellt. Eimer zeigen sich nach einer erfolgreichen Mediascan so sicher werden alle Bilder / Videos, die Sie zeigen wollen, werden zunächst als demonstriert mehrere Male über gescannt.

Nehmen wir an, ich habe einen indizierten Ordner in / 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;
    }
}

Nun, da wir die bucketId für unser Album haben wir es mit einer einfachen Absicht geöffnet werden können.

Filter Video-Dateien:

Uri mediaUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;

Filter Bilddateien:

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

kann ich das funktioniert mit dem eingebauten in Galerie-App überprüfen. Kilometerstand kann mit anderen Anwendungen wie Google Fotos variiert.

Ich habe noch, um herauszufinden, wie man es nicht Filter Bilder / Video, obwohl innerhalb Gallery Sie ein bestimmtes Album ohne Filter auswählen können.

dachte ich dies aus, indem an der AOSP Quelle in der Galerie App suchen.

Ich habe nicht genug Ruf upvote oder Kommentar auf seiner Antwort aber ShellDude Antwort kann Ihnen Absicht, einen Verzeichnis-URI in der Galerie setzen. Also, wenn die Galerie App geöffnet wird es zeigt alle Bilder anstelle von 1.

Für mich Scannen meine Dateien wie die Antworten oben nicht funktioniert hat. Die Abfrage der MediaStore.Images.Media.EXTERNAL_CONTENT_URI nur gearbeitet, nachdem neue Zeilen in die MediaStore.Images.Media.DATA Tabelle mit dem ContentResolver einfügen:

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

Hier ist ein vereinfachtes eines

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

Für diejenigen, die diese Aktivität geben noch nicht Ausnahme gefunden:

Sie müssen Verzeichnis Ihrer inneren Anwendungsordner angeben. Nicht Benutzer Standard-Root, wenn Bilder und alles.

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

Arbeiten ... aber kitkat zeigt nur ein Foto. Ich schaffte es mit (Aktualisierung Galerie, wenn Speicher von Bild) für frühere Versionen zu beheben:

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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top