我的Android应用程序中有一个功能,允许用户拍照,然后将它们保存在应用程序内的小图库中。
当我开始以肖像模式拍摄照片然后坚持纵向模式时,一切正常,但当我决定切换到横向模式时,我可以拍摄照片,但是当我点击确认按钮时(你决定继续拍照的那一刻)与实际照片或返回另一个)应用程序然后崩溃。不幸的是我现在无法发布日志,但这里是代码(完全基于您可以在Android网站上找到的代码):
这是我创建相机意图,文件并保存它的地方:
private File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "UNICAR_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, //-/ prefix
".jpg", //-/ suffix
storageDir //-/ directory
);
SaisieMission activity = (SaisieMission) getActivity();
activity.setCurrentPhotoPath("file:" + image.getAbsolutePath());
return image;
}
protected void dispatchTakePictureIntent() {
Context context = getActivity();
PackageManager packageManager = context.getPackageManager();
if (((SaisieMission) getActivity()).getNoPath() < 10) {
photoPaths = mission.getPaths();
if(packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA) == false) {
Toast.makeText(getActivity(), "xxx", Toast.LENGTH_SHORT)
.show();
return ;
}
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
SaisieMission activity = (SaisieMission) getActivity();
if (takePictureIntent.resolveActivity(context.getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
Toast toast = Toast.makeText(context, "xxx", Toast.LENGTH_SHORT);
toast.show();
}
if (photoFile != null) {
Uri fileUri = Uri.fromFile(photoFile);
activity.setCapturedImageURI(fileUri);
activity.setCurrentPhotoPath(fileUri.getPath());
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
activity.getCapturedImageURI());
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
}
} else {
Toast.makeText(getActivity(), getString(R.string.enough_photo), Toast.LENGTH_SHORT)
.show();
return ;
}
}
这就是onActivityResult()方法:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_TAKE_PHOTO && resultCode == Activity.RESULT_OK) {
SaisieMission saisiemission = (SaisieMission) getActivity();
galleryAddPic();
photoPaths[saisiemission.getNoPath()] = saisiemission.getCurrentPhotoPath();
saisiemission.incNoPath();
mission.setPaths(photoPaths);
} else {
Toast.makeText(getActivity(), "xxx", Toast.LENGTH_SHORT)
.show();
return ;
}
}
以下是我将图片放入图库的位置:
private void galleryAddPic() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
SaisieMission activity = (SaisieMission) getActivity();
File f = new File(activity.getCurrentPhotoPath());
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.getActivity().sendBroadcast(mediaScanIntent);
}
我也确切地说,我将所有这些方法都称为片段
感谢您阅读!
答案 0 :(得分:1)
尝试这样的事情:将特定图像文件名作为参数传递给Intent,以捕获图像作为putExtra参数。在媒体商店中插入此图像Uri,现在您可以将此Uri用于其他内容。您可以通过File.exist()
检查是否捕获了图像例如:
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, "Image File name");
Uri mCapturedImageURI = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent intentPicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intentPicture.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
startActivityForResult(intentPicture,ACTION_TAKE_PICTURE);
onActivityResult()中的添加:
selectedImagePath = getRealPathFromURI(mCapturedImageURI);
创建另一种方法 getRealPathFromURI()
//----------------------------------------
/**
* This method is used to get real path of file from from uri
*
* @param contentUri
* @return String
*/
//----------------------------------------
public String getRealPathFromURI(Uri contentUri)
{
try
{
String[] proj = {MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
catch (Exception e)
{
return contentUri.getPath();
}
}