Java.io.IOException: 没有这个文件或目录(保存图像)

4
我从设备中选择照片并上传到ftp上。但尽管我已经选好了照片,我还是遇到了“没有这样的文件目录”错误。虽然我已经给应用程序权限,但它没有将其保存到我在应用程序中选择的IMAGE_DIRECTORY中。因此,我会得到这个错误。即使我已经给予权限,为什么它仍未能保存文件呢? 错误行: f.createNewFile(); 错误代码:
W/System.err: java.io.IOException: No such file or directory
        at java.io.UnixFileSystem.createFileExclusively0(Native Method)
        at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:317)
        at java.io.File.createNewFile(File.java:1008)
        at com.example.stechome.ui.hesabim.HesabimFragment.saveImage

片段

public class asdFragment extends Fragment {

    private static final String IMAGE_DIRECTORY = "/asdasd";
    public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1;

    private int GALLERY = 1, CAMERA1 = 2;

 private boolean checkAndRequestPermissions() {
        int permissionACCESS_NETWORK_STATE = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_NETWORK_STATE);
        int permissionWRITE_EXTERNAL_STORAGE = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
        int permissionREAD_EXTERNAL_STORAGE = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.READ_EXTERNAL_STORAGE);
        int permissionCAMERA = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.CAMERA);
        int permissionACCESS_FINE_LOCATION = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION);

        List<String> listPermissionsNeeded = new ArrayList<>();

        if (permissionACCESS_NETWORK_STATE != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(android.Manifest.permission.ACCESS_NETWORK_STATE);
        }

        if (permissionWRITE_EXTERNAL_STORAGE != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }

        if (permissionREAD_EXTERNAL_STORAGE != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(android.Manifest.permission.READ_EXTERNAL_STORAGE);
        }

        if (permissionCAMERA != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(android.Manifest.permission.CAMERA);
        }

        if (permissionACCESS_FINE_LOCATION != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(android.Manifest.permission.ACCESS_FINE_LOCATION);
        }

        if (!listPermissionsNeeded.isEmpty()) {
            ActivityCompat.requestPermissions(getActivity(), listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
            return false;
        }
        return true;
    }

 public String saveImage(Bitmap myBitmap) {
        Random r = new Random();
        int min=100000;
        int maks=1000000;

        int random = r.nextInt((maks-min)+1)+min;


        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        myBitmap.compress(Bitmap.CompressFormat.JPEG,100,bytes);
        File wallpaperDirectory = new File(
                Environment.getExternalStorageDirectory() + IMAGE_DIRECTORY);
        // have the object build the directory structure, if needed.
        if (!wallpaperDirectory.exists()) {
            wallpaperDirectory.mkdirs();
        }

        try {
            File f = new File(wallpaperDirectory, "ProfilFoto"+"foto"+random+".jpg");

            f.createNewFile();

            ////
            ///resmi kaydetmek localde kaydetmek için
            /// sadece galeriden görüntü aldıracağımız için kapatıyoruz.
            ///
            FileOutputStream fo = new FileOutputStream(f);
            fo.write(bytes.toByteArray());
            MediaScannerConnection.scanFile(getActivity(),
                    new String[]{f.getPath()},
                    new String[]{"image/jpeg"}, null);
            fo.close();
            Log.d("TAG", "File Saved::--->" + f.getAbsolutePath());
            //   Toast.makeText(this, f.getAbsolutePath(), Toast.LENGTH_SHORT).show();
            /*UploadVideo async = new UploadVideo(f.getAbsolutePath());
            async.execute();*/
            currentimgPath=f.getAbsolutePath();
            dosyaAd=f.getName();
            SharedPreferences sharedPref = getActivity().getSharedPreferences("sharedPref",Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPref.edit();
            editor.putString("dosyaAdProfil", dosyaAd);
            System.out.println("dosyaAdProfil" + dosyaAd);
            editor.commit();
            return f.getAbsolutePath();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        return "";
    }

private void showPictureDialog(){
       /* AlertDialog.Builder pictureDialog = new AlertDialog.Builder(this);
        pictureDialog.setTitle("İşlem Seçiniz");
        String[] pictureDialogItems = {
                "Galeri'den Seç",
                "Kamera'dan Al" };
        pictureDialog.setItems(pictureDialogItems,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                            case 0:
                                choosePhotoFromGallary();

                                break;
                            case 1:
                                takePhotoFromCamera();
                                break;
                        }
                    }
                });
        pictureDialog.show();*/
        if (!checkAndRequestPermissions()) {
            return;
        }
        AlertDialog.Builder pictureDialog = new AlertDialog.Builder(getActivity());
        pictureDialog.setTitle("İşlem Seçiniz");
        String[] pictureDialogItems = {
                "Galeri'den Seç"};
        pictureDialog.setItems(pictureDialogItems,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                            case 0:
                                choosePhotoFromGallary();
                                break;
                        }
                    }
                });
        pictureDialog.show();
    }

    public void choosePhotoFromGallary() {
        Intent galleryIntent = new Intent(Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

        startActivityForResult(galleryIntent, GALLERY);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == getActivity().RESULT_CANCELED) {
            return;
        }
        if (requestCode == GALLERY) {
            if (data != null) {
                Uri contentURI = data.getData();
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), contentURI);
                    // String path = saveImage(bitmap);
                    //  String pth=contentURI.getPath();

                    imageview.setImageBitmap(bitmap);
                    filept=getRealPathFromURI(contentURI);

                    //Toast.makeText(this, filept, Toast.LENGTH_SHORT).show();
                    saveImage(bitmap);




                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(getActivity(), "İşlem Başarısız!", Toast.LENGTH_SHORT).show();
                }
            }

        } else if (requestCode == CAMERA1) {
            Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
            imageview.setImageBitmap(thumbnail);
            saveImage(thumbnail);
            Toast.makeText(getActivity(), "Görüntü Seçildi!", Toast.LENGTH_SHORT).show();


        }
    }
    public String getRealPathFromURI(Uri contentUri) {

        // can post image
        String [] proj={MediaStore.Images.Media.DATA};
        Cursor cursor = getActivity().managedQuery( contentUri,
                proj, // Which columns to return
                null,       // WHERE clause; which rows to return (all rows)
                null,       // WHERE clause selection arguments (none)
                null); // Order-by clause (ascending by name)
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();

        return cursor.getString(column_index);
    }
    private void takePhotoFromCamera() {
        Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, CAMERA1);
        // dispatchTakePictureIntent();
    }

