Android 尝试拍照时,获取无法找到包含/storage/simulated/0/Pictures/NoteTaking/IMG_20170226_231007.jpg的配置根目录

Android 尝试拍照时,获取无法找到包含/storage/simulated/0/Pictures/NoteTaking/IMG_20170226_231007.jpg的配置根目录,android,android-camera,Android,Android Camera,我正在尝试制作一个应用程序,用模拟器而不是设备拍摄照片并显示。我遵循以下步骤: 第1部分)这是我的代码,它的作用是:file=FileProvider.getUriForFile(这是“edu.android.notetakingapplication.provider”,createFileDir()) 这部分在Mainxml中 if (!mediaStorageDir.exists()){ if (!mediaStorageDir.mkdirs()){

我正在尝试制作一个应用程序,用模拟器而不是设备拍摄照片并显示。我遵循以下步骤:

第1部分)这是我的代码,它的作用是:
file=FileProvider.getUriForFile(这是“edu.android.notetakingapplication.provider”,createFileDir())

这部分在Mainxml中

    if (!mediaStorageDir.exists()){
        if (!mediaStorageDir.mkdirs()){
            Log.d("NoteTaking", "failed to create directory");
            return null;
        }
    }

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    return new File(mediaStorageDir.getPath() + File.separator +
            "IMG_"+ timeStamp + ".jpg");
}
这是我的应用程序清单文件的提供程序部分

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="edu.android.notetakingapplication.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    </provider>

试试这个肯定会有用的:

Uri mImageCaptureUri;
private void operCamera() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),
            "tmp_avatar_" + String.valueOf(System.currentTimeMillis()) + ".jpg"));

    intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri);

    intent.putExtra("return-data", true);

    startActivityForResult(intent, 1);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1 && mImageCaptureUri != null && resultCode != 0) {
        if (mImageCaptureUri != null) {
            String path1 = mImageCaptureUri.getPath();
            if (path1 != null) {
                File file1 = new File(path1);
                Uri capturedUri = Uri.fromFile(file1);//here you get the URI
                //you can easily get the path from URI if you need
            }
        }
    }
}

无法解码流:java.io.FileNotFoundException:/external\u files/Pictures/notecaking/IMG\u 20170226\u 230608.jpg(没有这样的文件或目录)
。当然,您会得到该错误,因为它是文件对象或文件流的无效路径。您以错误的方式将uri保存到数据库中。您最好保存文件:getAbsoluthePath(),而不是Uri:getPath()。

您是否在清单文件中添加了权限:读取外部存储/写入外部存储是的,我提供了写入外部存储权限。您是否也可以添加此权限读取外部存储。但这和写作有关系吗。写入权限隐式地允许读取,因此如果需要写入外部存储器,则只需请求一个权限。仍然是一样的。
返回新文件(mediaStorageDir.getAbsolutePath()+File.separator+“IMG_”+timeStamp+”.jpg)我在createFileDir()中更改了它。但我还是犯了同样的错误。我删除了旧数据库并向新数据库添加了新路径。您没有显示产生错误的代码。。那我们该怎么帮助呢?如果你的路径仍然以“/external_files/P…”开头,那么你就知道你做错了什么。显示执行此操作的代码。并准确说出存储的内容。我认为你的“路径”已经错了,很抱歉。我添加了更多的部分。如果你不懂任何部分,请告诉我。在将值添加到数据库之前,我对文件.getAbsolutePath()执行了Log.v操作。它给了我这条路<代码>/external\u files/Pictures/NoteTaking/******
我添加了从数据库检索值并尝试使用路径设置图像视图的部分。这是第二部分。我实际上可以得到一条路径,但是得到了这个错误<代码>由以下原因引起:android.os.FileUriExposedException:file:///storage/emulated/0/tmp_avatar_1488215372729.jpg 通过ClipData.Item.getUri()暴露在应用程序之外获得它。。。我必须减少目标api和bam。能够单击、存储和查看照片。。
 <?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
Unable to decode stream: java.io.FileNotFoundException: /external_files/Pictures/NoteTaking/IMG_20170226_230608.jpg (No such file or directory)
Uri mImageCaptureUri;
private void operCamera() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),
            "tmp_avatar_" + String.valueOf(System.currentTimeMillis()) + ".jpg"));

    intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri);

    intent.putExtra("return-data", true);

    startActivityForResult(intent, 1);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1 && mImageCaptureUri != null && resultCode != 0) {
        if (mImageCaptureUri != null) {
            String path1 = mImageCaptureUri.getPath();
            if (path1 != null) {
                File file1 = new File(path1);
                Uri capturedUri = Uri.fromFile(file1);//here you get the URI
                //you can easily get the path from URI if you need
            }
        }
    }
}