【问题标题】:Android: List all gallery apps and camera to choose picture fromAndroid:列出所有图库应用程序和相机以从中选择图片
【发布时间】:2020-05-06 22:02:30
【问题描述】:

我正在尝试从相机或图库中选择图像并使用以下代码,并希望所有图库选项都可以在第一个选择器屏幕中使用,而不是在另一个选项下合并。

open fun getImageFromPhone() {
        val pickIntent = Intent()
        pickIntent.type = "image/*"
        pickIntent.action = Intent.ACTION_GET_CONTENT
        val takePhotoIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        val galleryIntent = Intent(
            Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
        )
        galleryIntent.setType("image/gallery");
        val pickTitle = "Select or take a new Picture"
        var outputFileUri: Uri? = Uri.fromFile(File.createTempFile(TEMP_FILE, EXTENSION))
        val chooserIntent = Intent.createChooser(pickIntent, pickTitle)
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, arrayOf(takePhotoIntent, galleryIntent))
        chooserIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri)
        startActivityForResult(chooserIntent, CODE_IMG_GALLERY)
    }

这会导致显示以下选项:

点击Android System 我得到画廊选项:

但是,我希望这些选项(在上图中)在第一个菜单本身中作为单独的选项列出。

【问题讨论】:

    标签: android android-intent mediastore


    【解决方案1】:

    此方法用于从相机的(ACTION_IMAGE_CAPTURE) 或图库(ACTION_GET_CONTENT) 中选择图像源。我已经发布了所有相关的方法,效果很好。只需按如下方式调用此 Intent:

    startActivityForResult(getPickImageChooserIntent(activity,"Your Title",false),PICK_IMAGE_CHOOSER_REQUEST_CODE)
    
       
    
        public static Intent getPickImageChooserIntent(@NonNull Context context, CharSequence 
        title, boolean includeDocuments) {
        List<Intent> allIntents = new ArrayList<>();
        PackageManager packageManager = context.getPackageManager();
    
        // collect all camera intents if Camera permission is available
        if (!isExplicitCameraPermissionRequired(context)) {
          allIntents.addAll(getCameraIntents(context, packageManager));
        }
        List<Intent> galleryIntents =
                getGalleryIntents(packageManager, Intent.ACTION_GET_CONTENT,includeDocuments);
        if (galleryIntents.size() == 0) {
          // if no intents found for get-content try pick intent action (Huawei P9).
          galleryIntents = getGalleryIntents(packageManager, Intent.ACTION_PICK, includeDocuments);
        }
        allIntents.addAll(galleryIntents);
    
        Intent target;
        if (allIntents.isEmpty()) {
          target = new Intent();
        } else {
          target = allIntents.get(allIntents.size() - 1);
          allIntents.remove(allIntents.size() - 1);
        }
    
        // Create a chooser from the main  intent
        Intent chooserIntent = Intent.createChooser(target, title);
    
        // Add all other intents
        chooserIntent.putExtra(
                Intent.EXTRA_INITIAL_INTENTS, allIntents.toArray(new Parcelable[allIntents.size()]));
    
        return chooserIntent;
        }
    
        public static boolean isExplicitCameraPermissionRequired(@NonNull Context context) {
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
            && hasPermissionInManifest(context, "android.permission.CAMERA")
            && context.checkSelfPermission(Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED;
        }
    
            /** Get all Camera intents for capturing image using device camera apps. */
        public static List<Intent> getCameraIntents(
                @NonNull Context context, @NonNull PackageManager packageManager) {
      
          List<Intent> allIntents = new ArrayList<>();
      
          // Determine Uri of camera image to  save.
          Uri outputFileUri = getCaptureImageOutputUri(context);
      
          Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
          List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
          for (ResolveInfo res : listCam) {
            Intent intent = new Intent(captureIntent);
            intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
            intent.setPackage(res.activityInfo.packageName);
            if (outputFileUri != null) {
              intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
            }
            allIntents.add(intent);
          }
      
          return allIntents;
        }
        /**
         * Get all Gallery intents for getting image from one of the apps of the device that handle
         * images.
         */
        public static List<Intent> getGalleryIntents(
                @NonNull PackageManager packageManager, String action, boolean includeDocuments) {
          List<Intent> intents = new ArrayList<>();
          Intent galleryIntent =
                  action == Intent.ACTION_GET_CONTENT
                          ? new Intent(action)
                          : new Intent(action, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
          galleryIntent.setType("image/*");
          List<ResolveInfo> listGallery = packageManager.queryIntentActivities(galleryIntent, 0);
          for (ResolveInfo res : listGallery) {
            Intent intent = new Intent(galleryIntent);
            intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
            intent.setPackage(res.activityInfo.packageName);
            intents.add(intent);
          }
          // remove documents intent
          if (!includeDocuments) {
            for (Intent intent : intents) {
              if (intent
                      .getComponent()
                      .getClassName()
                      .equals("com.android.documentsui.DocumentsActivity")) {
                intents.remove(intent);
                break;
              }
            }
          }
          return intents;
        }
    
            /**
         * Get URI to image received from capture by camera.
         *
         * @param context used to access Android APIs, like content resolve, it is your
         *     activity/fragment/widget.
         */
        public static Uri getCaptureImageOutputUri(@NonNull Context context) {
          Uri outputFileUri = null;
          File getImage = context.getExternalCacheDir();
          if (getImage != null) {
            outputFileUri = Uri.fromFile(new File(getImage.getPath(), "pickImageResult.jpeg"));
          }
          return outputFileUri;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多