首页 > 解决方案 > Android Studio 从 Gallery Intent 获取文件

问题描述

简短的回答是否可以从图库请求中获取原始文件,如果可能的话,我该怎么做?这段代码对我不起作用。

Uri uri = data.getData();
File file = new File(uri.getPath());

和长答案)):我使用此代码来制作画廊意图

addGallery.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
             Intent intent = new Intent(Intent.ACTION_PICK);
             intent.setType("image/*");
             startActivityForResult(intent, GALLERY_IMAGE_REQUEST);
        }
    });

在 mu onActivityResult 我使用这个代码

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK)
    {
        switch (requestCode)
        {
            case GALLERY_IMAGE_REQUEST:
                if (data != null)
                {
                    try
                    {
                        Uri uri = data.getData();
                        File file = new File(uri.getPath());
                        FileInputStream inputStream = new FileInputStream(file);
                        bitmap = BitmapFactory.decodeStream(inputStream);
                        imageView.setImageBitmap(bitmap);
                        inputStream.close();
                    } catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
        }
    }
}

而且我无法获取文件。

从数据中获取位图的相同代码效果很好,但我需要从图库中获取准确的文件,而不仅仅是 Uri 或位图。

                 try
                    {
                        Uri uri = data.getData();
                        InputStream imageStream = getContentResolver().openInputStream(uri);
                        final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
                        imageView.setImageBitmap(selectedImage);
                        imageStream.close();
                    } catch (Exception e)
                    {
                        e.printStackTrace();
                    }

标签: androidfileandroid-intentgallery

解决方案


如果您想将图片从图库导入您的应用程序(如果您的应用程序拥有它),您需要将其复制到您的应用程序数据文件夹。

在您的 onActivityResult() 中:

    if (requestCode == REQUEST_TAKE_PHOTO_FROM_GALLERY && resultCode == RESULT_OK) {
        try {
            // Creating file
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {
                Log.d(TAG, "Error occurred while creating the file");
            }

            InputStream inputStream = getActivity().getContentResolver().openInputStream(data.getData());
            FileOutputStream fileOutputStream = new FileOutputStream(photoFile);
            // Copying
            copyStream(inputStream, fileOutputStream);
            fileOutputStream.close();
            inputStream.close();

        } catch (Exception e) {
            Log.d(TAG, "onActivityResult: " + e.toString());
        }
    }

创建文件方法:

private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );

    // Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = image.getAbsolutePath();
    return image;
}

复制方法:

public static void copyStream(InputStream input, OutputStream output) throws IOException {
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = input.read(buffer)) != -1) {
        output.write(buffer, 0, bytesRead);
    }
}

推荐阅读