Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 错误:打开失败:enoint(没有这样的文件或目录)_Android - Fatal编程技术网

Android 错误:打开失败:enoint(没有这样的文件或目录)

Android 错误:打开失败:enoint(没有这样的文件或目录),android,Android,我试图创建一个文件来保存相机中的图片,结果发现我无法创建该文件。 但我真的找不到错误。你能看一下并给我一些建议吗 private File createImageFile(){ File imageFile=null; String stamp=new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); File dir= Environment.getEx

我试图创建一个文件来保存相机中的图片,结果发现我无法创建该文件。 但我真的找不到错误。你能看一下并给我一些建议吗

    private File createImageFile(){
            File imageFile=null;
            String stamp=new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            File dir= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
            String imageFileName="JPEG_"+stamp+"_";
            try {
                imageFile=File.createTempFile(imageFileName,".jpg",dir);
            } catch (IOException e) {
                Log.d("YJW",e.getMessage());
            }
            return  imageFile;
        }
我已经添加了许可

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

这种方法总是会出现这样的错误:

打开失败:enoint(没有这样的文件或目录)

试试这个:

private File createImageFile() throws IOException {  

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());  

    String imageFileName="JPEG_"+stamp+".jpg";  

    File photo = new File(Environment.getExternalStorageDirectory(),  imageFileName);  

    return photo;
}  

图片目录可能还不存在。它不一定在那里

在中,代码使用
mkdirs
确保目录存在:

File path = Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES);
File file = new File(path, "DemoPicture.jpg");

try {
    // Make sure the Pictures directory exists.
    path.mkdirs(); 
…因此,在
createTempFile
替换之前,只需将
path.mkdirs()
添加到现有代码中即可:

Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES)
与:

确保您拨打:

mkdirs() // and not mkdir()
以下是适用于您的代码:

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = new File(Environment.getExternalStorageDirectory().toString(), "whatever_directory_existing_or_not/sub_dir_if_needed/");
        storageDir.mkdirs(); // make sure you call mkdirs() and not mkdir()
        File image = File.createTempFile(
                imageFileName,  // prefix
                ".jpg",         // suffix
                storageDir      // directory
        );

        // Save a file: path for use with ACTION_VIEW intents

        mCurrentPhotoPath = "file:" + image.getAbsolutePath();
        Log.e("our file", image.toString());
        return image;
    }
按照中给出的示例,我有一次不好的经历,我发现在stackoverflow中有许多其他人也有同样的经历,这是因为即使我们设置

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

该问题在某些设备中仍然存在

我的经验是,当我在调试模式下尝试该示例时,该示例工作正常,之后又进行了3次测试,结果我的SD突然损坏,但我认为这与他们的示例无关(有趣)。我买了一个新的SD卡,并再次尝试了它,结果发现发布模式和调试模式仍然存在相同的错误日志:目录不存在。最后,我必须自己创建目录,其中包含从手机摄像头捕获的图片。我是对的,它工作得非常完美


我希望这能帮助你和其他人寻找答案。

我使用了带有URI的contentResolver,它对我很有用。在另一篇我找不到的SO帖子上看到的

private String getRealPathFromURI(Uri contentURI) {
    String result;
    Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
    if (cursor == null) {
        result = contentURI.getPath();
    } else {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        result = cursor.getString(idx);
        cursor.close();
    }
    return result;
}

希望能有所帮助……

我已经这样解决了:

        public Intent getImageCaptureIntent(File mFile) {
             Intent mIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
             Uri photoURI = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", mFile);
             mIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);

             // The tip is this code below
             List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(mIntent, PackageManager.MATCH_DEFAULT_ONLY);
                 for (ResolveInfo resolveInfo : resInfoList) {
                      String packageName = resolveInfo.activityInfo.packageName;
                      grantUriPermission(packageName, photoURI, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
                 }

             return  mIntent;
        }
