Отправить фото в полный размер - PullRequest
0 голосов
/ 27 ноября 2011

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

Проблема в том, что я не могу получитьприложение, чтобы сделать полноразмерное изображение.Он всегда отправляет уменьшенную в разрешении версию фотографии, хотя камера установлена ​​на 5MP, а качество при сжатии установлено на 100. Ниже у вас есть мой код:

    private void takePicture(){
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent, 1);
}

public void onActivityResult(int requestCode, int resultCode, Intent data){
       if(requestCode == CAMERA_PIC_REQUEST && resultCode == Activity.RESULT_OK){
           picture = (Bitmap) data.getExtras().get("data");
           pictureView.setImageBitmap(picture);

           ContentValues values = new ContentValues();
           values.put(Images.Media.TITLE, "Picture");
           values.put(Images.Media.BUCKET_ID, "picture_ID");
           values.put(Images.Media.DESCRIPTION, "");
           values.put(Images.Media.MIME_TYPE, "image/jpeg");

           pictureUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
           OutputStream outstream;

           try{
               outstream = getContentResolver().openOutputStream(pictureUri);
               picture.compress(Bitmap.CompressFormat.JPEG, 100, outstream);
               outstream.close();
           }catch(FileNotFoundException e){

           } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       }
   }

.....

    share.setOnClickListener(new OnClickListener(){
        public void onClick(View view){
            Intent intent = new Intent(Intent.ACTION_SEND);
            intent.setType("text/plain");
            intent.putExtra(Intent.EXTRA_SUBJECT, selectedType);
            intent.putExtra(Intent.EXTRA_TEXT,Notes + "\nLocation: " + selectedLocation+"\nOwner: " + selectedOwner
                    + "\nStatus: " + selectedStatus);
            intent.putExtra(Intent.EXTRA_STREAM, pictureUri);

            try{
                startActivity(Intent.createChooser(intent, "Send mail..."));
            } catch (android.content.ActivityNotFoundException ex) {
                Toast.makeText(getApplicationContext(), "There are no email clients installed.", Toast.LENGTH_SHORT).show();
            }
        }
    });

1 Ответ

1 голос
/ 28 ноября 2011

Существует дополнительное значение для намерения ACTION_IMAGE_CAPTURE с ключом MediaStore.EXTRA_OUTPUT, которое принимает URI к файлу в качестве значения. Если вы не предоставите эту дополнительную информацию, версия снятого изображения с уменьшенным размером вернется к onActivityResult() с намерением передачи данных.

Причина этого в том, что полноразмерное изображение с камеры просто слишком велико, чтобы система намерений могла обработать (теоретически это может работать, но сильно замедляет обработку всего намерения - намерения должны быть такими же маленькими как можно в общем) . Таким образом, он не может быть доставлен как маленькая версия.

Чтобы использовать это дополнительное, измените ваш метод takePicture(), например, как это:

private void takePicture() {
    File outputFile = new File(Environment.getExternalStorageDirectory(), 
                               "image.jpg");
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outputFile));
    startActivityForResult(intent, 1);
}

Это работает как ваш метод выше, за исключением того, что приложение камеры записало полноразмерную копию изображения в файл, который вы указали при вызове onActivityResult(). Это означает, что вам не нужно самостоятельно записывать образ на диск, просто откройте его оттуда, когда ваш onClickListener() будет выполнен, как вы уже сделали.

...