请提供完整的错误堆栈。 - Jagar
我更新了主题。@Jagar - stakabekor
你是在安卓10上吗? - Andrew
我不明白 @Andrew。 - stakabekor
你在哪个 Android 版本上运行程序,导致出现错误?因为 Android 10 中进行了重大的文件访问更改,你正在进行的文件访问类型在 Android 10 中将无法工作。 - Andrew
是的,我正在使用Android 10,我应该如何编辑?谢谢。@Andrew - stakabekor
3个回答

8

在应用程序标签中添加android:requestLegacyExternalStorage="true"到清单中


1
android:requestLegacyExternalStorage="true" 将在 Android 11 上被忽略。 - Mahmoud Abu Alheja
好的,我需要检查一下,如果没有问题,我会找到一个解决方案并与您分享。 - s.j

5

Android 10对文件访问方式进行了重大更改

有关详细信息,请参见https://developer.android.com/training/data-storage

如果要访问应用程序私有目录以外的文件,则需要使用MediaStore或Storage Access Framework(SAF),请参见https://developer.android.com/training/data-storage/shared

如果要存储照片,则可以使用MediaStore来访问图片,详情请参见https://developer.android.com/training/data-storage/shared/media

虽然暂时可以选择退出Scoped Storage以解决问题(参见https://developer.android.com/training/data-storage/compatibility),但仅适用于Android 11之前。

https://proandroiddev.com/working-with-scoped-storage-8a7e7cafea3上提供了一些更好的示例。


1

当我使用mFileNew.createNewFile();创建新文件时,在Android 10及以上版本中遇到了类似的错误。

因此,在应用程序标签中的清单文件中,对于Android 10,我使用了android:requestLegacyExternalStorage="true"

而对于Android 11,我已更改了文件路径。

Environment.getExternalStorageDirectory().getAbsolutePath()

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接