Android11调用相机保存图片的方法

原文链接:Android11调用相机保存并显示图片到imageview_Cingke是真的的博客-CSDN博客

 android11版本因为加强了创建文件的限制,所以用以前保存图片的方法就行不通了。

1、在获取相关权限后,调用相机

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//确保有相机来处理Intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
    File photoFile = saveFileName1();
    tempFile1 = photoFile;
    if (photoFile != null) {
        Uri photoURI = FileProvider.getUriForFile(getApplicationContext(), getPackageName() + ".fileprovider", photoFile);
        takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
        startActivityForResult(takePictureIntent, 1);
    }
}

2、配置FileProvider,用于app之间的文件共享

//在application标签里
<provider
    android:authorities="com.xxxxx.xxxxx.fileprovider"//唯一标识,可以自定义,一般用包名
    android:name="androidx.core.content.FileProvider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths">
    </meta-data>
</provider>

   之后配置对应路径的xml文件

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="." />
</paths>

 

3、保存位置

private String currentPath;//配置全局变量

private File saveFileName1() {
    
    File newFolder = this.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
    Date date = new Date(System.currentTimeMillis());
    String name = format.format(date) + ".jpg";
    File ji = null;
    try {
        ji = new File(newFolder + "/" + name);
        ji.createNewFile();
        currentPath = ji.getAbsolutePath();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ji;
}

 

4、处理返回结果 

@Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       // TODO Auto-generated method stub
       super.onActivityResult(requestCode, resultCode, data);
       if (requestCode == 0) {
           FileOutputStream o=null;
           Bitmap bitmap=BitmapFactory.decodeFile(currentPath);
           //显示
           image.setImageBitmap(bitmap);
          //图片在文件管理器打不开,需要移出应用私有目录才可查看
       }
   }
 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android Studio中调用相机并保存到相册,您可以遵循以下步骤: 1. 在AndroidManifest.xml文件中添加相机和写入外部存储的权限: ```xml <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 2. 在布局文件中添加一个按钮或其他视图来触发相机操作: ```xml <Button android:id="@+id/btn_take_picture" android:text="Take Picture" /> ``` 3. 在Activity中添加代码来处理相机操作: ```java private static final int REQUEST_IMAGE_CAPTURE = 1; private String currentPhotoPath; // 创建保存图片的文件 private File createImageFile() throws IOException { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File image = File.createTempFile( imageFileName, /* 前缀 */ ".jpg", /* 后缀 */ storageDir /* 存储目录 */ ); currentPhotoPath = image.getAbsolutePath(); return image; } // 调用相机 private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { // 创建保存图片的文件 File photoFile = null; try { photoFile = createImageFile(); } catch (IOException ex) { // 处理异常 } if (photoFile != null) { Uri photoURI = FileProvider.getUriForFile(this, "com.example.android.fileprovider", photoFile); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } } } // 处理拍摄结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { // 图片保存成功后,将其添加到相册中 Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); File f = new File(currentPhotoPath); Uri contentUri = Uri.fromFile(f); mediaScanIntent.setData(contentUri); this.sendBroadcast(mediaScanIntent); } } ``` 4. 在AndroidManifest.xml文件中添加FileProvider: ```xml <application> ... <provider android:name="androidx.core.content.FileProvider" android:authorities="com.example.android.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application> ``` 5. 在res/xml目录下创建file_paths.xml文件: ```xml <?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="my_images" path="Pictures" /> </paths> ``` 现在,当用户点击“Take Picture”按钮时,将启动相机应用程序,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值