Android打开图库的意图不适用于KitKat(4.4)

时间:2014-02-04 18:00:51

标签: android image android-intent

我正在开发一个应用程序,需要允许用户选择个人资料图片,我想给他们一个简单的选项,可以拍照,或从图库中选择现有的。

我的搜索将我带到this Stackoverflow discussion,因此我根据其目的在其中一个答案中修改了代码。这就是我所拥有的:

public static Uri openImageIntent(Activity context) {
    Uri outputFileUri = null;
    File cache_dir = context.getExternalFilesDir("photos");

    cache_dir.mkdirs();

    File image_file = null;
    try {
        image_file = File.createTempFile("profile", ".jpg", cache_dir);
    } catch (IOException e) {
        e.printStackTrace();
    }

    if (image_file != null) {
        File sdImageMainDirectory = new File(cache_dir.getAbsolutePath(), image_file.getName());
        outputFileUri = Uri.fromFile(sdImageMainDirectory);

        // Camera.
        List<Intent> cameraIntents = new ArrayList<Intent>();
        Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        PackageManager packageManager = context.getPackageManager();
        List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);

        for(ResolveInfo res : listCam) {
            final String packageName = res.activityInfo.packageName;
            final Intent intent = new Intent(captureIntent);
            intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
            intent.setPackage(packageName);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
            cameraIntents.add(intent);
        }

        // Filesystem.
        final Intent galleryIntent = new Intent();
        galleryIntent.setType("image/*");
        galleryIntent.setAction(Intent.ACTION_GET_CONTENT);

        // Chooser of filesystem options.
        final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");

        // Add the camera options.
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));

        context.startActivityForResult(chooserIntent, Constants.RequestCodes.CHOOSE_PICTURE);
    }

    return outputFileUri;
 }

如您所见,它通过组合ACTION_IMAGE_CAPTURE和ACTION_GET_CONTENT意图创建一个选择器,后者被过滤为“image / *”。这里的目标是打开一个自定义选项,让用户选择相机应用程序拍摄新照片,或选择图库应用程序(或照片或文件浏览器)来选择现有图像。我还必须在onActivityResult()中做一些工作才能正确接收图片并根据选择使用它,但我不认为这与此相关。

在4.3及以下,这很有用。它会打开一个看起来像这样的选择器:

enter image description here

然而,在KitKat上,选择器看起来像这样:

enter image description here

正如您所看到的,它似乎忽略了“图像/ *”过滤器,只是给了我一些通用的“文档”应用程序来打开文件。

显然KitKat发生了一些变化,但我不知道它是什么,我找不到其他遇到过这个问题的人。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

事实证明,“文档”实际上是选择照片的正确应用程序。它按照预期的方式工作,只显示我画廊中的图像。在这一点上,名称和图标并不完全清楚,我担心这可能会给技术较少的用户带来一些困惑。但我想我只需要解决这个问题。

答案 1 :(得分:0)

看看这个:https://developer.android.com/guide/topics/providers/document-provider.html

Google在KitKat中引入了存储访问框架,它提供了一个通用的系统用户界面,用于挑选文档而不是单个应用程序。