通过保存foto找不到Android文件

时间:2016-08-22 07:01:39

标签: android filenotfoundexception

我写了一些代码来拍照并将其保存在外部存储器上。如果我运行应用程序,并拍照,我得到文件未找到例外。

这是我的代码:

public class CameraActivity extends BaseActivity {

    //variables for navigation drawer
    private String[] navMenuTitles;
    private TypedArray navMenuIcons;

    //request code
    private static final int ACTIVITY_START_CAMERA_APP = 1777;

    //ImageView for the thumbnail
    private ImageView mPhotoCapturedImageView;

    //File for folder
    private File folder;

    //variable for timestamp
    String timeStamp = "";

    //Requestcode for external Storage Permission
    final int REQ_CODE_EXTERNAL_STORAGE_PERMISSION = 42;    

    //FloatAction Button to save the picture
    private FloatingActionButton save;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);    

        /*
         * Initialize nav draw items
         */

        //load title from String.xml
        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

        //load icons from String.xml
        navMenuIcons = getResources().obtainTypedArray(R.array.nav_drawer_icons);

        //set title and icons
        set(navMenuTitles, navMenuIcons);

        //initialize ImageView
        mPhotoCapturedImageView = (ImageView) findViewById(R.id.imgViewThumbNail);

        //creat new intent for the camera app
    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");

    //creat and set a timestamp
    timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());

     //check if permission granted
       if (ActivityCompat.checkSelfPermission(CameraActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
               == PackageManager.PERMISSION_GRANTED) {
           if (folder == null) {
               createFolder();
           }
       } else {
           ActivityCompat.requestPermissions(CameraActivity.this, new String[]
                   {Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQ_CODE_EXTERNAL_STORAGE_PERMISSION);
       }    

     /*
    //create a file with timestamp as title and save it in the folder
    File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
    File.separator + "MyIdea" + File.separator + "IdeaGallery" + File.separator +
    "IMG_" + timeStamp + ".jpg"); */
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(folder));
    //start the camera app
    startActivityForResult(intent, ACTIVITY_START_CAMERA_APP);
}

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        //Check that request code matches ours:
        if (requestCode == ACTIVITY_START_CAMERA_APP)
        {
                File foto = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
                        "/Pictures/", "MyIdea/IdeaGalery/" +
                        "IMG_" + timeStamp + ".jpg");
                Bitmap bitmap = decodeSampledBitmapFromFile(foto.getPath(), 1000, 700);
                mPhotoCapturedImageView.setImageBitmap(bitmap);
                MediaScannerConnection.scanFile(CameraActivity.this, new String[]{foto.getPath()}, new String[]{"image/jpeg"}, null);

            //Get our saved file into a bitmap object:
            //File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +File.separator + "MyIdea" + File.separator + "IdeaGallery" + File.separator + "IMG_" + timeStamp + ".jpg");
            //Bitmap photoCapturedBitmap = BitmapFactory.decodeFile(mImageFileLocation);
        }
    }

    public static Bitmap decodeSampledBitmapFromFile(String path, int reqWidth, int reqHeight)
    { // BEST QUALITY MATCH

        //First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, options);

        // Calculate inSampleSize, Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        int inSampleSize = 1;

        if (height > reqHeight)
        {
            inSampleSize = Math.round((float)height / (float)reqHeight);
        }
        int expectedWidth = width / inSampleSize;

        if (expectedWidth > reqWidth)
        {
            inSampleSize = Math.round((float)width / (float)reqWidth);
        }

        options.inSampleSize = inSampleSize;

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;    
        return BitmapFactory.decodeFile(path, options);
    }

    private void createFolder() {

        folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/", "MyIdea/IdeaGalery/" +
            "IMG_" + timeStamp + ".jpg");
         folder.mkdir();
         Toast.makeText(getApplicationContext(), "Folder created", Toast.LENGTH_LONG).show();

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == REQ_CODE_EXTERNAL_STORAGE_PERMISSION && grantResults.length > 0 &&
                grantResults [0] == PackageManager.PERMISSION_GRANTED) {
            createFolder();
        }
    }
}

Android Manifest的权限已设置为als

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

请问有人可以帮我找一下这个错误吗?

2 个答案:

答案 0 :(得分:0)

我清理了我的代码,希望你能更好地理解它。首先我检查,如果文件夹存在,如果没有,我创建它。然后我为图像创建一个文件。然后我从图像中创建一个Uri并将其设置为意图的putExtra方法。

在活动结果上,我从数据中读取uri并将其包装成字符串。

这是我的新代码:

//check if imageFolder already exist
    if (imageFolder == null) {
        //create folder if don't exist
        imageFolder  = new File(Environment.getExternalStorageDirectory(), "MyIdea/IdeaGallery/");
        imageFolder.mkdir();
    }

    //create imageFile
    image = new File(imageFolder, "IMG_" + timeStamp + ".jpg");

    //get the uri of the imageFile
    Uri uriSavedImage = Uri.fromFile(image);

    //put uri path of the image to the intent
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
    //start the camera app
    startActivityForResult(intent, ACTIVITY_START_CAMERA_APP);
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    //Check that request code matches ours:
    if (requestCode == ACTIVITY_START_CAMERA_APP)
    {
        if (resultCode == RESULT_OK) {
            //Get our saved file into a bitmap object:
            Bitmap bitmap = decodeSampledBitmapFromFile(String.valueOf(data.getData()), 1000, 700);
            mPhotoCapturedImageView.setImageBitmap(bitmap);
            MediaScannerConnection.scanFile(CameraActivity.this, new String[]{image.getPath()},
                    new String[]{"image/jpeg"}, null);
        }
    }
}