public-Intent获取图像捕获意图(文件mFile){
Intent minent=新的Intent(MediaStore.ACTION\u IMAGE\u CAPTURE);
Uri photoURI=FileProvider.getUriForFile(这是BuildConfig.APPLICATION_ID+“.provider”,mFile);
minent.putExtra(MediaStore.EXTRA_输出,photoURI);
//提示如下所示
List resinfo List=getPackageManager().queryIntentActivities(仅minent、PackageManager.MATCH_DEFAULT_);
对于(ResolveInfo ResolveInfo:ResInfo列表){
字符串packageName=resolveInfo.activityInfo.packageName;
grantUriPermission(packageName,photoURI,Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
返回薄荷糖;
}

如果您正在使用kotlin,请使用下面的功能。 您必须提供一个存储图像的路径,一个位图(在本例中为图像),如果您想降低图像质量,请提供%age,即50%

fun cacheLocally(localPath: String, bitmap: Bitmap, quality: Int = 100) {
        val file = File(localPath)
        file.createNewFile()
        val ostream = FileOutputStream(file)
        bitmap.compress(Bitmap.CompressFormat.JPEG, quality, ostream)
        ostream.flush()
        ostream.close()
    }

希望它能起作用。

当用户从图库中选择文件时,不能保证所选择的文件是由其他应用程序添加或编辑的。因此,如果用户选择了一个属于另一个应用程序的文件,我们就会遇到权限问题。快速修复方法是在AndroidManifest.xml文件中添加以下代码:

File dirPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File imageFile = new File(dirPath, "YourPicture.jpg");

try {
    if(!dirPath.isDirectory()) {
       dirPath.mkdirs(); 
    } 
    imageFile.createNewFile();

} catch(Exception e) {
    e.printStackTrace();
}
<manifest ... >
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>

...

注意:适用于API级别29或更高的

我在将位图保存到外部目录时遇到了相同的错误,并发现了一个有用的技巧

private void save(Bitmap bitmap) {
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
    String imageFileName = timeStamp + ".png";
    String path = MediaStore.Images.Media.insertImage(activity.getContentResolver(), bitmap, imageFileName, null);
    Uri uriimage = Uri.parse(path);
    // you made it, make  fun
    }
但这有一个缺点,即您无法更改目录,它总是将图像保存到图片目录,但如果您已修复,请免费填写以编辑我的代码:
哈哈哈{我不能在键盘上使用emojis},早安

一个快速修复方法是在AndroidManifest.xml文件中添加以下代码:

<manifest ... >
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>

...

以下是我找到的修复程序 首先在AndroidManifest文件中添加这两行

然后在setContentView方法之后添加下面的行

ActivityCompat.requestPermissions(FullImageActivity.this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_CODE);
要在gallery中保存图像,请使用以下代码

private void SaveImageToGallery() {
        BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable();
        Bitmap bitmap = drawable.getBitmap();
        FileOutputStream outputStream = null;
        File file = Environment.getExternalStorageDirectory();
        File dir = new File(file.getAbsolutePath()+"/folderName");
        dir.mkdirs();
        String filename = String.format("%d.jpg",System.currentTimeMillis());
        File outfile = new File(dir,filename);
        try{
            outputStream = new FileOutputStream(outfile);
            bitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream);
            outputStream.flush();
            outputStream.close();
        }catch(Exception e){
            Log.d("SavingError", "SaveImageToGallery: "+e.getMessage());
        }
        Toast.makeText(this, "Image saved in folderName folder", Toast.LENGTH_SHORT).show();
    }

有以下行:
//确保图片目录存在。path.mkdirs()。您确定目录已经存在吗?请尝试此链接:谢谢!在训练中没有这样的暗示。我应该搜索API引用。谢谢@贾维扬:是我的建议奏效了吗?如果是这样的话,我将添加它作为答案。因为Android 10(Api级别29)和更高版本不允许直接在外部存储中创建文件夹。。如果(!path.mkdirs()){Log.d(“不可用:”,path.getAbsolutePath());}getExternalStoragePublicDirectory(…)依赖于此,则应使用所需的getExternalFilesDir(Environment.DIRECTORY_PICTURES)检查新目录是否已由(!path.mkdirs()){Log.d创建。getExternalStoragePublicDirectory(…)依赖于此函数。getExternalFilesDir(null).toString();这是API 29的一个临时解决方案,只是它不能与API 30一起工作!它可以工作!。奇怪怎么了