带文件夹过滤器的图库

FrE*_*mAn 8 android android-gallery

我正在使用以下代码在我的应用程序内打开一个库

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, FIND_RESULT);
Run Code Online (Sandbox Code Playgroud)

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

检查MediaStore.Images.ImageColumns我没找到任何可以定义此类内容的列.

我可能错了吗?因为如果我可以创建一个按文件夹过滤的查询并创建我自己的图库视图,那么我的问题就会解决.

Piy*_*hra 8

您只需要在活动中实现MediaScannerConnectionClient,然后您必须在此处将该文件夹名称中的一个文件的确切路径作为SCAN_PATH,它将扫描包含在该文件夹中的所有文件并在内置库中打开它.所以只要给出你文件夹的名称,你就会得到包括视频在内的所有文件.如果要仅打开图像更改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;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)


She*_*ude 5

上述答案均不正确,包括标记为正确的答案。

这是实际的正确解决方案:

秘诀是找到您的文件夹所代表的存储桶/相册。MediaScan 成功后会显示存储桶,因此请确保首先扫描您想要显示的任何图像/视频,如上面多次演示的那样。

假设我在 /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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

过滤视频文件:

Uri mediaUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
Run Code Online (Sandbox Code Playgroud)

过滤图像文件:

Uri mediaUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Run Code Online (Sandbox Code Playgroud)

...

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

Intent intent = new Intent(Intent.ACTION_VIEW, mediaUri);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

我可以使用内置的图库应用程序验证这是否有效。其他应用程序(例如 Google 相册)的里程可能会有所不同。

我还没有弄清楚如何不过滤图像/视频,即使在图库中您可以选择没有过滤器的特定相册。

我通过查看图库应用程序的 AOSP 源代码发现了这一点。