Android Studio получает файл из галереи намерений - PullRequest
0 голосов
/ 21 мая 2018

Краткий ответ: возможно ли получить оригинальный файл из запроса Галереи, и если это возможно, как я могу это сделать?Этот код не работает для меня.

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);
        }
    });

В му 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 или Bitmap.

                 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();
                    }

1 Ответ

0 голосов
/ 22 мая 2018

Если вы хотите импортировать изображение из галереи в ваше приложение (если оно принадлежит вашему приложению), вам нужно скопировать его в папку данных вашего приложения.

в вашем 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);
    }
}
...