简体   繁体   English

java.io.FileNotFoundException:没有这样的文件或目录错误

[英]java.io.FileNotFoundException: No such file or directory Error

I am downloading images to smartphone. 我正在将图像下载到智能手机。 For older versions not problem my code is working but for Oreo it is not working. 对于较旧的版本,没有问题,我的代码可以运行,但对于Oreo ,则不起作用。 I tried this code in Emulator. 我在模拟器中尝试了此代码。

I implemented a function to save image to external storage. 我实现了将图像保存到外部存储器的功能。

private void saveImageToExternalStorage(Bitmap finalBitmap,String name) {
    String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
    File myDir = new File(root + "/xx");
    myDir.mkdirs();
    String fname = name + ".jpg";
    File file = new File(myDir, fname);
    if (file.exists())
        file.delete();
    try {
        FileOutputStream out = new FileOutputStream(file);
        finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        out.flush();
        out.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }


    // Tell the media scanner about the new file so that it is
    // immediately available to the user.
    MediaScannerConnection.scanFile(this, new String[] { file.toString() }, null,
            new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.i("ExternalStorage", "Scanned " + path + ":");
                    Log.i("ExternalStorage", "-> uri=" + uri);
                }
            });

}

I am asking for permission request with Dexter Library. 我要向Dexter Library请求权限。 If permission is granted then I run task . 如果授予了权限,则运行task

    Dexter.withActivity(MainActivity.this)
            .withPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
            .withListener(new PermissionListener() {
                              @Override
                              public void onPermissionGranted(PermissionGrantedResponse response) {
                                  SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
                                  if (!prefs.getBoolean("firstTime", false)) {
                                      task.execute();
                                      SharedPreferences.Editor editor = prefs.edit();
                                      editor.putBoolean("firstTime", true);
                                      editor.commit();
                                  }
                              }

                              @Override
                              public void onPermissionDenied(PermissionDeniedResponse response) {
                                  Toast.makeText(MainActivity.this, "You need to allow permission if you want to use camera", Toast.LENGTH_LONG).show();

                              }

                              @Override
                              public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
                                  token.continuePermissionRequest();
                                  Toast.makeText(MainActivity.this, "You need to allow permission if you want to use camera", Toast.LENGTH_LONG).show();

                              }
                          }).check();

Then I save images with asynctask. 然后我用asynctask保存图像。

   final AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
        private ProgressDialog dialog;

        @Override
        protected void onPreExecute()
        {
            this.dialog = new ProgressDialog(MainActivity.this);
            this.dialog.setMessage(getString(R.string.newfeature));
            this.dialog.setCancelable(false);
            this.dialog.setOnCancelListener(new DialogInterface.OnCancelListener()
            {
                @Override
                public void onCancel(DialogInterface dialog)
                {
                    // cancel AsyncTask
                    cancel(false);
                }
            });

            this.dialog.show();

        }

        @Override
        protected Void doInBackground(Void... params)
        {
            // do your stuff


            Bitmap myBitmap2 = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.im2);
            saveImageToExternalStorage(myBitmap2,"imag2");
            myBitmap2.recycle();



            Bitmap myBitmap3 = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.im3);
            saveImageToExternalStorage(myBitmap3,"image3");
            myBitmap3.recycle();


            Bitmap myBitmap4 = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.im4);
            saveImageToExternalStorage(myBitmap4,"image4");
            myBitmap4.recycle();

            Bitmap myBitmap5= BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.im5);
            saveImageToExternalStorage(myBitmap5,"image5");
            myBitmap5.recycle();


            Bitmap myBitmap6 = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.im6);
            saveImageToExternalStorage(myBitmap6,"image6");
            myBitmap6.recycle();


            Bitmap myBitmap7 = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.im7);
            saveImageToExternalStorage(myBitmap7,"image7");
            myBitmap7.recycle();


            Bitmap myBitmap8 = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.im8);
            saveImageToExternalStorage(myBitmap8,"image8");
            myBitmap8.recycle();

            Bitmap myBitmap = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.im1);
            saveImageToExternalStorage(myBitmap,"image1");
            myBitmap.recycle();



            Bitmap myBitmap9 = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.im9);
            saveImageToExternalStorage(myBitmap9,"image9");
            myBitmap9.recycle();

            Bitmap myBitmap10 = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.im10);
            saveImageToExternalStorage(myBitmap10,"image10");
            myBitmap10.recycle();

            Bitmap myBitmap11 = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.im11);
            saveImageToExternalStorage(myBitmap11,"image11");
            myBitmap11.recycle();

            Bitmap myBitmap12 = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.im12);
            saveImageToExternalStorage(myBitmap12,"image12");
            myBitmap12.recycle();

            Bitmap myBitmap13 = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.im13);
            saveImageToExternalStorage(myBitmap13,"image13");
            myBitmap13.recycle();

            Bitmap myBitmap14 = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.im14);
            saveImageToExternalStorage(myBitmap14,"image14");
            myBitmap14.recycle();






            return null;
        }


        @Override
        protected void onPostExecute(Void result)
        {
            //called on ui thread
            if (this.dialog != null) {
                this.dialog.dismiss();
            }
        }

        @Override
        protected void onCancelled()
        {
            //called on ui thread
            if (this.dialog != null) {
                this.dialog.dismiss();
            }
        }
    };

