2016-08-22 2 views
0

Я написал код, чтобы сделать снимок и сохранить его на внешнем хранилище. Если я запустил приложение и сделаю снимок, я получаю исключение File Not Found Exception.Android-файл не найден Исключение, сохраняя фотографию

Вот мой код:

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" /> 

Может кто-нибудь помочь, пожалуйста, помогите мне найти ошибку?

+0

Почему вы используете запятую между путь к файлу? – Chordin4tion

+0

Хороший вопрос: D. Я установил ее в 'папку = новый файл (Environment.getExternalStorageDirectory() getAbsolutePath() + "/ Фотографии/MyIdea/IdeaGalery /" + "IMG_" + TIMESTAMP + ".jpg".);' Но Файл не найден. Исключение все еще существует. – dudi

+0

Пожалуйста, опубликуйте полное сообщение .. И сообщите, какое заявление вызывает это сообщение. – greenapps

ответ

0

Я очистил свой код, и я надеюсь, что вы сможете его лучше понять. Сначала я проверяю, существует ли папка, если нет, я ее создаю. Затем я создаю файл для изображения. Затем я создаю Uri из изображения и устанавливаю его для putExtra Method в соответствии с намерением.

В результате операции я считываю 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. Но если я проверю свое устройство, я не могу найти никаких папок или изображений на нем. Это сообщения IST показывает на Android Monitor:

08-22 12: 41: 08,302 17152-17196/com.example.dudi.myidea I/Adreno-EGL:: QUALCOMM Телосложение: 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/Хореограф: пропущено 37 кадров! Приложение может делать слишком много работы над своей основной нитью. 08-22 12: 41: 08,906 17152-17196/com.example.dudi.myidea В/Renderscript: 0xa00bc000 Запуск нити (ы), ЦП 4

+0

Хорошо с выражением else на resultCode, я узнал, что resultCode возвращает 0. – dudi

0

Finaly Я смотрел на 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); 
} 

}

Смежные вопросы