Получить путь к файлу из внутреннего каталога для захвата фотографий

Я создаю приложение, которое после съемки фотографии загружает ее на сервер (используя путь к файлу, как в учебнике на https://trinitytuts.com/capture-image-upload-server-android/).

Чтобы сделать снимок, я следовал инструкциям на https://developer.android.com/training/camera/photobasics.html.

Пока я снимаю изображение с внешнего хранилища, все работает нормально, но если я использую устройство без SD (например, Nexus), приложение вылетает.

Вы можете помочь мне? Спасибо

РЕДАКТИРОВАТЬ

 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            Log.w("error", "ERROR");
        }
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(this,
                    "com.application.package.fileprovider",//here I put the app pakage
                    photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }

person Carlo    schedule 16.06.2016    source источник
comment
опубликуйте код намерения вашей камеры   -  person Saurabh Vardani    schedule 16.06.2016


Ответы (3)


Используйте это, когда открываете камеру, используя намерение

 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            Log.e("Log Excepton", ex.toString() + "...");
        }
        if (photoFile != null) {
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
            startActivityForResult(takePictureIntent, IMAGE_CAPTURE);
        }

    }

Используйте это в результате активности

if (requestCode == IMAGE_CAPTURE) {
   Log.e("Log mCurrentPhotoPath", mCurrentPhotoPath + "...");
   iv_uploadimage.setImageURI(Uri.parse(mCurrentPhotoPath));
   selectedImagePath1 = mCurrentPhotoPath.substring(5);
   Log.e("Log Optimized path", selectedImagePath1 + "...");}

Добавить разрешение на запись файла

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

Это для создания файла

 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();
        return image;
    }
person Smit.Satodia    schedule 16.06.2016

Я думаю, проблема в коде createImageFile.

Попробуйте эту обновленную функцию

/**
 * Function for create file in SD card or internal storage depending on SD card availability
 * @return : file in internal / external storage
 */
private File createImageFile() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        // get path of pictures folder from SD card
        // give any path of your choice
        return new File(Environment.DIRECTORY_PICTURES);
    }else {
        ContextWrapper cw = new ContextWrapper(getApplicationContext());
        // create folder of your app or get already exists folder
        // ie path from internal storage
        return cw.getDir("media", Context.MODE_PRIVATE);
    }
}

Не забудьте добавить permission

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
person Pramod Waghmare    schedule 16.06.2016

После захвата изображения вы получите результат в формате ActivtyResult.

if (requestCode == CAMERA_REQUEST) {  
     Bitmap photo = (Bitmap) data.getExtras().get("data");
     ...
} 
person Gunners.Ranju    schedule 16.06.2016