Android 从相机捕获照片时获取IllegalArgumentException

Android 从相机捕获照片时获取IllegalArgumentException,android,android-camera-intent,image-capture,android-fileprovider,Android,Android Camera Intent,Image Capture,Android Fileprovider,在我的项目中,我使用FileProvider.getUriForFile和给定的provider_path.xml文件: 在文件Uri中,路径类似于/storage/emulated/0/StrengGeheim/06673da7-876f-4a53-9a3d-288ae033f7ac,从gallery存储图像的路径也相同。但在拍摄照片和应用程序关闭时,我仍然会遇到以下错误 E/AndroidRuntime: FATAL EXCEPTION: main Process

在我的项目中,我使用FileProvider.getUriForFile和给定的provider_path.xml文件:

在文件Uri中,路径类似于/storage/emulated/0/StrengGeheim/06673da7-876f-4a53-9a3d-288ae033f7ac,从gallery存储图像的路径也相同。但在拍摄照片和应用程序关闭时,我仍然会遇到以下错误

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.stegano.strenggeheim, PID: 19189
              java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/StrengGeheim/8bb91a47-d33f-428d-a6ee-1f974e61e63e.png
                  at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:712)
                  at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:401)
                  at com.stegano.strenggeheim.fragment.FragmentEncode.getOutputMediaFileUri(FragmentEncode.java:68)
                  at com.stegano.strenggeheim.fragment.FragmentEncode.cameraIntent(FragmentEncode.java:61)
                  at com.stegano.strenggeheim.fragment.FragmentEncode.access$100(FragmentEncode.java:35)
                  at com.stegano.strenggeheim.fragment.FragmentEncode$2.onClick(FragmentEncode.java:111)
                  at android.support.v7.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1044)
                  at android.widget.AdapterView.performItemClick(AdapterView.java:318)
                  at android.widget.AbsListView.performItemClick(AbsListView.java:1165)
                  at android.widget.AbsListView$PerformClick.run(AbsListView.java:3134)
                  at android.widget.AbsListView$3.run(AbsListView.java:4049)
                  at android.os.Handler.handleCallback(Handler.java:789)
                  at android.os.Handler.dispatchMessage(Handler.java:98)
                  at android.os.Looper.loop(Looper.java:164)
                  at android.app.ActivityThread.main(ActivityThread.java:6541)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
以下是我处理ActivityResult的方式:

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == getActivity().RESULT_CANCELED) {
        return;
    }
    try {
        if (requestCode == GALLERY && data != null) {

                    Bitmap bitmap = getBitmapFromData(data, getContext());
                    File mediaFile = getOutputMediaFile();
                    String path = saveImage(bitmap, mediaFile);
                    Log.println(Log.INFO, "Message", path);
                    Toast.makeText(getContext(), MESSAGE_IMAGE_SAVED, Toast.LENGTH_SHORT).show();
                    loadImage.setImageBitmap(bitmap);
                    imageTextMessage.setVisibility(View.INVISIBLE);

        } else if (requestCode == CAMERA) {
                File file =  new File(fileUri.getPath());
                final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath());
                loadImage.setImageBitmap(bitmap);
                saveImage(bitmap, file);
                Toast.makeText(getContext(), MESSAGE_IMAGE_SAVED, Toast.LENGTH_SHORT).show();
                imageTextMessage.setVisibility(View.INVISIBLE);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
        Toast.makeText(getContext(), MESSAGE_FAILED, Toast.LENGTH_SHORT).show();
    }
}

private Bitmap getBitmapFromData(Intent intent, Context context){
    Uri selectedImage = intent.getData();
    String[] filePathColumn = { MediaStore.Images.Media.DATA };
    Cursor cursor = context.getContentResolver().query(selectedImage,filePathColumn, null, null, null);
    cursor.moveToFirst();
    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    String picturePath = cursor.getString(columnIndex);
    cursor.close();
    return BitmapFactory.decodeFile(picturePath);
}

private String saveImage(Bitmap bmpImage, File mediaFile) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bmpImage.compress(Bitmap.CompressFormat.PNG, 100, bytes);
    try {
        FileOutputStream fo = new FileOutputStream(mediaFile);
        fo.write(bytes.toByteArray());
        MediaScannerConnection.scanFile(getContext(),
                new String[]{mediaFile.getPath()},
                new String[]{"image/png"}, null);
        fo.close();

        return mediaFile.getAbsolutePath();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    return "";
}

有人能帮忙吗?