如果我查看Android监视器,我找不到FileNoTFound异常。但如果我检查我的设备,我找不到任何文件夹或图像。 此消息显示在Android监视器上:

  

08-22 12:41:08.302 17152-17196 / com.example.dudi.myidea I / Adreno-EGL :: QUALCOMM Build:10/21 / 15,369a2ea,I96aee987eb   08-22 12:41:08.303 17152-17196 / com.example.dudi.myidea I / OpenGLRenderer:初始化的EGL,版本1.4   08-22 12:41:08.827 17152-17189 / com.example.dudi.myidea W /设置:设置airplane_mode_on已从android.provider.Settings.System移至android.provider.Settings.Global,返回只读值。   08-22 12:41:08.882 17152-17152 / com.example.dudi.myidea I / Choreographer:跳过37帧!应用程序可能在其主线程上做了太多工作。   08-22 12:41:08.906 17152-17196 / com.example.dudi.myidea V / RenderScript:0xa00bc000启动线程,CPU 4

答案 1 :(得分:0)

最后我看了Android Developer Tutorial并改变了我的代码,就像教程中的示例一样。现在它工作正常。这是我的工作代码:

public class CameraActivity extends BaseActivity {

//variables for navigation drawer
private String[] navMenuTitles;
private TypedArray navMenuIcons;

//request code
private static final int ACTIVITY_START_CAMERA_APP = 1777;

//ImageView for the thumbnail
private ImageView mPhotoCapturedImageView;

//variable for timestamp
//String timeStamp = "";

private static final int MEDIA_TYPE_IMAGE = 1;
private Uri fileUri;

//File for folder
//private File imageFolder;

//File for image;
//private File image;


//FloatAction Button to save the picture
private FloatingActionButton save;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_camera);


    /*
     * Initialize nav draw items
     */

    //load title from String.xml
    navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

    //load icons from String.xml
    navMenuIcons = getResources().obtainTypedArray(R.array.nav_drawer_icons);

    //set title and icons
    set(navMenuTitles, navMenuIcons);

    //initialize ImageView
    mPhotoCapturedImageView = (ImageView) findViewById(R.id.imgViewThumbNail);

    //initialize Camera Intent
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    //set file uri
    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);

    //put Extra for onActivityResult
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

    //start camera app
    startActivityForResult(intent, ACTIVITY_START_CAMERA_APP);

}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    //Check that request code matches ours
    if (requestCode == ACTIVITY_START_CAMERA_APP)
    {
        if (resultCode == RESULT_OK) {
            //Get our saved file into a bitmap object:
            Bitmap bitmap = decodeSampledBitmapFromFile(fileUri.getPath(), 1000, 700);
            mPhotoCapturedImageView.setImageBitmap(bitmap);
            MediaScannerConnection.scanFile(CameraActivity.this, new String[]{fileUri.getPath()},
                    new String[]{"image/jpeg"}, null);
        } else if (requestCode == RESULT_CANCELED) {
            Toast.makeText(this, "Error, user cancelled the image capture", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this, "Imagecapture failed.", Toast.LENGTH_LONG).show();
        }
    }
}

/* Create a file Uri for saving an image */
private static Uri getOutputMediaFileUri (int type) {
    return Uri.fromFile(getOutputMediaFile(type));
}

/* Create a file to save an image */
private static File getOutputMediaFile(int type) {

    //check if SD-Card is mounted
    Boolean isMounted = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);

    File mediaStorageDir = null;

    if (isMounted) {
        //create storage directory if does not exist
        mediaStorageDir = new File (Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), "IdeaGallery");

        if (! mediaStorageDir.exists()) {
            if (! mediaStorageDir.mkdir()) {
                Log.d("IdeaGallery", "failed to create");
                return null;
            }
        }

    } else {
        Log.d("IdeaGallery", "failed to create");
    }

    //create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;

    if (type == MEDIA_TYPE_IMAGE) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp
        + ".jpg" );
    } else {
        return null;
    }

    return mediaFile;
}

public static Bitmap decodeSampledBitmapFromFile(String path, int reqWidth, int reqHeight)
{ // BEST QUALITY MATCH

    //First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(path, options);

    // Calculate inSampleSize, Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    options.inPreferredConfig = Bitmap.Config.RGB_565;
    int inSampleSize = 1;

    if (height > reqHeight)
    {
        inSampleSize = Math.round((float)height / (float)reqHeight);
    }
    int expectedWidth = width / inSampleSize;

    if (expectedWidth > reqWidth)
    {
        inSampleSize = Math.round((float)width / (float)reqWidth);
    }

    options.inSampleSize = inSampleSize;

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;

    return BitmapFactory.decodeFile(path, options);
}

}