繁体   English   中英

找不到文件异常:java.io.FileNotFoundException:/storage/emulated/0/image.jpg:打开失败:ENOENT(没有此类文件或目录)

[英]File not found exception:java.io.FileNotFoundException: /storage/emulated/0/image.jpg: open failed: ENOENT (No such file or directory)

找不到文件异常:java.io.FileNotFoundException:/storage/emulated/0/FolderName/subFolderName/my_image.jpg:打开失败:ENOENT(没有此类文件或目录)

我仅在某些手机中获得例外

保存从相机捕获的图像时,出现文件未找到异常。 这是我的代码

我正在捕获图像:

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
                        startActivityForResult(takePictureIntent, 0);
                    }

在onActivityResult中:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 0)
    {
        if(data!=null)
        {
            Bundle extras = data.getExtras();
            if (extras != null)
            if (img1) {
                imgAdd1.setVisibility(View.GONE);
                Bitmap thumbnail_1 = (Bitmap) extras.get("data");
                Bitmap resized = scaleBitmap(thumbnail_1) ;
                selectedImage1 = data.getData() ;
                //Bitmap thumbnail_1 = (Bitmap) data.getExtras().get("data");
                image1.setVisibility(View.VISIBLE);
                image1.setImageBitmap(thumbnail_1);
                imageTag = 1 ;
                saveImage(resized, (int) System.currentTimeMillis());
                img1 = false ;
                imgDelete1.setVisibility(View.VISIBLE);
            }
}}

我保存图像的功能是:

public void saveImage(Bitmap bitmap, int i){
    try {

        String stored = null;

        File sdCard = Environment.getExternalStorageDirectory();
        File file = new File(sdCard, "/GMC/Images"
                + File.separator + user_id + "_" + imageTag + ".jpg");

        if (file.exists()) {
            file.delete();
        }



        if (isWriteStorageAllowed()) {
            if ( isReadStorageAllowed())
            //file.createNewFile();
            try {

                FileOutputStream out = new FileOutputStream(file);//getting exception at this line
                bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
                out.flush();
                out.close();
                stored = "success";
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (imageTag == 1) {
                selectedImagePath1 = Environment.getExternalStorageDirectory() + "/GMC/Images"
                        + File.separator + user_id + "_" + imageTag + ".jpg";
            } 
        }
        else {
            requestWriteStoragePermission();
            requestStoragePermission();
        }

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

已经在清单中添加了权限,例如

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

还检查了运行时权限:

//We are calling this method to check the permission status
private boolean isReadStorageAllowed() {
    //Getting the permission status
    int result = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);

    //If permission is granted returning true
    if (result == PackageManager.PERMISSION_GRANTED)
        return true;
    else {
        //If permission is not granted returning false
        return false;}
}

private boolean isWriteStorageAllowed() {
    //Getting the permission status
    int result = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    //If permission is granted returning true
    if (result == PackageManager.PERMISSION_GRANTED)
        return true;
    else {
        //If permission is not granted returning false
        return false;}
}

//Requesting permission
private void requestStoragePermission(){

    if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.READ_EXTERNAL_STORAGE)){
        //If the user has denied the permission previously your code will come to this block
        //Here you can explain why you need this permission
        //Explain here why you need this permission
    }

    //And finally ask for the permission
    ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},PERMISSION_READ_EXTERNAL_STORAGE);
}

//Requesting permission
private void requestWriteStoragePermission(){

    if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.WRITE_EXTERNAL_STORAGE)){
        //If the user has denied the permission previously your code will come to this block
        //Here you can explain why you need this permission
        //Explain here why you need this permission
    }

    //And finally ask for the permission
    ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},PERMISSION_WRITE_EXTERNAL_STORAGE);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    {
        switch (requestCode){
            case PERMISSION_READ_EXTERNAL_STORAGE :
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    Toast.makeText(context , "Read Permission granted",Toast.LENGTH_SHORT).show();
                }
                else {
                    Toast.makeText(context , "Read Permission Denied" ,Toast.LENGTH_SHORT).show();
                }
                return;
            case  PERMISSION_WRITE_EXTERNAL_STORAGE :
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    Toast.makeText(context , "Write Permission granted" ,Toast.LENGTH_SHORT).show();
                }
                else {
                    Toast.makeText(context , "write Permission Denied",Toast.LENGTH_SHORT).show();
                }
                return;
        }

    }
}

检查链接java.io.FileNotFoundException:/storage/emulated/0/saved_images/grub.jpg:打开失败:ENOENT(没有这样的文件或目录)

我在两个不同的电话上测试了代码,一个是lenovo(棉花糖),另一个是samsung(棉花糖),但是它给三星带来了错误,而在lenovo上可以正常使用。

会有什么问题? 请帮忙

尝试在清单文件中添加largeheap=true 。联想手机无法获取大图像,而三星手机可以从图库相机等获取大图像。

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM