2015-07-20 62 views
2

我试图显示通过摄像机意图捕获的图片(触发内置相机应用程序),它存储在external SD-cardBitmapFactory.decodeFile(mCurrentPhotoPath,bmOptions)返回FileNotFoundException

的文件路径和文件名被存储在字符串变量'mCurrentPhotoPath'

我核实,拍摄的图像存储在使用ES File Explorer应用由'mCurrentPhotoPath'指定的位置,但BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions)总是返回FileNotFoundException。这里是我的代码来存储拍摄的图像:

private void addPicToGallery() { 

    File f = new File(mCurrentPhotoPath); 
    //for debug purpose only 
    Log.i(MYTAG, "value of mCurrentPhotoPath in addPicToGallery: " +mCurrentPhotoPath); 
    Log.i(MYTAG, "value of f in addPicToGallery: " +f); 

    Uri contentUri = Uri.fromFile(f); 

    //for debug only 
    Log.i(MYTAG, "value of contentUri in addPicToGallery: " +contentUri); 

    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
    mediaScanIntent.setData(contentUri); 
    sendBroadcast(mediaScanIntent); 

} 

代码为ImageView显示缩放图像解码:

private void setFullImageFromFilePath() { 

    Log.i(MYTAG, "Entered setFullImageFromFilePath method"); 

    // Get the dimensions of the View 
    int targetW = mImageView.getWidth(); 
    int targetH = mImageView.getHeight(); 

    Log.i(MYTAG,"var targetW in setFullImageFromFilePath is:" +targetW); 
    Log.i(MYTAG,"the targetH in setFullImageFromFilePath is:" + targetH); 


    // Get the dimensions of the bitmap 
    BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
    bmOptions.inJustDecodeBounds = true; 

    Log.i(MYTAG, "the mCurrentPhotoPath in setFullImageFromFilePath is:" + mCurrentPhotoPath); 


    BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); 
    int photoW= bmOptions.outWidth; 
    int photoH = bmOptions.outHeight; 

    //Determine how much to scale down the image 
    int scaleFactor = Math.min(photoW/targetW, photoH/targetH); 

    //Decode the image file into a Bitmap sized to fill the view 
    bmOptions.inJustDecodeBounds = false; 
    bmOptions.inSampleSize = scaleFactor; 
    bmOptions.inPurgeable = true; 

    Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); 
    mImageView.setImageBitmap(bitmap) ; 

    } 

然而,BitmapFactory.decodeFile无法找到存储在该位置的文件mCurrentPhotoPath导致FileNotFoundException

以下是logcat的输出:

>07-20 21:28:11.897 32301-32301/org.assignment.lab.Pic I/Lab-Intents﹕ the mCurrentPhotoPath in setFullImageFromFilePath is:file:/storage/sdcard0/Pictures/JPEG_20150720_212749_-232171051.jpg 
07-20 21:28:11.907 32301-32301/org.assignment.lab.Pic E/BitmapFactory﹕ Unable to decode stream: java.io.FileNotFoundException: /file:/storage/sdcard0/Pictures/JPEG_20150720_212749_-232171051.jpg: open failed: ENOENT (No such file or directory) 
07-20 21:28:11.937 32301-32301/org.assignment.lab.Pic D/AndroidRuntime﹕ Shutting down VM 
07-20 21:28:11.937 32301-32301/org.assignment.lab.Pic W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x418d0ce0) 
07-20 21:28:12.047 32301-32301/org.assignment.lab.Pic E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: org.assignment.lab.Pic, PID: 32301 
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {org.assignment.lab.mydailyselfie/org.coursera.assignment.lab.Pic.MainActivity}: java.lang.ArithmeticException: divide by zero 

我在Android Kitkat 4.4.4电话调试该应用程序。

请建议在BitmapFactory.decodeFile方法中需要进行哪些修改,以便它可以存储文件并将其显示在ImageView中。

在此先感谢。

回答

8

mCurrentPhotoPath有一个前缀 “file:”。

由于其中的系统试图指/file:/storage/sdcard0/etc...指向没有安装的磁盘。

删除,并与

mCurrentPhotoPath = "/storage/sdcard0/Pictures/JPEG_20150720_212749_-232171051.jpg"; 

再试或者,如果您mCurrentPhotoPath永远有前缀,用它

mCurrentPhotoPath = mCurrentPhotoPath.replace("file:", ""); 

希望这有助于之前做到这一点! :)

+0

非常感谢。删除“file:”前缀后,问题就解决了。顺便说一句,这段代码是直接从developer.android.com。现在我想知道这个前缀在老版android版本中是否有必要。再次感谢。 – Niraj73

+0

棒极了!它用替换“文件” –

相关问题