Назначение камеры Android

Мне нужно нажать на приложение камеры по умолчанию, чтобы сделать снимок, сохранить его и вернуть URI. Есть какой-либо способ сделать это?

private static final int TAKE_PICTURE = 1; private Uri imageUri; public void takePhoto(View view) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File photo = new File(Environment.getExternalStorageDirectory(), "Pic.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo)); imageUri = Uri.fromFile(photo); startActivityForResult(intent, TAKE_PICTURE); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case TAKE_PICTURE: if (resultCode == Activity.RESULT_OK) { Uri selectedImage = imageUri; getContentResolver().notifyChange(selectedImage, null); ImageView imageView = (ImageView) findViewById(R.id.ImageView); ContentResolver cr = getContentResolver(); Bitmap bitmap; try { bitmap = android.provider.MediaStore.Images.Media .getBitmap(cr, selectedImage); imageView.setImageBitmap(bitmap); Toast.makeText(this, selectedImage.toString(), Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT) .show(); Log.e("Camera", e.toString()); } } } } 

Попробуйте следующее, что я нашел здесь

 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); startActivityForResult(intent, 0); @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK && requestCode == 0) { String result = data.toURI(); // ... } } 

Мне потребовалось несколько часов, чтобы заставить это работать. Код это почти копия-паста с сайта developer.android.com с незначительной разницей.

Запросите это разрешение на AndroidManifest.xml :

  

В своей Activity начните с определения этого:

 static final int REQUEST_IMAGE_CAPTURE = 1; private Bitmap mImageBitmap; private String mCurrentPhotoPath; private ImageView mImageView; 

Затем запустите это Intent в onClick :

 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (cameraIntent.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 Log.i(TAG, "IOException"); } // Continue only if the File was successfully created if (photoFile != null) { cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE); } } 

Добавьте следующий способ поддержки:

 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; } 

Затем получите результат:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { try { mImageBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)); mImageView.setImageBitmap(mImageBitmap); } catch (IOException e) { e.printStackTrace(); } } } 

Что заставило его работать, это MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)) , который отличается от кода от developer.android.com . Исходный код дал мне FileNotFoundException .

Попробуйте следующее, что я нашел. Вот ссылка

Если ваше приложение нацелено на M и выше и объявляет с использованием разрешения CAMERA, которое не предоставляется, попытка попытаться использовать это действие приведет к исключению SecurityException.

EasyImage.openCamera(Activity activity, int type);

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); EasyImage.handleActivityResult(requestCode, resultCode, data, this, new DefaultCallback() { @Override public void onImagePickerError(Exception e, EasyImage.ImageSource source, int type) { //Some error handling } @Override public void onImagesPicked(List imagesFiles, EasyImage.ImageSource source, int type) { //Handle the images onPhotosReturned(imagesFiles); } }); } 

Я нашел довольно простой способ сделать это. Используйте кнопку, чтобы открыть ее с помощью прослушивателя on click чтобы запустить функцию openc() , например:

 String fileloc; private void openc() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File f = null; try { f = File.createTempFile("temppic",".jpg",getApplicationContext().getCacheDir()); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,FileProvider.getUriForFile(profile.this, BuildConfig.APPLICATION_ID+".provider",f)); fileloc = Uri.fromFile(f)+""; Log.d("texts", "openc: "+fileloc); startActivityForResult(takePictureIntent, 3); } } catch (IOException e) { e.printStackTrace(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == 3 && resultCode == RESULT_OK) { Log.d("texts", "onActivityResult: "+fileloc); // fileloc is the uri of the file so do whatever with it } } 

Вы можете делать все, что хотите, с помощью строки местоположения uri . Например, я отправляю его на обрезку изображения, чтобы обрезать изображение.

попробуйте этот код

 Intent photo= new Intent("android.media.action.IMAGE_CAPTURE"); startActivityForResult(photo, CAMERA_PIC_REQUEST); 
  • Предварительный просмотр камеры для Android
  • Управление камерой для съемки в портрете не приводит к повороту окончательных изображений
  • Прекратить сохранение фотографий с помощью встроенной камеры Android
  • Значение тега ориентации EXIF ​​всегда 0 для изображения, сделанного с помощью приложения для портретов с вертикальной камерой
  • Как захватить и сохранить изображение с помощью пользовательской камеры в Android?
  • Давайте будем гением компьютера.