【问题标题】:android- open gallery and choose image and videoandroid-打开图库并选择图像和视频
【发布时间】:2013-03-29 13:17:51
【问题描述】:

在我的项目中,我想通过单击按钮打开一个图库,并且应该能够选择图像或视频来获取它们的路径。

Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

startActivityForResult(i, RESULT_LOAD_IMAGE);

从上面的代码我可以打开画廊,但在这种情况下我只能选择图像。所以,请帮助我选择视频。 提前致谢。

【问题讨论】:

    标签: android video android-gallery


    【解决方案1】:

    在 Android 6.0 及更高版本上,使用“video/* image/”或“image/ video/*”类型不起作用,它只能识别您指定的第一个过滤器。我用这段代码解决了这个问题:

    Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
    photoPickerIntent.setType("*/*");
    photoPickerIntent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {"image/*", "video/*"});
    startActivityForResult(photoPickerIntent, Constants.SELECT_PHOTO);
    

    虽然这会询问用户他们想使用哪个应用来选择图像/视频。

    【讨论】:

    • 谢谢,这个回复现在应该更高了
    • 仅选择视频和图像展位并行的确切解决方案。
    • 此方法在 android 6.0.1 上显示额外的选择器对话框。如果选择正确的 Google 相册,它会显示视频和照片。
    • 它显示其他应用程序以及联系人、谷歌音乐。
    • 截至 2021 年,我在下面添加了一个仅允许图像和视频的解决方案,我在网上没有找到其他有效的方法,所以我混合了一些答案并意外找到了解决方案
    【解决方案2】:

    可以使用下一个sn-p:

    Intent mediaChooser = new Intent(Intent.ACTION_GET_CONTENT);
    //comma-separated MIME types
    mediaChooser.setType("video/*, image/*");
    startActivityForResult(mediaChooser, RESULT_LOAD_IMAGE);
    

    但我认为它只适用于 ICS 或更大

    【讨论】:

    • 应该是“image/*”而不是“images/*”
    • 在 6.0 上只允许选择视频
    • 这似乎被打破了,至少对于较新版本的安卓或谷歌照片应用程序。似乎只有逗号分隔列表中的第一个 mime 类型被识别。
    • 如何多选照片和视频?
    【解决方案3】:

    您需要使用以下内容作为选择 Intent

    Intent photoLibraryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    photoLibraryIntent.setType("image/* video/*");
    

    【讨论】:

      【解决方案4】:

      下面的代码解决了我的问题

        final Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
                              galleryIntent.setType("*/*");
                              startActivityForResult(galleryIntent, RESULT_LOAD_IMAGE);
      

      【讨论】:

        【解决方案5】:

        2022 Android 9

        我已经尝试了所有可用的在线解决方案,但不小心混合了 2 个解决方案,结果证明是可行的。

        这仅提供照片库和谷歌照片作为选项,您可以选择照片和视频。

            libraryIntent.setType("video/*, image/*");
            String[] mimetypes = {"image/*", "video/*"};
            libraryIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
        

        【讨论】:

          【解决方案6】:

          没有足够的代表发表评论,但@YYamil 的回复效果很好。

          Intent mediaChooser = new Intent(Intent.ACTION_GET_CONTENT);
          //comma-separated MIME types
          mediaChooser.setType("video/*, image/*");
          startActivityForResult(mediaChooser, RESULT_LOAD_IMAGE);
          

          如果您使用新的registerForResultActivity,请创建ActivityResultContracts.GetMultipleContents() 的副本并输入createIntent

              @CallSuper
              override fun createIntent(context: Context, input: String): Intent {
                  return Intent(Intent.ACTION_GET_CONTENT)
                      .addCategory(Intent.CATEGORY_OPENABLE)
                      .setType(input)
                      .putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
                      .putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/*", "video/*")) // this does the trick
              }
          

          【讨论】:

            【解决方案7】:

            这是我所知道的最好的......试试这个......

             final CharSequence[] options = {"Images", "Videos", "Cancel"};
                        AlertDialog.Builder builder = new AlertDialog.Builder(OpenGallery.this);
                        builder.setTitle("Select From...");
                        builder.setItems(options, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int item) {
                                if (options[item].equals("Images")) {
                                    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                                    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                                    startActivityForResult(intent, 1);
                                } else if (options[item].equals("Videos")) {
                                    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
                                    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                                    startActivityForResult(intent, 1);
                                } else if (options[item].equals("Cancel")) {
                                    dialog.dismiss();
                                }
                                dialog.dismiss();
                            }
                        });
                        builder.show();
            

            【讨论】:

              【解决方案8】:

              将您的意图更改为:

              Intent i = new Intent(Intent.ACTION_PICK,
              android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
              

              在尝试获取视频时,您需要向 mediaStore 声明该视频是有序的,而不是您编写的图像。

              【讨论】:

                【解决方案9】:

                Android 对访问外部内容设置了很多限制。我最终使用了 3rd 方库。这个不错: https://github.com/AnilFurkanOkcun/UWMediaPicker-Android

                implementation 'com.github.AnilFurkanOkcun:UWMediaPicker-Android:1.3.0'
                
                
                UwMediaPicker
                .with(this)                     // Activity or Fragment
                    .setGalleryMode(UwMediaPicker.GalleryMode.ImageGallery) // GalleryMode: ImageGallery/VideoGallery/ImageAndVideoGallery, default is ImageGallery
                .setGridColumnCount(4)                                  // Grid column count, default is 3
                    .setMaxSelectableMediaCount(10)                         // Maximum selectable media count, default is null which means infinite
                    .setLightStatusBar(true)                                // Is llight status bar enable, default is true
                .enableImageCompression(true)               // Is image compression enable, default is false
                .setCompressionMaxWidth(1280F)              // Compressed image's max width px, default is 1280
                .setCompressionMaxHeight(720F)              // Compressed image's max height px, default is 720
                .setCompressFormat(Bitmap.CompressFormat.JPEG)      // Compressed image's format, default is JPEG
                .setCompressionQuality(85)              // Image compression quality, default is 85
                .setCompressedFileDestinationPath(destinationPath)  // Compressed image file's destination path, default is "${application.getExternalFilesDir(null).path}/Pictures"
                .launch{selectedMediaList-> } // (::onMediaSelected)    // Will be called when media is selected
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-09-21
                  • 2011-06-22
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-04-02
                  • 1970-01-01
                  • 2014-04-19
                  • 2023-03-03
                  相关资源
                  最近更新 更多