我正在制作一款应用程序,除了其他功能之外,它还会使用设备的相机拍摄照片,然后通过电子邮件进行分享。
我遇到的问题是我无法让应用程序拍摄全尺寸照片。它总是发送降低分辨率的照片版本,虽然相机设置为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();
}
}
});
答案 0 :(得分:1)
使用密钥ACTION_IMAGE_CAPTURE
的{{1}}意图有一个额外的内容,它将URI作为值接受文件。如果您不提供此额外功能,则会将带有数据意图的拍摄图像的尺寸缩小版本返回到MediaStore.EXTRA_OUTPUT
。
这样做的原因是全尺寸的相机图片对于意图系统而言太大而无法处理(它可能在理论上起作用,但会大大减慢整个意图处理的速度 - 意图应该很小尽可能一般)。所以它不能像小尺寸版本那样交付。
要使用此附加功能,请修改您的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()
时就从此处打开它。