Android FileUri为捕获的图像创建单独文件夹时会出现异常

Android FileUri为捕获的图像创建单独文件夹时会出现异常,android,android-camera,Android,Android Camera,我正在尝试使用下面的代码将相机拍摄的图像存储在单独的文件夹中,但当我执行此代码时,我遇到了异常,我尝试了很多方法来获得解决方案,但没有用,请有人能帮我吗 android.os.FileUrieExposedException:file:///storage/emulated/0/MyRamImages/FILENAME.jpg 通过ClipData.Item.getUri()在应用程序之外公开 代码:- 而不是返回Uri.fromFile(mediaFile)执行 return FileProv

我正在尝试使用下面的代码将相机拍摄的图像存储在单独的文件夹中,但当我执行此代码时,我遇到了异常,我尝试了很多方法来获得解决方案,但没有用,请有人能帮我吗

android.os.FileUrieExposedException:file:///storage/emulated/0/MyRamImages/FILENAME.jpg 通过ClipData.Item.getUri()在应用程序之外公开

代码:-
而不是返回
Uri.fromFile(mediaFile)执行

return FileProvider.getUriForFile(MainActivity.this,
                                  BuildConfig.APPLICATION_ID + ".provider",
                                  mediaFile);
这将要求您向AndroidManifest添加提供程序:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  ...
  <application
  ...
  <provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>
  </provider>
 </application>


首先只需捕获图像,然后在onActivityResult中获取图像作为位图,然后将其保存到要保存的路径

private void openCamera()
{
        // Start the camera and take the image
        // handle the storage part in on activity result
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, CAPTURE_IMAGE_REQUEST_CODE);
}
并在活动结果方法中编写以下代码

if (requestCode == CAPTURE_IMAGE_REQUEST_CODE)
{
     if (resultCode == RESULT_OK)
     {
         Bitmap imgBitmap = (Bitmap) data.getExtras().get("data");
         File sd = Environment.getExternalStorageDirectory();
         File imageFolder = new File(sd.getAbsolutePath() + File.separator +
                        "FolderName" + File.separator + "InsideFolderName");

         if (!imageFolder.isDirectory())
         {
              imageFolder.mkdirs();
         }

         File mediaFile = new File(imageFolder + File.separator + "img_" +
                            System.currentTimeMillis() + ".jpg");

         FileOutputStream fileOutputStream = new FileOutputStream(mediaFile);
         imgBitmap.compress(Bitmap.CompressFormat.JPEG, 90, fileOutputStream);
         fileOutputStream.close();
     }
}

这在7.1.1和更低版本中也适用。

这是什么提供商路径?您知道如何为捕获图像添加地理标记吗?
这在7.1.1和更低版本中也适用。
??也许有一次吧。但是第二次-如果目录已经存在-它什么也不做。
在onActivityResult中以位图的形式获取图像,然后保存该图像。这不是图像。这只是图像的一个重击。@greenapps——只是括号不匹配。编辑了代码。此外,您应该检查mkdirs()的返回值,因为它可能无法创建目录。在这种情况下,您应该敬酒并返回。现在你盲目地继续。你应该使用一个文件提供者,如果你曾经在谷歌上搜索过这个例外,你就会知道它。因此@Sandeep Kumar给出了正确的答案。我想知道你为什么会用另一个答案,只给你一个缩略图。
private void openCamera()
{
        // Start the camera and take the image
        // handle the storage part in on activity result
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, CAPTURE_IMAGE_REQUEST_CODE);
}
if (requestCode == CAPTURE_IMAGE_REQUEST_CODE)
{
     if (resultCode == RESULT_OK)
     {
         Bitmap imgBitmap = (Bitmap) data.getExtras().get("data");
         File sd = Environment.getExternalStorageDirectory();
         File imageFolder = new File(sd.getAbsolutePath() + File.separator +
                        "FolderName" + File.separator + "InsideFolderName");

         if (!imageFolder.isDirectory())
         {
              imageFolder.mkdirs();
         }

         File mediaFile = new File(imageFolder + File.separator + "img_" +
                            System.currentTimeMillis() + ".jpg");

         FileOutputStream fileOutputStream = new FileOutputStream(mediaFile);
         imgBitmap.compress(Bitmap.CompressFormat.JPEG, 90, fileOutputStream);
         fileOutputStream.close();
     }
}