我正在尝试学习如何在我的Android应用程序中使用相机。我目前有一个带有重叠按钮的工作预览。我已将其设置为成功拍摄照片,但是当我尝试将照片保存到SD卡时,它无法正常工作。它总是回来“保存时出错”。
我知道它不是我的SD卡,而且我之前在另一个应用程序中使用了几乎相同的确切代码来保存位图,这可以成功运行。
我也知道它成功拍摄了照片,因为我通过将照片放入活动中的ImageView来测试它。
我不确定为什么这不起作用。
Button takePhoto = (Button)findViewById(R.id.takephoto);
takePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
mCamera.takePicture(shutterCallback, rawCallback,
jpegCallback);
}
});
}
ShutterCallback shutterCallback = new ShutterCallback() {
public void onShutter() {
}
};
/** Handles data for raw picture */
PictureCallback rawCallback = new PictureCallback() {
public void onPictureTaken(byte[] arg0, Camera camera) {
}
};
/** Handles data for jpeg picture */
PictureCallback jpegCallback = new PictureCallback() {
public void onPictureTaken(byte[] arg0, Camera camera) {
Bitmap photo = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);
tempSavePhoto(photo);
switchToPolaroidView();
}
};
public void tempSavePhoto(Bitmap photo){
File root = new File(Environment.getExternalStorageDirectory() + File.separator + "Photos");
File image = new File(root, "toSend.jpg");
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
boolean success = false;
FileOutputStream outStream;
try {
outStream = new FileOutputStream(image);
photo.compress(Bitmap.CompressFormat.PNG, 100, outStream);
/* 100 to keep full quality of the image */
outStream.flush();
outStream.close();
success = true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (success) {
Toast.makeText(getApplicationContext(), "Saved successfully",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(),
"Error during image saving", Toast.LENGTH_SHORT).show();
}
}
答案 0 :(得分:1)
将此添加到您的清单
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
这个应用程序很可能没有权限保存到您的其他人所在的SDCard。添加此授予权限
答案 1 :(得分:1)
我尝试了一种不同的方法并且有效。不知道为什么另一个没有工作,但它现在保存照片就好了。以下是我使用的内容:
public void tempSavePhoto(Bitmap photo){
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 40, bytes);
File f = new File(Environment.getExternalStorageDirectory()
+ File.separator + "test.jpg");
try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
FileOutputStream fo = null;
try {
fo = new FileOutputStream(f);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fo.write(bytes.toByteArray());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
}
请注意我从this post得到了这个想法,并投了赞成帮助我的答案。