在这一行:BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
它会抛出一个fileNotFound异常。这是Logcat:
01-29 23:56:12.296: E/BitmapFactory(30046): Unable to decode stream: java.io.FileNotFoundException: /file:/storage/emulated/0/Pictures/JPEG_20140129_235544_1090805596.jpg: open failed: ENOENT (No such file or directory)
这是在setPic()中;但是在启动intent时文件会被保存并添加到库中,所以在onActivityResult之前,它应该在那里。你看到有什么问题吗?此代码取自Android开发者网站http://developer.android.com/training/camera/photobasics.html
static final int REQUEST_TAKE_PHOTO = 1001;
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
}
// Continue only if the File was successfully created
if (photoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
}
}
private void galleryAddPic() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(mCurrentPhotoPath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}
编辑下一个代码块来自onActivityResult:
else if ((requestCode == REQUEST_TAKE_PHOTO) && (resultcode == -1)){
// Uri selectedImage = imageUri;
mProfilePicPath = mCurrentPhotoPath;
mPortraitPhoto = setPic();
TextView tv = (TextView) findViewById(id.ProfilePicText);
tv.setText(mProfilePicPath);
//}
// }
}
}catch(Exception ex){
Log.d("shkdghrfb", ex.toString());
}
}
String mCurrentPhotoPath;
private Bitmap setPic() {
// Get the dimensions of the View
// Get the dimensions of the bitmap
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
// Determine how much to scale down the image
//int scaleFactor = Math.min(photoW/targetW, photoH/targetH);
// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = 5;
bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
//mImageView.setImageBitmap(bitmap);
return bitmap;
}
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = "file:" + image.getAbsolutePath();
galleryAddPic();
return image;
}
我添加的清单权限:
<uses-permission android:name="android.permission.CAMERA" android:required="false" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
答案 0 :(得分:5)
我认为文件名中的“文件”不是正确的文件名所以删除它。已将mCurrentPhotoPath = "file:" + image.getAbsolutePath();
更改为mCurrentPhotoPath = image.getAbsolutePath();
。如果这只是一个黑客修复请告诉我。重要的是,这适用于所有兼容的设备。