Android 通过电子邮件发送全尺寸照片

Android 通过电子邮件发送全尺寸照片,android,email,bitmap,photo,Android,Email,Bitmap,Photo,我正在开发一个应用程序,其中包括使用设备的摄像头拍照,然后通过电子邮件共享 我遇到的问题是,我无法让应用程序拍摄全尺寸的照片。它总是发送分辨率较低的照片,尽管相机设置为5MP,压缩时的质量设置为100。下面是我的代码: private void takePicture(){ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 1); } p

我正在开发一个应用程序,其中包括使用设备的摄像头拍照,然后通过电子邮件共享

我遇到的问题是,我无法让应用程序拍摄全尺寸的照片。它总是发送分辨率较低的照片,尽管相机设置为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();
        }
       }
   }


使用键MediaStore.extra\u OUTPUT将文件的URI作为值,为
操作\u IMAGE\u CAPTURE
意图提供了一个额外的值。如果您不提供此额外信息,则拍摄图像的缩小版本将返回到带有数据意图的
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()
时从磁盘打开映像即可。

非常感谢您花时间解释它。然而,一旦我添加了新的额外意图,一旦我拍照,什么都不会发生。我按下相机菜单中的“Ok”按钮,它就会停留在那里。用“image.jpeg”替换“…”是否有问题?是的,这必须是文件的有效路径。如果这样做,则以“file.jpeg”结尾,这是无效的,因为您没有指定目录。我稍微更新了代码。现在,它将图像写入到(通常是sd卡或大型内部闪存)的根目录中。一般来说,这应该可以工作(只是在一个示例项目中进行了测试)。我也不能告诉你为什么你的应用程序在没有stacktrace的情况下崩溃。由于这是一个不同于整个“小图像”的问题,我想说,请打开一个新的问题,包括stacktrace和相关的代码。
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);
}