java.lang.IllegalArgumentException:未能找到包含/storage/emulated/0/StrengGeheim/8bb91a47-d33f-428d-a6ee-1f974e61e63e.png的已配置根目录-您的文件提供程序配置错误。编辑您的问题并发布FileProvider元数据XML文件。@Commonware我添加了AndroidManifest.XML的配置,但在android中path是必需的属性。@JaiPrak:name在FileProvider元数据中是必需的。路径不是。在您的情况下,您也可以将路径设置为StrengGeheim,因为文件位于该位置。我在上面的xml中输入了与StrengGeheim相同的名称和路径,但没有新路径是/StrengGeheim/f8ed9663-7a60-436f-ade7-f94761b3ead0.png,并且正在获取FileNotFoundException。@JaiPrak:这是一个与以前不同的异常。最有可能的是,这是来自新的fileuri.getPath调用,这是错误的。您使用了正确的文件对象-它是您传递给FileProvider的对象。使用该文件。仍然无法获得FileNotFoundException。
<paths>
  <external-files-path name="StrengGeheim" path="/" />
</paths>
E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.stegano.strenggeheim, PID: 19189
              java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/StrengGeheim/8bb91a47-d33f-428d-a6ee-1f974e61e63e.png
                  at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:712)
                  at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:401)
                  at com.stegano.strenggeheim.fragment.FragmentEncode.getOutputMediaFileUri(FragmentEncode.java:68)
                  at com.stegano.strenggeheim.fragment.FragmentEncode.cameraIntent(FragmentEncode.java:61)
                  at com.stegano.strenggeheim.fragment.FragmentEncode.access$100(FragmentEncode.java:35)
                  at com.stegano.strenggeheim.fragment.FragmentEncode$2.onClick(FragmentEncode.java:111)
                  at android.support.v7.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1044)
                  at android.widget.AdapterView.performItemClick(AdapterView.java:318)
                  at android.widget.AbsListView.performItemClick(AbsListView.java:1165)
                  at android.widget.AbsListView$PerformClick.run(AbsListView.java:3134)
                  at android.widget.AbsListView$3.run(AbsListView.java:4049)
                  at android.os.Handler.handleCallback(Handler.java:789)
                  at android.os.Handler.dispatchMessage(Handler.java:98)
                  at android.os.Looper.loop(Looper.java:164)
                  at android.app.ActivityThread.main(ActivityThread.java:6541)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == getActivity().RESULT_CANCELED) {
        return;
    }
    try {
        if (requestCode == GALLERY && data != null) {

                    Bitmap bitmap = getBitmapFromData(data, getContext());
                    File mediaFile = getOutputMediaFile();
                    String path = saveImage(bitmap, mediaFile);
                    Log.println(Log.INFO, "Message", path);
                    Toast.makeText(getContext(), MESSAGE_IMAGE_SAVED, Toast.LENGTH_SHORT).show();
                    loadImage.setImageBitmap(bitmap);
                    imageTextMessage.setVisibility(View.INVISIBLE);

        } else if (requestCode == CAMERA) {
                File file =  new File(fileUri.getPath());
                final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath());
                loadImage.setImageBitmap(bitmap);
                saveImage(bitmap, file);
                Toast.makeText(getContext(), MESSAGE_IMAGE_SAVED, Toast.LENGTH_SHORT).show();
                imageTextMessage.setVisibility(View.INVISIBLE);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
        Toast.makeText(getContext(), MESSAGE_FAILED, Toast.LENGTH_SHORT).show();
    }
}

private Bitmap getBitmapFromData(Intent intent, Context context){
    Uri selectedImage = intent.getData();
    String[] filePathColumn = { MediaStore.Images.Media.DATA };
    Cursor cursor = context.getContentResolver().query(selectedImage,filePathColumn, null, null, null);
    cursor.moveToFirst();
    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    String picturePath = cursor.getString(columnIndex);
    cursor.close();
    return BitmapFactory.decodeFile(picturePath);
}

private String saveImage(Bitmap bmpImage, File mediaFile) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bmpImage.compress(Bitmap.CompressFormat.PNG, 100, bytes);
    try {
        FileOutputStream fo = new FileOutputStream(mediaFile);
        fo.write(bytes.toByteArray());
        MediaScannerConnection.scanFile(getContext(),
                new String[]{mediaFile.getPath()},
                new String[]{"image/png"}, null);
        fo.close();

        return mediaFile.getAbsolutePath();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    return "";
}
<paths>
  <external-files-path name="StrengGeheim" path="/" />
</paths>
<paths>
  <external-path name="StrengGeheim" path="."/>
</paths>