2014-01-29 28 views
3

在這一行:BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);它引發了一個fileNotFound異常。這是Logcat:來自Android網站的相機意圖不工作 - Android

01-29 23:56:12.296: E/BitmapFactory(30046): Unable to decode stream: java.io.FileNotFoundException: /file:/storage/emulated/0/Pictures/JPEG_20140129_235544_1090805596.jpg: open failed: ENOENT (No such file or directory) 

這是在setPic();但是在啓動intent時文件被保存並添加到圖庫中,所以在onActivityResult之前,它應該在那裏。你有沒有看到任何問題?此代碼是從Android devloper網站http://developer.android.com/training/camera/photobasics.html

static final int REQUEST_TAKE_PHOTO = 1001; 

       private void dispatchTakePictureIntent() { 
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
        // Ensure that there's a camera activity to handle the intent 
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
         // Create the File where the photo should go 
         File photoFile = null; 
         try { 
          photoFile = createImageFile(); 
         } catch (IOException ex) { 
          // Error occurred while creating the File 
         } 
         // Continue only if the File was successfully created 
         if (photoFile != null) { 
          takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, 
            Uri.fromFile(photoFile)); 
          startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
         } 
        } 
       } 

       private void galleryAddPic() { 
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
        File f = new File(mCurrentPhotoPath); 
        Uri contentUri = Uri.fromFile(f); 
        mediaScanIntent.setData(contentUri); 
        this.sendBroadcast(mediaScanIntent); 
       } 

編輯這一個代碼塊是從onActivityResult採取:

else if ((requestCode == REQUEST_TAKE_PHOTO) && (resultcode == -1)){ 
            // Uri selectedImage = imageUri; 
               mProfilePicPath = mCurrentPhotoPath; 

               mPortraitPhoto = setPic(); 
               TextView tv = (TextView) findViewById(id.ProfilePicText); 
           tv.setText(mProfilePicPath); 
              //} 
            // } 
          } 
        }catch(Exception ex){ 
          Log.d("shkdghrfb", ex.toString()); 
        } 
      } 

       String mCurrentPhotoPath; 

       private Bitmap setPic() { 
        // Get the dimensions of the View 

        // Get the dimensions of the bitmap 
        BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
        bmOptions.inJustDecodeBounds = true; 
        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 = 5; 
        bmOptions.inPurgeable = true; 

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

       private File createImageFile() throws IOException { 
        // Create an image file name 
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
        String imageFileName = "JPEG_" + timeStamp + "_"; 
        File storageDir = Environment.getExternalStoragePublicDirectory(
          Environment.DIRECTORY_PICTURES); 
        File image = File.createTempFile(
         imageFileName, /* prefix */ 
         ".jpg",   /* suffix */ 
         storageDir  /* directory */ 
       ); 

        // Save a file: path for use with ACTION_VIEW intents 
        mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
        galleryAddPic(); 
        return image; 
       } 

清單權限我已經加入:

<uses-permission android:name="android.permission.CAMERA" android:required="false" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

這是你讓這個早晨相機的第三個問題,也許你應該試着去思考越來越少問....至少如果你想學習的課程。 – nsL

+0

您是否在清單文件中添加了寫入和讀取外部存儲權限? – Piyush

+0

@nsL我今天很多小時都在嘗試。在這種方式之前,我嘗試了許多不同的方式。這個問題一直讓我煩惱了一個星期。我做了一個不同的方式,我的另一部手機,但不是一些手機,所以不得不改變它。 – user3164083

回答

5

我想文件名中有「文件」不是正確的文件名,因此將其刪除。將mCurrentPhotoPath = "file:" + image.getAbsolutePath();更改爲mCurrentPhotoPath = image.getAbsolutePath();。如果這只是一個黑客修復,請讓我知道。這對所有兼容的設備都很重要。