与文件夹filter的画廊

我正在使用下面的代码来打开我的应用程序内的画廊

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

是否可以限制图像列表只显示相机拍摄的图像? 在我的2.1系统上查看图库,图像被分组,所以必须有一个参数来定义它属于哪个文件夹。

检查MediaStore.Images.ImageColumns我没有find任何列将定义这样的事情。

我可以错了吗? 因为如果我可以创build一个查询按文件夹过滤,并创build我自己的画廊视图,那么我的问题将被解决。

您只需在您的活动中实施MediaScannerConnectionClient,之后您必须将该文件夹名称中的一个文件的确切path作为SCAN_PATH,并将扫描该文件夹中包含的所有文件,并在内置库中打开它。 所以只要给你的文件夹的名称,你会得到所有的文件,包括video。 如果只想打开图片,则更改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; } } } 

以上答案都不是正确的,包括标记为正确的答案。

这是实际正确的解决scheme:

秘诀在于find您的文件夹所代表的存储桶/相册。 在成功的MediaScan之后,存储桶将显示出来,因此请确保您要显示的任何图像/video首先被扫描,如上面多次演示的那样。

假设我在/ 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; } } 

现在我们有了专辑的bucketId,我们可以用一个简单的意图打开它。

过滤video文件:

 Uri mediaUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 

过滤图片文件:

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

我可以validation这与内置的图库应用程序的作品。 里程可能因其他应用程序(如Google相册)而异。

我还没有弄清楚如何不过滤图像/video,即使在图库中,您可以select一个没有filter的特定相册。

我通过查看AOSP来源的图库应用程序来了解这一点。

这是一个简化的

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

对于这个还没有发现的活动没有发现exception:

您需要指定您的内部应用程序文件夹的目录。 不是用户默认的根,如果图像和一切。

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

作品…但kitkat只显示一张照片。 我设法修复它的早期版本(更新画廊,当存储图像时):

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

我没有足够的声望来赞扬或评论他的答案,但是,ShellDude的答案允许你把一个目录的URI在画廊意图。 所以当图库应用程序打开时,它会显示所有的图像,而不是1。

对我来说,像上面的答案扫描我的文件不起作用。 查询MediaStore.Images.Media.EXTERNAL_CONTENT_URI仅在使用ContentResolver将新行插入MediaStore.Images.Media.DATA表后才起作用:

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