Finally it gives this error in Oreo emulator: 最后,它在Oreo模拟器中给出了此错误:

09-18 12:32:52.167 5818-5936/x.x W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Pictures/xx/imag2.jpg (No such file or directory)
09-18 12:32:52.168 5818-5936/x.x W/System.err:     at java.io.FileOutputStream.open0(Native Method)
09-18 12:32:52.168 5818-5936/x.x W/System.err:     at java.io.FileOutputStream.open(FileOutputStream.java:308)
09-18 12:32:52.168 5818-5936/x.x W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:238)
09-18 12:32:52.168 5818-5936/x.x W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:180)
09-18 12:32:52.168 5818-5936/x.x W/System.err:     at x.x.MainActivity.saveImageToExternalStorage(MainActivity.java:776)
09-18 12:32:52.168 5818-5936/x.x W/System.err:     at x.x.MainActivity.access$000(MainActivity.java:62)
09-18 12:32:52.168 5818-5936/x.x W/System.err:     at x.x.MainActivity$1.doInBackground(MainActivity.java:119)
09-18 12:32:52.168 5818-5936/x.x W/System.err:     at x.x.MainActivity$1.doInBackground(MainActivity.java:89)
09-18 12:32:52.168 5818-5936/x.x W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:333)
09-18 12:32:52.168 5818-5936/x.x W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
09-18 12:32:52.168 5818-5936/x.x W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
09-18 12:32:52.168 5818-5936/x.x W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
09-18 12:32:52.168 5818-5936/x.x W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
09-18 12:32:52.168 5818-5936/x.x W/System.err:     at java.lang.Thread.run(Thread.java:764)

For older version emulators or older version smartphones there is no problem. 对于较旧版本的模拟器或较旧版本的智能手机,没有问题。 Images are saved correctly. 图像保存正确。 I did not try with real oreo smartphone but for emulator - oreo it gives this problem. 我没有尝试使用真正的oreo智能手机,而是使用模拟器-oreo出现了此问题。 As a result, how can I solve my problem? 结果,我该如何解决我的问题? What is the main reason of this situation? 这种情况的主要原因是什么? Permissions? 权限? saving image to external storage? 保存图像到外部存储? or creating file - folder? 或创建文件-文件夹?

I hope this will work for you. 希望这对您有用。

Add below lines in your Application Class OnCreate() method. 在应用程序类OnCreate()方法中添加以下行。

       StrictMode.ThreadPolicy policy = new
       StrictMode.ThreadPolicy.Builder().permitAll().build();
       StrictMode.setThreadPolicy(policy);

       StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
       StrictMode.setVmPolicy(builder.build());
       builder.detectFileUriExposure();

and check also permission with READ_EXTERNAL_STORAGE. 并使用READ_EXTERNAL_STORAGE检查权限。

For manually enabling permission in emulator go to Apps and notification -->App permissions--> storage and give permission. 要在模拟器中手动启用权限,请转到应用和通知->应用权限->存储并提供权限。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java.io.FileNotFoundException没有此类文件或目录错误,但目录存在 - java.io.FileNotFoundException No such file or directory error but directory exists java.io.FileNotFoundException:..(无此类文件或目录) - java.io.FileNotFoundException: .. (No such file or directory) java.io.FileNotFoundException:[文件路径](没有这样的文件或目录) - java.io.FileNotFoundException: [filepath] (No such file or directory) java.io.FileNotFoundException(是一个目录) - java.io.FileNotFoundException (Is a directory) java.io.IOException:java.io.FileNotFoundException :(无此类文件或目录) - java.io.IOException: java.io.FileNotFoundException:(No such file or directory) java.io.FileNotFoundException错误 - java.io.FileNotFoundException error 错误:java.io.FileNotFoundException - Error :java.io.FileNotFoundException Linux java没有此类文件或目录,java.io.FileNotFoundException: - Linux java No such file or directory, java.io.FileNotFoundException: Java FileWriter 类 - java.io.FileNotFoundException: * 没有这样的文件或目录 -Ubuntu - Java FileWriter class - java.io.FileNotFoundException: * no such file or directory -Ubuntu java.io.FileNotFoundException(没有这样的文件或目录) - 下载文件 - java.io.FileNotFoundException (No such file or directory) - Download File
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM