android studio怎么调用相机

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android studio怎么调用相机相关的知识,希望对你有一定的参考价值。

参考技术A android 调用系统相机解决方法:直接通过Intent调用系统相机
直接调用系统的相机应用,只需要在Intent对象中传入相应的参数即可,总体来说需要以下三步:
1. Compose a Camera Intent
  MediaStore.ACTION_IMAGE_CAPTURE 拍照;
  MediaStore.ACTION_VIDEO_CAPTURE录像。
2. Start the Camera Intent
  使用startActivityForResult()方法,并传入上面的intent对象。
  之后,系统自带的相机应用就会启动,用户就可以用它来拍照或者录像。
3. Receive the Intent Result
  用onActivityResult()接收传回的图像,当用户拍完照片或者录像,或者取消后,系统都会调用这个函数。本回答被提问者采纳

Android Studio 3.6.3 - 拍照时相机错误:打开失败:ENOENT(没有这样的文件或目录)

【中文标题】Android Studio 3.6.3 - 拍照时相机错误:打开失败:ENOENT(没有这样的文件或目录)【英文标题】:Android Studio 3.6.3 - Camera error on taking a picture: open failed: ENOENT (No such file or directory) 【发布时间】:2020-08-21 14:54:41 【问题描述】:

由于我已将 Android Studio 更新到 3.6.3,我无法在 onActivityResult() 函数中拍照。我使用的是装有 Android 8 的三星手机,并且 StorageCamera 权限设置为允许。

这是我的代码:

   int CAMERA = 0;
   int GALLERY = 1;
   Uri imageURI;
   File file;

   public void openCamera() 
       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
       file = new File(Environment.getExternalStorageDirectory(), "image.jpg");
       imageURI = FileProvider.getUriForFile(getApplicationContext(), getPackageName() + ".provider", file);
       intent.putExtra(MediaStore.EXTRA_OUTPUT, imageURI);
       startActivityForResult(intent, CAMERA);
   


 // onActivityResult
 @Override
   public void onActivityResult(int requestCode, int resultCode, Intent data) 
       super.onActivityResult(requestCode, resultCode, data);

       if (resultCode == Activity.RESULT_OK) 
          Bitmap bmp;

           // • IMAGE FROM CAMERA
           if (requestCode == CAMERA) 
              try 
                  File f = file;
                  ExifInterface exif = new ExifInterface(f.getPath());
                  int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

                  int angle = 0;
                  if (orientation == ExifInterface.ORIENTATION_ROTATE_90)  angle = 90;
                   else if (orientation == ExifInterface.ORIENTATION_ROTATE_180)  angle = 180;
                   else if (orientation == ExifInterface.ORIENTATION_ROTATE_270)  angle = 270; 

                  Matrix mat = new Matrix();
                  mat.postRotate(angle);

                  bmp = BitmapFactory.decodeStream(new FileInputStream(f), null, null);
                  assert bmp != null;
                  bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), mat, true);
                  bmp = scaleBitmapToMaxSize(800, bmp);

                  myImgView.setImageBitmap(bmp);

               // error
                catch (IOException | OutOfMemoryError e)  Log.i("log-", "ERROR: " + e.getMessage()); 
     
  // ./ If RESULT_OK



// Scale image
public static Bitmap scaleBitmapToMaxSize(int maxSize, Bitmap bm) 
      int outWidth;
      int outHeight;
      int inWidth = bm.getWidth();
      int inHeight = bm.getHeight();
      if (inWidth > inHeight) 
         outWidth = maxSize;
         outHeight = (inHeight * maxSize) / inWidth;
       else 
         outHeight = maxSize;
         outWidth = (inWidth * maxSize) / inHeight;
      
      return Bitmap.createScaledBitmap(bm, outWidth, outHeight, false);
   

清单:

<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA"/>

拍照后,我在 Logcat 中收到此错误,当然 myImgView 中没有显示图片:

ERROR: /storage/emulated/0/image.jpg: open failed: ENOENT (No such file or directory)

我该如何解决这个问题?

【问题讨论】:

你在哪里请求WRITE_EXTERNAL_STORAGE,包括运行时权限? 在单独的Application类中,在应用设置中允许Camera权限,以及对外部存储的读写权限 【参考方案1】:

我通过使用一行代码找到了解决方案,它似乎必须是临时的,但到目前为止它适用于 Android 10 设备。

只需在 Manifest.xml 文件的 &lt;application 标记内添加这一行:

android:requestLegacyExternalStorage="true" 

这将允许应用将图片和视频保存在内部存储中 - 保存到带有项目包名称的文件夹中。

【讨论】:

以上是关于android studio怎么调用相机的主要内容,如果未能解决你的问题,请参考以下文章

android怎么调用系统服务

android 相机 怎么改变相机预览界面大小

Android studio从相册里面选图片无法选中

基于android studio3.0编写的蓝牙串口

Android中的相机方向问题

Android 调用系统相机拍照后 添加文字水印