2010-10-25 7 views
8

ich folgenden Code innerhalb meiner app, eine Galerie zu öffnenGalerie mit Ordner-Filter

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 zu zeigen, von der Kamera aufgenommen zu begrenzen? Wenn Sie Gallery auf meinem 2.1-System anzeigen, werden Bilder gruppiert, sodass ein Parameter definiert werden muss, der definiert, zu welchem ​​Ordner er gehört.

Überprüfung der MediaStore.Images.ImageColumns Ich habe nicht eine jede Spalte finden, die so etwas definieren würde.

Kann ich falsch sein? Denn wenn ich eine Abfrage erstellen könnte, um nach Ordner zu filtern und meine eigene Galerieansicht zu erstellen, wäre mein Problem gelöst.

+0

@ Freakman: Haben Sie gefunden, die ans ?, wenn ja, bitte ich teilen brauche das gleiche. – PiyushMishra

+0

Nein, ich habe die Antwort nicht gefunden. – FrEaKmAn

Antwort

9

Sie müssen nur MediaScannerConnectionClient in Ihrer Aktivität implementieren und danach müssen Sie den genauen Pfad einer der Dateien innerhalb des Ordnernamens hier als SCAN_PATH angeben und es werden alle Dateien gescannt, die in diesem Ordner enthalten sind in der Galerie gebaut. Geben Sie einfach den Namen Ihres Ordners ein und Sie erhalten alle darin enthaltenen Dateien einschließlich Video. Wenn Sie nur Bilder öffnen möchten ä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; 
      } 
     } 
    } 
+0

es wird ein Bild zu einer Zeit zeigen, warum? Wie ich habe 6 Bilder in den Ordner, und wenn ich allFiles [0] schreibe es wird 1 Bild zeigen, dann schreibe ich allFiles [1] es wird 2 Bild anzeigen und so weiter. Aber ich möchte alle Bilder gleichzeitig zeigen. –

+0

Sie benötigen Galerie Aman, um alle Bilder zu einem Zeitpunkt zu zeigen, dieses Beispiel nicht überall zu sagen, wie ur-Daten angezeigt werden, erstellen Sie einfach ein Array von String mit Pfad aller Dateien in diesem Ordner. Sie können dieses Array von Strings in ur Gallary verwenden, um Ihre Bilder anzuzeigen. – PiyushMishra

+0

Dies öffnet das spezifische Bild nicht den Ordner in der Galerie –

0

Hier ein vereinfachtes ein

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

Dies wird nur ein Bild laden, wo ich alle Bilder des angegebenen Ordners benötigt. –

+0

Es öffnet das Bild in seinem Ordner, und Sie können nach rechts und links schieben, um andere Bilder zu sehen. Wie Galerie. –

0

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

Sie müssen angeben Verzeichnis Ihrer innerer Anwendungsordner Nicht Benutzer standardmäßig 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)+"https://stackoverflow.com/a/"); 
      allFiles = folder.list(); 

      SCAN_PATH= HistoryActivity.this.getExternalFilesDir(null)+"https://stackoverflow.com/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; 
      } 
     } 
    } 

funktioniert ... aber kitkat zeigen nur ein Foto. Ich schaffte es für frühere Versionen zu beheben mit (Aktualisierung Galerie, wenn Bildspeicher):

public void savePhoto(Bitmap bmp) 
{ 
    File imageFileFolder = new File(context.getExternalFilesDir(null)+"https://stackoverflow.com/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(); 
} 
3

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

Hier ist die tatsächliche richtige Lösung:

Das Geheimnis ist das Finden der Eimer/Album deinen Ordner wie dargestellt. Buckets werden nach einem erfolgreichen MediaScan angezeigt, stellen Sie daher sicher, dass alle Bilder/Videos, die Sie anzeigen möchten, zuerst gescannt werden, wie oben mehrfach gezeigt.

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

Jetzt, wo wir die bucketId für unser Album haben wir es mit einer einfachen Absicht öffnen 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 überprüfen, das funktioniert mit dem eingebauten in Galerie-App. Die Laufleistung kann bei anderen Apps wie Google Fotos variieren.

Ich muss noch herausfinden, wie Bilder/Videos nicht gefiltert werden, obwohl in der Galerie können Sie ein bestimmtes Album ohne Filter auswählen.

Ich habe das herausgefunden, indem ich die AOSP-Quelle in der Galerie-App angeschaut habe.

+0

Ich habe bereits geupdated. Diese Lösung funktionierte perfekt für API 5. Aber für API 6 zeigt es nur 1 Foto. Ich muss scrollen, um zum nächsten Foto zu gelangen. Wie kann ich sicherstellen, dass es für API 6 funktioniert? Lass es mich wissen, bitte. Vielen Dank! – masiboo

+0

Gibt es eine Möglichkeit, Ordnernamen für Bilder und Videos im selben Cursor zu kombinieren? –

0

Ich habe nicht genug Reputation, um seine Antwort zu verbessern oder zu kommentieren, aber ShellDudes Antwort erlaubt es Ihnen, einen Verzeichnis-URI in den Galeriebegriff aufzunehmen. Wenn also die Galerie-App geöffnet wird, werden alle Bilder anstelle von 1 angezeigt.

Für mich hat das Scannen meiner Dateien wie die obigen Antworten nicht funktioniert. Abfragt der MediaStore.Images.Media.EXTERNAL_CONTENT_URI arbeitete erst nach neuen 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); 
+0

ungerade, da hätte ich erwartet, dass ein mediascan das obenstehende für dich tun würde. Gibt es eine .nomedia-Datei oder ähnliches im Pfad zu Ihrem Ordner? – ShellDude