簡體   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