相机活动返回null Android
我正在build立一个应用程序,我想通过默认的摄像机活动捕捉图像,并返回到我的活动,并在imageview中加载该图像。 问题是相机活动总是返回null。 在我的onActivityResult(int requestCode,int resultCode,Intent数据)方法我得到的数据为空。 这是我的代码
public class CameraCapture extends Activity { protected boolean _taken = true; File sdImageMainDirectory; Uri outputFileUri; protected static final String PHOTO_TAKEN = "photo_taken"; private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0; @Override public void onCreate(Bundle savedInstanceState) { try { super.onCreate(savedInstanceState); setContentView(R.layout.cameracapturedimage); File root = new File(Environment .getExternalStorageDirectory() + File.separator + "myDir" + File.separator); root.mkdirs(); sdImageMainDirectory = new File(root, "myPicName"); startCameraActivity(); } catch (Exception e) { finish(); Toast.makeText(this, "Error occured. Please try again later.", Toast.LENGTH_SHORT).show(); } } protected void startCameraActivity() { outputFileUri = Uri.fromFile(sdImageMainDirectory); Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE: { if(resultCode==Activity.RESULT_OK) { try{ ImageView imageView=(ImageView)findViewById(R.id.cameraImage); imageView.setImageBitmap((Bitmap) data.getExtras().get("data")); } catch (Exception e) { // TODO: handle exception } } break; } default: break; } } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { if (savedInstanceState.getBoolean(CameraCapture.PHOTO_TAKEN)) { _taken = true; } } @Override protected void onSaveInstanceState(Bundle outState) { outState.putBoolean(CameraCapture.PHOTO_TAKEN, _taken); }
我做错了什么吗??????????
你错了,因为你做错了。
如果您通过相机意图传递额外的参数MediaStore.EXTRA_OUTPUT
,则相机活动将捕获的图像写入该path,并且不会返回onActivityResult
方法中的位图。
如果你将检查你正在传递的path,那么你会知道,实际上相机已经在该path中写入捕获的文件。
欲了解更多信息,你可以按照这个 , 这个和这个
我正在做另一种方式。 data.getData()字段不能保证返回一个Uri,所以我正在检查它是否为null,如果它是那么图像是额外的。 所以代码将是 –
if(data.getData()==null){ bitmap = (Bitmap)data.getExtras().get("data"); }else{ bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), data.getData()); }
我在生产应用程序中使用这个代码,它正在工作。
我有一个类似的问题。 我在清单文件中注释了一些行,导致缩略图数据返回为null。
您需要以下才能使其工作:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />
我希望这能解决你的问题
如果你的手机是三星,它可能与这个http://kevinpotgieter.wordpress.com/2011/03/30/null-intent-passed-back-on-samsung-galaxy-tab/有关;
还有一个问题可以提供额外的信息
如果使用ImageView显示Camera Intent返回的位图,则需要将imageview引用保存在onSaveInstanceState中,并稍后在onRestoreInstanceState中将其还原。 查看下面的onSaveInstanceState和onRestoreInstanceState的代码。
public class MainActivity extends Activity { private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 1; String mCurrentPhotoPath; ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); imageView = (ImageView) findViewById(R.id.imageView1); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void startCamera(View v) throws IOException { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File photoFile = null; photoFile = createImageFile(); //intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photoFile)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); } } protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) { Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap) extras.get("data"); System.out.println(imageBitmap); imageView.setImageBitmap(imageBitmap); } } private File createImageFile() throws IOException { 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(); System.out.println(mCurrentPhotoPath); return image; } private void setPic() { // Get the dimensions of the View int targetW = imageView.getWidth(); int targetH = imageView.getHeight(); // 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 = scaleFactor; bmOptions.inPurgeable = true; Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); imageView.setImageBitmap(bitmap); } @Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); System.out.println(mCurrentPhotoPath); imageView = (ImageView) findViewById(R.id.imageView1); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onRestoreInstanceState(savedInstanceState); System.out.println(mCurrentPhotoPath); imageView = (ImageView) findViewById(R.id.imageView1); } }
尝试下面的代码
{ final String[] imageColumns = { MediaStore.Images.Media._ID,MediaStore.Images.Media.DATA }; final String imageOrderBy = MediaStore.Images.Media._ID + " DESC"; Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy); imageCursor.moveToFirst(); do { String fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA)); if (fullPath.contains("DCIM")) { //get bitmap from fullpath here. return; } } while (imageCursor.moveToNext());
经过多次search:
private static final int TAKE_PHOTO_REQUEST = 1; private ImageView mImageView; String mCurrentPhotoPath; private File photoFile; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_saisir_frais); mImageView = (ImageView) findViewById(R.id.imageViewPhoto); dispatchTakePictureIntent(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == TAKE_PHOTO_REQUEST && resultCode == RESULT_OK) { // set the dimensions of the image int targetW =100; int targetH = 100; // Get the dimensions of the bitmap BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds = true; BitmapFactory.decodeFile(photoFile.getAbsolutePath(), 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 = scaleFactor; bmOptions.inPurgeable = true; // stream = getContentResolver().openInputStream(data.getData()); Bitmap bitmap = BitmapFactory.decodeFile(photoFile.getAbsolutePath(),bmOptions); mImageView.setImageBitmap(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(); return image; } private void dispatchTakePictureIntent() { Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); try { photoFile = createImageFile(); takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); startActivityForResult(takePhotoIntent, TAKE_PHOTO_REQUEST); } catch (IOException e) { e.printStackTrace(); } }
您可以从发送到相机意向的文件生成位图。 请使用此代码…
@Override public void onActivityResult(int requestCode, int resultCode, Intent data){ switch (requestCode) { case CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE: { if(resultCode==Activity.RESULT_OK) { int orientation = getOrientationFromExif(sdImageMainDirectory);// get orientation that image taken BitmapFactory.Options options = new BitmapFactory.Options(); InputStream is = null; Matrix m = new Matrix(); m.postRotate(orientation);//rotate image is = new FileInputStream(sdImageMainDirectory); options.inSampleSize = 4 //(original_image_size/4); Bitmap bitmap = BitmapFactory.decodeStream(is,null,options); bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true); // set bitmap to image view //bitmap.recycle(); } break; } default: break; } } private int getOrientationFromExif(String imagePath) { int orientation = -1; try { ExifInterface exif = new ExifInterface(imagePath); int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (exifOrientation) { case ExifInterface.ORIENTATION_ROTATE_270: orientation = 270; break; case ExifInterface.ORIENTATION_ROTATE_180: orientation = 180; break; case ExifInterface.ORIENTATION_ROTATE_90: orientation = 90; break; case ExifInterface.ORIENTATION_NORMAL: orientation = 0; break; default: break; } } catch (IOException e) { //Log.e(LOG_TAG, "Unable to get image exif orientation", e); } return orientation; }
File cameraFile = null; public void openChooser() { Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); cameraFile = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg"); takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile)); String pickTitle = "Select or take a new Picture"; // Or get from strings.xml Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,new Intent[]{takePhotoIntent}); startActivityForResult(chooserIntent, SELECT_PHOTO); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case SELECT_PHOTO: if (resultCode == Activity.RESULT_OK) { Uri selectedImage = data.getData(); if (selectedImage != null) { //from gallery } else if (cameraFile != null) { //from camera Uri cameraPictureUri = Uri.fromFile(cameraFile); } } break; } }
试试这个教程。 它适用于我,并在宣言中像往常一样使用权限,也检查权限